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