home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / util / gnu / groff_src.lha / groff-1.10src / xditview / XFontName.c < prev    next >
C/C++ Source or Header  |  1991-05-18  |  6KB  |  257 lines

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