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