/contrib/groff/src/libs/libxutil/XFontName.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 241 lines · 215 code · 21 blank · 5 comment · 35 complexity · 2ea21fdca7cad494b1e511dbec49d9af MD5 · raw file

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