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