groff before CVS: release 1.15
[s-roff.git] / xditview / XFontName.c
blob5ca9bb81e996da8d008aede90fda16c7e98d0f77
1 /*
2 * XFontName.c
4 * build/parse X Font name strings
5 */
7 #include <X11/Xlib.h>
8 #include <X11/Xos.h>
9 #include "XFontName.h"
10 #include <ctype.h>
12 static char *
13 extractStringField (name, buffer, size, attrp, bit)
14 char *name;
15 char *buffer;
16 int size;
17 unsigned int *attrp;
18 unsigned int bit;
20 char *buf = buffer;
22 if (!*name)
23 return 0;
24 while (*name && *name != '-' && size > 0) {
25 *buf++ = *name++;
26 --size;
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;
38 static char *
39 extractUnsignedField (name, result, attrp, bit)
40 char *name;
41 unsigned int *result;
42 unsigned int *attrp;
43 unsigned int bit;
45 char buf[256];
46 char *c;
47 unsigned int i;
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');
60 *result = i;
61 return name;
64 Bool
65 XParseFontName (fontNameString, fontName, fontNameAttributes)
66 XFontNameString fontNameString;
67 XFontName *fontName;
68 unsigned int *fontNameAttributes;
70 char *name = fontNameString;
71 XFontName temp;
72 unsigned int attributes = 0;
74 #define GetString(field,bit)\
75 if (!(name = extractStringField \
76 (name, temp.field, sizeof (temp.field),\
77 &attributes, bit))) \
78 return False;
80 #define GetUnsigned(field,bit)\
81 if (!(name = extractUnsignedField \
82 (name, &temp.field, \
83 &attributes, bit))) \
84 return False;
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)
106 *fontName = temp;
107 *fontNameAttributes = attributes;
108 return True;
111 static char *
112 utoa (u, s, size)
113 unsigned int u;
114 char *s;
115 int size;
117 char *t;
119 t = s + size;
120 *--t = '\0';
122 *--t = (u % 10) + '0';
123 while (u /= 10);
124 return t;
127 Bool
128 XFormatFontName (fontName, fontNameAttributes, fontNameString)
129 XFontName *fontName;
130 unsigned int fontNameAttributes;
131 XFontNameString fontNameString;
133 XFontNameString tmp;
134 char *name = tmp, *f;
135 int left = sizeof (tmp) - 1;
136 char number[32];
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++ = '-';
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++;
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;
195 Bool
196 XCompareFontName (name1, name2, fontNameAttributes)
197 XFontName *name1, *name2;
198 unsigned int fontNameAttributes;
200 #define CompareString(field,bit) \
201 if (fontNameAttributes & bit) \
202 if (strcmp (name1->field, name2->field)) \
203 return False;
205 #define CompareUnsigned(field,bit) \
206 if (fontNameAttributes & bit) \
207 if (name1->field != name2->field) \
208 return False;
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;
228 XCopyFontName (name1, name2, fontNameAttributes)
229 XFontName *name1, *name2;
230 unsigned int fontNameAttributes;
232 #define CopyString(field,bit) \
233 if (fontNameAttributes & bit) \
234 strcpy (name2->field, name1->field);
236 #define CopyUnsigned(field,bit) \
237 if (fontNameAttributes & bit) \
238 name2->field = name1->field;
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;