XFontName.c revision f80a6dcd
1f80a6dcdSmrg/* $XFree86: xc/programs/xditview/XFontName.c,v 1.2 2001/08/01 00:45:03 tsi Exp $ */
2f80a6dcdSmrg/*
3f80a6dcdSmrg * XFontName.c
4f80a6dcdSmrg *
5f80a6dcdSmrg * build/parse X Font name strings
6f80a6dcdSmrg */
7f80a6dcdSmrg
8f80a6dcdSmrg# include	<X11/Xlib.h>
9f80a6dcdSmrg# include	<X11/Intrinsic.h>
10f80a6dcdSmrg# include	"XFontName.h"
11f80a6dcdSmrg#include	<ctype.h>
12f80a6dcdSmrg
13f80a6dcdSmrgstatic char *
14f80a6dcdSmrgextractStringField (
15f80a6dcdSmrg	char		*name,
16f80a6dcdSmrg	char		*buffer,
17f80a6dcdSmrg	int		size,
18f80a6dcdSmrg	unsigned int	*attrp,
19f80a6dcdSmrg	unsigned int	bit)
20f80a6dcdSmrg{
21f80a6dcdSmrg	char	*buf = buffer;
22f80a6dcdSmrg
23f80a6dcdSmrg	if (!*name)
24f80a6dcdSmrg		return 0;
25f80a6dcdSmrg	while (*name && *name != '-' && size > 0) {
26f80a6dcdSmrg		*buf++ = *name++;
27f80a6dcdSmrg		--size;
28f80a6dcdSmrg	}
29f80a6dcdSmrg	if (size <= 0)
30f80a6dcdSmrg		return 0;
31f80a6dcdSmrg	*buf = '\0';
32f80a6dcdSmrg	if (buffer[0] != '*' || buffer[1] != '\0')
33f80a6dcdSmrg		*attrp |= bit;
34f80a6dcdSmrg	if (*name == '-')
35f80a6dcdSmrg		return name+1;
36f80a6dcdSmrg	return name;
37f80a6dcdSmrg}
38f80a6dcdSmrg
39f80a6dcdSmrgstatic char *
40f80a6dcdSmrgextractUnsignedField (
41f80a6dcdSmrg	char		*name,
42f80a6dcdSmrg	unsigned int	*result,
43f80a6dcdSmrg	unsigned int	*attrp,
44f80a6dcdSmrg	unsigned int	bit)
45f80a6dcdSmrg{
46f80a6dcdSmrg	char		buf[256];
47f80a6dcdSmrg	char		*c;
48f80a6dcdSmrg	unsigned int	i;
49f80a6dcdSmrg
50f80a6dcdSmrg	name = extractStringField (name, buf, sizeof (buf), attrp, bit);
51f80a6dcdSmrg	if (!name)
52f80a6dcdSmrg		return 0;
53f80a6dcdSmrg	if (!(*attrp & bit))
54f80a6dcdSmrg		return name;
55f80a6dcdSmrg	i = 0;
56f80a6dcdSmrg	for (c = buf; *c; c++) {
57f80a6dcdSmrg		if (!isdigit (*c))
58f80a6dcdSmrg			return 0;
59f80a6dcdSmrg		i = i * 10 + (*c - '0');
60f80a6dcdSmrg	}
61f80a6dcdSmrg	*result = i;
62f80a6dcdSmrg	return name;
63f80a6dcdSmrg}
64f80a6dcdSmrg
65f80a6dcdSmrgBool
66f80a6dcdSmrgXParseFontName (fontNameString, fontName, fontNameAttributes)
67f80a6dcdSmrg	XFontNameString	fontNameString;
68f80a6dcdSmrg	XFontName	*fontName;
69f80a6dcdSmrg	unsigned int	*fontNameAttributes;
70f80a6dcdSmrg{
71f80a6dcdSmrg	char		*name = fontNameString;
72f80a6dcdSmrg	XFontName	temp;
73f80a6dcdSmrg	unsigned int	attributes = 0;
74f80a6dcdSmrg
75f80a6dcdSmrg#define GetString(field,bit)\
76f80a6dcdSmrg	if (!(name = extractStringField \
77f80a6dcdSmrg		(name, temp.field, sizeof (temp.field),\
78f80a6dcdSmrg		&attributes, bit))) \
79f80a6dcdSmrg		return False;
80f80a6dcdSmrg
81f80a6dcdSmrg#define GetUnsigned(field,bit)\
82f80a6dcdSmrg	if (!(name = extractUnsignedField \
83f80a6dcdSmrg		(name, &temp.field, \
84f80a6dcdSmrg		&attributes, bit))) \
85f80a6dcdSmrg		return False;
86f80a6dcdSmrg
87f80a6dcdSmrg	GetString (Registry, FontNameRegistry)
88f80a6dcdSmrg	GetString (Foundry, FontNameFoundry)
89f80a6dcdSmrg	GetString (FamilyName, FontNameFamilyName)
90f80a6dcdSmrg	GetString (WeightName, FontNameWeightName)
91f80a6dcdSmrg	GetString (Slant, FontNameSlant)
92f80a6dcdSmrg	GetString (SetwidthName, FontNameSetwidthName)
93f80a6dcdSmrg	GetString (AddStyleName, FontNameAddStyleName)
94f80a6dcdSmrg	GetUnsigned (PixelSize, FontNamePixelSize)
95f80a6dcdSmrg	GetUnsigned (PointSize, FontNamePointSize)
96f80a6dcdSmrg	GetUnsigned (ResolutionX, FontNameResolutionX)
97f80a6dcdSmrg	GetUnsigned (ResolutionY, FontNameResolutionY)
98f80a6dcdSmrg	GetString (Spacing, FontNameSpacing)
99f80a6dcdSmrg	GetUnsigned (AverageWidth, FontNameAverageWidth)
100f80a6dcdSmrg	GetString (CharSetRegistry, FontNameCharSetRegistry)
101f80a6dcdSmrg	if (!*name) {
102f80a6dcdSmrg		temp.CharSetEncoding[0] = '\0';
103f80a6dcdSmrg		attributes |= FontNameCharSetEncoding;
104f80a6dcdSmrg	} else {
105f80a6dcdSmrg		GetString (CharSetEncoding, FontNameCharSetEncoding)
106f80a6dcdSmrg	}
107f80a6dcdSmrg	*fontName = temp;
108f80a6dcdSmrg	*fontNameAttributes = attributes;
109f80a6dcdSmrg	return True;
110f80a6dcdSmrg}
111f80a6dcdSmrg
112f80a6dcdSmrgstatic char *
113f80a6dcdSmrgutoa (
114f80a6dcdSmrg	unsigned int	u,
115f80a6dcdSmrg	char		*s,
116f80a6dcdSmrg	int		size)
117f80a6dcdSmrg{
118f80a6dcdSmrg	char	*t;
119f80a6dcdSmrg
120f80a6dcdSmrg	t = s + size;
121f80a6dcdSmrg	*--t = '\0';
122f80a6dcdSmrg	do
123f80a6dcdSmrg		*--t = (u % 10) + '0';
124f80a6dcdSmrg	while (u /= 10);
125f80a6dcdSmrg	return t;
126f80a6dcdSmrg}
127f80a6dcdSmrg
128f80a6dcdSmrgBool
129f80a6dcdSmrgXFormatFontName (fontName, fontNameAttributes, fontNameString)
130f80a6dcdSmrg	XFontName	*fontName;
131f80a6dcdSmrg	unsigned int	fontNameAttributes;
132f80a6dcdSmrg	XFontNameString	fontNameString;
133f80a6dcdSmrg{
134f80a6dcdSmrg	XFontNameString	tmp;
135f80a6dcdSmrg	char		*name = tmp, *f;
136f80a6dcdSmrg	int		left = sizeof (tmp) - 1;
137f80a6dcdSmrg	char		number[32];
138f80a6dcdSmrg
139f80a6dcdSmrg#define PutString(field, bit)\
140f80a6dcdSmrg	f = (fontNameAttributes & bit) ? \
141f80a6dcdSmrg		fontName->field \
142f80a6dcdSmrg		: "*"; \
143f80a6dcdSmrg	if ((left -= strlen (f)) < 0) \
144f80a6dcdSmrg		return False; \
145f80a6dcdSmrg	while (*f) \
146f80a6dcdSmrg		if ((*name++ = *f++) == '-') \
147f80a6dcdSmrg			return False;
148f80a6dcdSmrg#define PutHyphen()\
149f80a6dcdSmrg	if (--left < 0) \
150f80a6dcdSmrg		return False; \
151f80a6dcdSmrg	*name++ = '-';
152f80a6dcdSmrg
153f80a6dcdSmrg#define PutUnsigned(field, bit) \
154f80a6dcdSmrg	f = (fontNameAttributes & bit) ? \
155f80a6dcdSmrg		utoa (fontName->field, number, sizeof (number)) \
156f80a6dcdSmrg		: "*"; \
157f80a6dcdSmrg	if ((left -= strlen (f)) < 0) \
158f80a6dcdSmrg		return False; \
159f80a6dcdSmrg	while (*f) \
160f80a6dcdSmrg		*name++ = *f++;
161f80a6dcdSmrg
162f80a6dcdSmrg	PutString (Registry, FontNameRegistry)
163f80a6dcdSmrg	PutHyphen ();
164f80a6dcdSmrg	PutString (Foundry, FontNameFoundry)
165f80a6dcdSmrg	PutHyphen ();
166f80a6dcdSmrg	PutString (FamilyName, FontNameFamilyName)
167f80a6dcdSmrg	PutHyphen ();
168f80a6dcdSmrg	PutString (WeightName, FontNameWeightName)
169f80a6dcdSmrg	PutHyphen ();
170f80a6dcdSmrg	PutString (Slant, FontNameSlant)
171f80a6dcdSmrg	PutHyphen ();
172f80a6dcdSmrg	PutString (SetwidthName, FontNameSetwidthName)
173f80a6dcdSmrg	PutHyphen ();
174f80a6dcdSmrg	PutString (AddStyleName, FontNameAddStyleName)
175f80a6dcdSmrg	PutHyphen ();
176f80a6dcdSmrg	PutUnsigned (PixelSize, FontNamePixelSize)
177f80a6dcdSmrg	PutHyphen ();
178f80a6dcdSmrg	PutUnsigned (PointSize, FontNamePointSize)
179f80a6dcdSmrg	PutHyphen ();
180f80a6dcdSmrg	PutUnsigned (ResolutionX, FontNameResolutionX)
181f80a6dcdSmrg	PutHyphen ();
182f80a6dcdSmrg	PutUnsigned (ResolutionY, FontNameResolutionY)
183f80a6dcdSmrg	PutHyphen ();
184f80a6dcdSmrg	PutString (Spacing, FontNameSpacing)
185f80a6dcdSmrg	PutHyphen ();
186f80a6dcdSmrg	PutUnsigned (AverageWidth, FontNameAverageWidth)
187f80a6dcdSmrg	PutHyphen ();
188f80a6dcdSmrg	PutString (CharSetRegistry, FontNameCharSetRegistry)
189f80a6dcdSmrg	PutHyphen ();
190f80a6dcdSmrg	PutString (CharSetEncoding, FontNameCharSetEncoding)
191f80a6dcdSmrg	*name = '\0';
192f80a6dcdSmrg	strcpy (fontNameString, tmp);
193f80a6dcdSmrg	return True;
194f80a6dcdSmrg}
195f80a6dcdSmrg
196f80a6dcdSmrg#if 0
197f80a6dcdSmrgBool
198f80a6dcdSmrgXCompareFontName (
199f80a6dcdSmrg	XFontName	*name1,
200f80a6dcdSmrg	XFontName	*name2,
201f80a6dcdSmrg	unsigned int	fontNameAttributes)
202f80a6dcdSmrg{
203f80a6dcdSmrg#define CompareString(field,bit) \
204f80a6dcdSmrg	if (fontNameAttributes & bit) \
205f80a6dcdSmrg		if (strcmp (name1->field, name2->field)) \
206f80a6dcdSmrg			return False;
207f80a6dcdSmrg
208f80a6dcdSmrg#define CompareUnsigned(field,bit) \
209f80a6dcdSmrg	if (fontNameAttributes & bit) \
210f80a6dcdSmrg		if (name1->field != name2->field) \
211f80a6dcdSmrg			return False;
212f80a6dcdSmrg
213f80a6dcdSmrg	CompareString (Registry, FontNameRegistry)
214f80a6dcdSmrg	CompareString (Foundry, FontNameFoundry)
215f80a6dcdSmrg	CompareString (FamilyName, FontNameFamilyName)
216f80a6dcdSmrg	CompareString (WeightName, FontNameWeightName)
217f80a6dcdSmrg	CompareString (Slant, FontNameSlant)
218f80a6dcdSmrg	CompareString (SetwidthName, FontNameSetwidthName)
219f80a6dcdSmrg	CompareString (AddStyleName, FontNameAddStyleName)
220f80a6dcdSmrg	CompareUnsigned (PixelSize, FontNamePixelSize)
221f80a6dcdSmrg	CompareUnsigned (PointSize, FontNamePointSize)
222f80a6dcdSmrg	CompareUnsigned (ResolutionX, FontNameResolutionX)
223f80a6dcdSmrg	CompareUnsigned (ResolutionY, FontNameResolutionY)
224f80a6dcdSmrg	CompareString (Spacing, FontNameSpacing)
225f80a6dcdSmrg	CompareUnsigned (AverageWidth, FontNameAverageWidth)
226f80a6dcdSmrg	CompareString (CharSetRegistry, FontNameCharSetRegistry)
227f80a6dcdSmrg	CompareString (CharSetEncoding, FontNameCharSetEncoding)
228f80a6dcdSmrg	return True;
229f80a6dcdSmrg}
230f80a6dcdSmrg
231f80a6dcdSmrgBool
232f80a6dcdSmrgXCopyFontName (
233f80a6dcdSmrg	XFontName	*name1,
234f80a6dcdSmrg	XFontName	*name2,
235f80a6dcdSmrg	unsigned int	fontNameAttributes)
236f80a6dcdSmrg{
237f80a6dcdSmrg#define CopyString(field,bit) \
238f80a6dcdSmrg	if (fontNameAttributes & bit) \
239f80a6dcdSmrg		strcpy (name2->field, name1->field);
240f80a6dcdSmrg
241f80a6dcdSmrg#define CopyUnsigned(field,bit) \
242f80a6dcdSmrg	if (fontNameAttributes & bit) \
243f80a6dcdSmrg		name2->field = name1->field;
244f80a6dcdSmrg
245f80a6dcdSmrg	CopyString (Registry, FontNameRegistry)
246f80a6dcdSmrg	CopyString (Foundry, FontNameFoundry)
247f80a6dcdSmrg	CopyString (FamilyName, FontNameFamilyName)
248f80a6dcdSmrg	CopyString (WeightName, FontNameWeightName)
249f80a6dcdSmrg	CopyString (Slant, FontNameSlant)
250f80a6dcdSmrg	CopyString (SetwidthName, FontNameSetwidthName)
251f80a6dcdSmrg	CopyString (AddStyleName, FontNameAddStyleName)
252f80a6dcdSmrg	CopyUnsigned (PixelSize, FontNamePixelSize)
253f80a6dcdSmrg	CopyUnsigned (PointSize, FontNamePointSize)
254f80a6dcdSmrg	CopyUnsigned (ResolutionX, FontNameResolutionX)
255f80a6dcdSmrg	CopyUnsigned (ResolutionY, FontNameResolutionY)
256f80a6dcdSmrg	CopyString (Spacing, FontNameSpacing)
257f80a6dcdSmrg	CopyUnsigned (AverageWidth, FontNameAverageWidth)
258f80a6dcdSmrg	CopyString (CharSetRegistry, FontNameCharSetRegistry)
259f80a6dcdSmrg	CopyString (CharSetEncoding, FontNameCharSetEncoding)
260f80a6dcdSmrg	return True;
261f80a6dcdSmrg}
262f80a6dcdSmrg#endif
263