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