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