1151497Sru/* 2151497Sru * XFontName.c 3151497Sru * 4151497Sru * build/parse X Font name strings 5151497Sru */ 6151497Sru 7151497Sru#include <X11/Xlib.h> 8151497Sru#include <X11/Xos.h> 9151497Sru#include "XFontName.h" 10151497Sru#include <ctype.h> 11151497Sru 12151497Srustatic char * 13151497SruextractStringField (char *name, char *buffer, int size, 14151497Sru unsigned int *attrp, unsigned int bit) 15151497Sru{ 16151497Sru char *buf = buffer; 17151497Sru 18151497Sru if (!*name) 19151497Sru return 0; 20151497Sru while (*name && *name != '-' && size > 0) { 21151497Sru *buf++ = *name++; 22151497Sru --size; 23151497Sru } 24151497Sru if (size <= 0) 25151497Sru return 0; 26151497Sru *buf = '\0'; 27151497Sru if (buffer[0] != '*' || buffer[1] != '\0') 28151497Sru *attrp |= bit; 29151497Sru if (*name == '-') 30151497Sru return name+1; 31151497Sru return name; 32151497Sru} 33151497Sru 34151497Srustatic char * 35151497SruextractUnsignedField (char *name, unsigned int *result, 36151497Sru unsigned int *attrp, unsigned int bit) 37151497Sru{ 38151497Sru char buf[256]; 39151497Sru char *c; 40151497Sru unsigned int i; 41151497Sru 42151497Sru name = extractStringField (name, buf, sizeof (buf), attrp, bit); 43151497Sru if (!name) 44151497Sru return 0; 45151497Sru if (!(*attrp & bit)) 46151497Sru return name; 47151497Sru i = 0; 48151497Sru for (c = buf; *c; c++) { 49151497Sru if (!isdigit (*c)) 50151497Sru return 0; 51151497Sru i = i * 10 + (*c - '0'); 52151497Sru } 53151497Sru *result = i; 54151497Sru return name; 55151497Sru} 56151497Sru 57151497SruBool 58151497SruXParseFontName (XFontNameString fontNameString, XFontName *fontName, 59151497Sru unsigned int *fontNameAttributes) 60151497Sru{ 61151497Sru char *name = fontNameString; 62151497Sru XFontName temp; 63151497Sru unsigned int attributes = 0; 64151497Sru 65151497Sru#define GetString(field,bit)\ 66151497Sru if (!(name = extractStringField \ 67151497Sru (name, temp.field, sizeof (temp.field),\ 68151497Sru &attributes, bit))) \ 69151497Sru return False; 70151497Sru 71151497Sru#define GetUnsigned(field,bit)\ 72151497Sru if (!(name = extractUnsignedField \ 73151497Sru (name, &temp.field, \ 74151497Sru &attributes, bit))) \ 75151497Sru return False; 76151497Sru 77151497Sru GetString (Registry, FontNameRegistry) 78151497Sru GetString (Foundry, FontNameFoundry) 79151497Sru GetString (FamilyName, FontNameFamilyName) 80151497Sru GetString (WeightName, FontNameWeightName) 81151497Sru GetString (Slant, FontNameSlant) 82151497Sru GetString (SetwidthName, FontNameSetwidthName) 83151497Sru GetString (AddStyleName, FontNameAddStyleName) 84151497Sru GetUnsigned (PixelSize, FontNamePixelSize) 85151497Sru GetUnsigned (PointSize, FontNamePointSize) 86151497Sru GetUnsigned (ResolutionX, FontNameResolutionX) 87151497Sru GetUnsigned (ResolutionY, FontNameResolutionY) 88151497Sru GetString (Spacing, FontNameSpacing) 89151497Sru GetUnsigned (AverageWidth, FontNameAverageWidth) 90151497Sru GetString (CharSetRegistry, FontNameCharSetRegistry) 91151497Sru if (!*name) { 92151497Sru temp.CharSetEncoding[0] = '\0'; 93151497Sru attributes |= FontNameCharSetEncoding; 94151497Sru } else { 95151497Sru GetString (CharSetEncoding, FontNameCharSetEncoding) 96151497Sru } 97151497Sru *fontName = temp; 98151497Sru *fontNameAttributes = attributes; 99151497Sru return True; 100151497Sru} 101151497Sru 102151497Srustatic char * 103151497Sruutoa (unsigned int u, char *s, int size) 104151497Sru{ 105151497Sru char *t; 106151497Sru 107151497Sru t = s + size; 108151497Sru *--t = '\0'; 109151497Sru do 110151497Sru *--t = (u % 10) + '0'; 111151497Sru while (u /= 10); 112151497Sru return t; 113151497Sru} 114151497Sru 115151497SruBool 116151497SruXFormatFontName (XFontName *fontName, unsigned int fontNameAttributes, 117151497Sru XFontNameString fontNameString) 118151497Sru{ 119151497Sru char tmp[256]; 120151497Sru char *name = tmp, *f; 121151497Sru int left = sizeof (tmp) - 1; 122151497Sru char number[32]; 123151497Sru 124151497Sru#define PutString(field, bit)\ 125151497Sru f = (fontNameAttributes & bit) ? \ 126151497Sru fontName->field \ 127151497Sru : (char *)"*"; \ 128151497Sru if ((left -= strlen (f)) < 0) \ 129151497Sru return False; \ 130151497Sru while (*f) \ 131151497Sru if ((*name++ = *f++) == '-') \ 132151497Sru return False; 133151497Sru#define PutHyphen()\ 134151497Sru if (--left < 0) \ 135151497Sru return False; \ 136151497Sru *name++ = '-'; 137151497Sru 138151497Sru#define PutUnsigned(field, bit) \ 139151497Sru f = (fontNameAttributes & bit) ? \ 140151497Sru utoa (fontName->field, number, sizeof (number)) \ 141151497Sru : (char *)"*"; \ 142151497Sru if ((left -= strlen (f)) < 0) \ 143151497Sru return False; \ 144151497Sru while (*f) \ 145151497Sru *name++ = *f++; 146151497Sru 147151497Sru PutString (Registry, FontNameRegistry) 148151497Sru PutHyphen (); 149151497Sru PutString (Foundry, FontNameFoundry) 150151497Sru PutHyphen (); 151151497Sru PutString (FamilyName, FontNameFamilyName) 152151497Sru PutHyphen (); 153151497Sru PutString (WeightName, FontNameWeightName) 154151497Sru PutHyphen (); 155151497Sru PutString (Slant, FontNameSlant) 156151497Sru PutHyphen (); 157151497Sru PutString (SetwidthName, FontNameSetwidthName) 158151497Sru PutHyphen (); 159151497Sru PutString (AddStyleName, FontNameAddStyleName) 160151497Sru PutHyphen (); 161151497Sru PutUnsigned (PixelSize, FontNamePixelSize) 162151497Sru PutHyphen (); 163151497Sru PutUnsigned (PointSize, FontNamePointSize) 164151497Sru PutHyphen (); 165151497Sru PutUnsigned (ResolutionX, FontNameResolutionX) 166151497Sru PutHyphen (); 167151497Sru PutUnsigned (ResolutionY, FontNameResolutionY) 168151497Sru PutHyphen (); 169151497Sru PutString (Spacing, FontNameSpacing) 170151497Sru PutHyphen (); 171151497Sru PutUnsigned (AverageWidth, FontNameAverageWidth) 172151497Sru PutHyphen (); 173151497Sru PutString (CharSetRegistry, FontNameCharSetRegistry) 174151497Sru PutHyphen (); 175151497Sru PutString (CharSetEncoding, FontNameCharSetEncoding) 176151497Sru *name = '\0'; 177151497Sru strcpy (fontNameString, tmp); 178151497Sru return True; 179151497Sru} 180151497Sru 181151497SruBool 182151497SruXCompareFontName (XFontName *name1, XFontName *name2, 183151497Sru unsigned int fontNameAttributes) 184151497Sru{ 185151497Sru#define CompareString(field,bit) \ 186151497Sru if (fontNameAttributes & bit) \ 187151497Sru if (strcmp (name1->field, name2->field)) \ 188151497Sru return False; 189151497Sru 190151497Sru#define CompareUnsigned(field,bit) \ 191151497Sru if (fontNameAttributes & bit) \ 192151497Sru if (name1->field != name2->field) \ 193151497Sru return False; 194151497Sru 195151497Sru CompareString (Registry, FontNameRegistry) 196151497Sru CompareString (Foundry, FontNameFoundry) 197151497Sru CompareString (FamilyName, FontNameFamilyName) 198151497Sru CompareString (WeightName, FontNameWeightName) 199151497Sru CompareString (Slant, FontNameSlant) 200151497Sru CompareString (SetwidthName, FontNameSetwidthName) 201151497Sru CompareString (AddStyleName, FontNameAddStyleName) 202151497Sru CompareUnsigned (PixelSize, FontNamePixelSize) 203151497Sru CompareUnsigned (PointSize, FontNamePointSize) 204151497Sru CompareUnsigned (ResolutionX, FontNameResolutionX) 205151497Sru CompareUnsigned (ResolutionY, FontNameResolutionY) 206151497Sru CompareString (Spacing, FontNameSpacing) 207151497Sru CompareUnsigned (AverageWidth, FontNameAverageWidth) 208151497Sru CompareString (CharSetRegistry, FontNameCharSetRegistry) 209151497Sru CompareString (CharSetEncoding, FontNameCharSetEncoding) 210151497Sru return True; 211151497Sru} 212151497Sru 213151497SruBool 214151497SruXCopyFontName (XFontName *name1, XFontName *name2, 215151497Sru unsigned int fontNameAttributes) 216151497Sru{ 217151497Sru#define CopyString(field,bit) \ 218151497Sru if (fontNameAttributes & bit) \ 219151497Sru strcpy (name2->field, name1->field); 220151497Sru 221151497Sru#define CopyUnsigned(field,bit) \ 222151497Sru if (fontNameAttributes & bit) \ 223151497Sru name2->field = name1->field; 224151497Sru 225151497Sru CopyString (Registry, FontNameRegistry) 226151497Sru CopyString (Foundry, FontNameFoundry) 227151497Sru CopyString (FamilyName, FontNameFamilyName) 228151497Sru CopyString (WeightName, FontNameWeightName) 229151497Sru CopyString (Slant, FontNameSlant) 230151497Sru CopyString (SetwidthName, FontNameSetwidthName) 231151497Sru CopyString (AddStyleName, FontNameAddStyleName) 232151497Sru CopyUnsigned (PixelSize, FontNamePixelSize) 233151497Sru CopyUnsigned (PointSize, FontNamePointSize) 234151497Sru CopyUnsigned (ResolutionX, FontNameResolutionX) 235151497Sru CopyUnsigned (ResolutionY, FontNameResolutionY) 236151497Sru CopyString (Spacing, FontNameSpacing) 237151497Sru CopyUnsigned (AverageWidth, FontNameAverageWidth) 238151497Sru CopyString (CharSetRegistry, FontNameCharSetRegistry) 239151497Sru CopyString (CharSetEncoding, FontNameCharSetEncoding) 240151497Sru return True; 241151497Sru} 242