]> git.wh0rd.org - fontconfig.git/blob - src/fcdbg.c
Add functionality to allow fontconfig data structure serialization.
[fontconfig.git] / src / fcdbg.c
1 /*
2 * $RCSId: xc/lib/fontconfig/src/fcdbg.c,v 1.10 2002/08/22 18:53:22 keithp Exp $
3 *
4 * Copyright © 2000 Keith Packard
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of Keith Packard not be used in
11 * advertising or publicity pertaining to distribution of the software without
12 * specific, written prior permission. Keith Packard makes no
13 * representations about the suitability of this software for any purpose. It
14 * is provided "as is" without express or implied warranty.
15 *
16 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 * PERFORMANCE OF THIS SOFTWARE.
23 */
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include "fcint.h"
28
29 void
30 FcValuePrint (const FcValue v)
31 {
32 switch (v.type) {
33 case FcTypeVoid:
34 printf (" <void>");
35 break;
36 case FcTypeInteger:
37 printf (" %d(i)", v.u.i);
38 break;
39 case FcTypeDouble:
40 printf (" %g(f)", v.u.d);
41 break;
42 case FcTypeString:
43 printf (" \"%s\"", FcObjectPtrU(v.u.si));
44 break;
45 case FcTypeBool:
46 printf (" %s", v.u.b ? "FcTrue" : "FcFalse");
47 break;
48 case FcTypeMatrix:
49 {
50 FcMatrix *m = FcMatrixPtrU(v.u.mi);
51
52 printf (" (%f %f; %f %f)", m->xx, m->xy, m->yx, m->yy);
53 break;
54 }
55 case FcTypeCharSet: /* XXX */
56 printf (" set");
57 break;
58 case FcTypeLangSet:
59 printf (" ");
60 FcLangSetPrint (FcLangSetPtrU(v.u.li));
61 break;
62 case FcTypeFTFace:
63 printf (" face");
64 break;
65 }
66 }
67
68 void
69 FcValueListPrint (FcValueListPtr l)
70 {
71 for (; FcValueListPtrU(l); l = FcValueListPtrU(l)->next)
72 {
73 FcValuePrint (FcValueListPtrU(l)->value);
74 switch (FcValueListPtrU(l)->binding) {
75 case FcValueBindingWeak:
76 printf ("(w)");
77 break;
78 case FcValueBindingStrong:
79 printf ("(s)");
80 break;
81 case FcValueBindingSame:
82 printf ("(=)");
83 break;
84 }
85 }
86 }
87
88 void
89 FcLangSetPrint (const FcLangSet *ls)
90 {
91 FcStrBuf buf;
92 FcChar8 init_buf[1024];
93
94 FcStrBufInit (&buf, init_buf, sizeof (init_buf));
95 if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
96 printf ("%s", buf.buf);
97 else
98 printf ("langset (alloc error)");
99 FcStrBufDestroy (&buf);
100 }
101
102 void
103 FcPatternPrint (const FcPattern *p)
104 {
105 int i;
106 FcPatternElt *e;
107
108 if (!p)
109 {
110 printf ("Null pattern\n");
111 return;
112 }
113 printf ("Pattern %d of %d\n", p->num, p->size);
114 for (i = 0; i < p->num; i++)
115 {
116 e = FcPatternEltU(p->elts) + i;
117 printf ("\t%s:", FcObjectPtrU(e->object));
118 FcValueListPrint (e->values);
119 printf ("\n");
120 }
121 printf ("\n");
122 }
123
124 void
125 FcOpPrint (FcOp op)
126 {
127 switch (op) {
128 case FcOpInteger: printf ("Integer"); break;
129 case FcOpDouble: printf ("Double"); break;
130 case FcOpString: printf ("String"); break;
131 case FcOpMatrix: printf ("Matrix"); break;
132 case FcOpBool: printf ("Bool"); break;
133 case FcOpCharSet: printf ("CharSet"); break;
134 case FcOpField: printf ("Field"); break;
135 case FcOpConst: printf ("Const"); break;
136 case FcOpAssign: printf ("Assign"); break;
137 case FcOpAssignReplace: printf ("AssignReplace"); break;
138 case FcOpPrepend: printf ("Prepend"); break;
139 case FcOpPrependFirst: printf ("PrependFirst"); break;
140 case FcOpAppend: printf ("Append"); break;
141 case FcOpAppendLast: printf ("AppendLast"); break;
142 case FcOpQuest: printf ("Quest"); break;
143 case FcOpOr: printf ("Or"); break;
144 case FcOpAnd: printf ("And"); break;
145 case FcOpEqual: printf ("Equal"); break;
146 case FcOpNotEqual: printf ("NotEqual"); break;
147 case FcOpLess: printf ("Less"); break;
148 case FcOpLessEqual: printf ("LessEqual"); break;
149 case FcOpMore: printf ("More"); break;
150 case FcOpMoreEqual: printf ("MoreEqual"); break;
151 case FcOpContains: printf ("Contains"); break;
152 case FcOpNotContains: printf ("NotContains"); break;
153 case FcOpPlus: printf ("Plus"); break;
154 case FcOpMinus: printf ("Minus"); break;
155 case FcOpTimes: printf ("Times"); break;
156 case FcOpDivide: printf ("Divide"); break;
157 case FcOpNot: printf ("Not"); break;
158 case FcOpNil: printf ("Nil"); break;
159 case FcOpComma: printf ("Comma"); break;
160 case FcOpFloor: printf ("Floor"); break;
161 case FcOpCeil: printf ("Ceil"); break;
162 case FcOpRound: printf ("Round"); break;
163 case FcOpTrunc: printf ("Trunc"); break;
164 case FcOpListing: printf ("Listing"); break;
165 case FcOpInvalid: printf ("Invalid"); break;
166 }
167 }
168
169 void
170 FcExprPrint (const FcExpr *expr)
171 {
172 if (!expr) printf ("none");
173 else switch (expr->op) {
174 case FcOpInteger: printf ("%d", expr->u.ival); break;
175 case FcOpDouble: printf ("%g", expr->u.dval); break;
176 case FcOpString: printf ("\"%s\"", expr->u.sval); break;
177 case FcOpMatrix: printf ("[%g %g %g %g]",
178 expr->u.mval->xx,
179 expr->u.mval->xy,
180 expr->u.mval->yx,
181 expr->u.mval->yy); break;
182 case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
183 case FcOpCharSet: printf ("charset\n"); break;
184 case FcOpNil: printf ("nil\n"); break;
185 case FcOpField: printf ("%s", expr->u.field); break;
186 case FcOpConst: printf ("%s", expr->u.constant); break;
187 case FcOpQuest:
188 FcExprPrint (expr->u.tree.left);
189 printf (" quest ");
190 FcExprPrint (expr->u.tree.right->u.tree.left);
191 printf (" colon ");
192 FcExprPrint (expr->u.tree.right->u.tree.right);
193 break;
194 case FcOpAssign:
195 case FcOpAssignReplace:
196 case FcOpPrependFirst:
197 case FcOpPrepend:
198 case FcOpAppend:
199 case FcOpAppendLast:
200 case FcOpOr:
201 case FcOpAnd:
202 case FcOpEqual:
203 case FcOpNotEqual:
204 case FcOpLess:
205 case FcOpLessEqual:
206 case FcOpMore:
207 case FcOpMoreEqual:
208 case FcOpContains:
209 case FcOpListing:
210 case FcOpNotContains:
211 case FcOpPlus:
212 case FcOpMinus:
213 case FcOpTimes:
214 case FcOpDivide:
215 case FcOpComma:
216 FcExprPrint (expr->u.tree.left);
217 printf (" ");
218 switch (expr->op) {
219 case FcOpAssign: printf ("Assign"); break;
220 case FcOpAssignReplace: printf ("AssignReplace"); break;
221 case FcOpPrependFirst: printf ("PrependFirst"); break;
222 case FcOpPrepend: printf ("Prepend"); break;
223 case FcOpAppend: printf ("Append"); break;
224 case FcOpAppendLast: printf ("AppendLast"); break;
225 case FcOpOr: printf ("Or"); break;
226 case FcOpAnd: printf ("And"); break;
227 case FcOpEqual: printf ("Equal"); break;
228 case FcOpNotEqual: printf ("NotEqual"); break;
229 case FcOpLess: printf ("Less"); break;
230 case FcOpLessEqual: printf ("LessEqual"); break;
231 case FcOpMore: printf ("More"); break;
232 case FcOpMoreEqual: printf ("MoreEqual"); break;
233 case FcOpContains: printf ("Contains"); break;
234 case FcOpListing: printf ("Listing"); break;
235 case FcOpNotContains: printf ("NotContains"); break;
236 case FcOpPlus: printf ("Plus"); break;
237 case FcOpMinus: printf ("Minus"); break;
238 case FcOpTimes: printf ("Times"); break;
239 case FcOpDivide: printf ("Divide"); break;
240 case FcOpComma: printf ("Comma"); break;
241 default: break;
242 }
243 printf (" ");
244 FcExprPrint (expr->u.tree.right);
245 break;
246 case FcOpNot:
247 printf ("Not ");
248 FcExprPrint (expr->u.tree.left);
249 break;
250 case FcOpFloor:
251 printf ("Floor ");
252 FcExprPrint (expr->u.tree.left);
253 break;
254 case FcOpCeil:
255 printf ("Ceil ");
256 FcExprPrint (expr->u.tree.left);
257 break;
258 case FcOpRound:
259 printf ("Round ");
260 FcExprPrint (expr->u.tree.left);
261 break;
262 case FcOpTrunc:
263 printf ("Trunc ");
264 FcExprPrint (expr->u.tree.left);
265 break;
266 case FcOpInvalid: printf ("Invalid"); break;
267 }
268 }
269
270 void
271 FcTestPrint (const FcTest *test)
272 {
273 switch (test->kind) {
274 case FcMatchPattern:
275 printf ("pattern ");
276 break;
277 case FcMatchFont:
278 printf ("font ");
279 break;
280 }
281 switch (test->qual) {
282 case FcQualAny:
283 printf ("any ");
284 break;
285 case FcQualAll:
286 printf ("all ");
287 break;
288 case FcQualFirst:
289 printf ("first ");
290 break;
291 case FcQualNotFirst:
292 printf ("not_first ");
293 break;
294 }
295 printf ("%s ", test->field);
296 FcOpPrint (test->op);
297 printf (" ");
298 FcExprPrint (test->expr);
299 printf ("\n");
300 }
301
302 void
303 FcEditPrint (const FcEdit *edit)
304 {
305 printf ("Edit %s ", edit->field);
306 FcOpPrint (edit->op);
307 printf (" ");
308 FcExprPrint (edit->expr);
309 }
310
311 void
312 FcSubstPrint (const FcSubst *subst)
313 {
314 FcEdit *e;
315 FcTest *t;
316
317 printf ("match\n");
318 for (t = subst->test; t; t = t->next)
319 {
320 printf ("\t");
321 FcTestPrint (t);
322 }
323 printf ("edit\n");
324 for (e = subst->edit; e; e = e->next)
325 {
326 printf ("\t");
327 FcEditPrint (e);
328 printf (";\n");
329 }
330 printf ("\n");
331 }
332
333 void
334 FcFontSetPrint (const FcFontSet *s)
335 {
336 int i;
337
338 printf ("FontSet %d of %d\n", s->nfont, s->sfont);
339 for (i = 0; i < s->nfont; i++)
340 {
341 printf ("Font %d ", i);
342 FcPatternPrint (s->fonts[i]);
343 }
344 }
345
346 int
347 FcDebug (void)
348 {
349 static int initialized;
350 static int debug;
351
352 if (!initialized)
353 {
354 char *e;
355
356 initialized = 1;
357 e = getenv ("FC_DEBUG");
358 if (e)
359 {
360 printf ("FC_DEBUG=%s\n", e);
361 debug = atoi (e);
362 if (debug < 0)
363 debug = 0;
364 }
365 }
366 return debug;
367 }