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