]> git.wh0rd.org Git - fontconfig.git/blob - src/fcdbg.c
16b6bfd0fad3e79cfd6c979a0b73b83d965edc40
[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 "fcint.h"
26 #include <stdio.h>
27 #include <stdlib.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\"", v.u.s);
44         break;
45     case FcTypeBool:
46         printf (" %s", v.u.b ? "FcTrue" : "FcFalse");
47         break;
48     case FcTypeMatrix:
49         printf (" (%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
50         break;
51     case FcTypeCharSet: /* XXX */
52         printf (" ");
53         FcCharSetPrint (v.u.c);
54         break;
55     case FcTypeLangSet:
56         printf (" ");
57         FcLangSetPrint (v.u.l);
58         break;
59     case FcTypeFTFace:
60         printf (" face");
61         break;
62     }
63 }
64
65 void
66 FcValueListPrint (FcValueListPtr l)
67 {
68     for (; l != NULL; l = FcValueListNext(l))
69     {
70         FcValuePrint (FcValueCanonicalize(&l->value));
71         switch (l->binding) {
72         case FcValueBindingWeak:
73             printf ("(w)");
74             break;
75         case FcValueBindingStrong:
76             printf ("(s)");
77             break;
78         case FcValueBindingSame:
79             printf ("(=)");
80             break;
81         }
82     }
83 }
84
85 void
86 FcLangSetPrint (const FcLangSet *ls)
87 {
88     FcStrBuf    buf;
89     FcChar8     init_buf[1024];
90     
91     FcStrBufInit (&buf, init_buf, sizeof (init_buf));
92     if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
93        printf ("%s", buf.buf);
94     else
95        printf ("langset (alloc error)");
96     FcStrBufDestroy (&buf);
97 }
98
99 void
100 FcCharSetPrint (const FcCharSet *c)
101 {
102     int i, j;
103
104     for (i = 0; i < c->num; i++)
105     {
106         FcCharLeaf      *leaf = FcCharSetLeaf(c, i);
107         
108         printf ("%04x:", FcCharSetNumbers(c)[i]);
109         for (j = 0; j < 256/32; j++)
110             printf (" %08x", leaf->map[j]);
111         printf ("\n");
112     }
113 }
114
115 void
116 FcPatternPrint (const FcPattern *p)
117 {
118     int             i;
119     FcPatternElt   *e;
120     
121     if (!p)
122     {
123         printf ("Null pattern\n");
124         return;
125     }
126     printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
127     for (i = 0; i < p->num; i++)
128     {
129         e = &FcPatternElts(p)[i];
130         printf ("\t%s:", FcObjectName(e->object));
131         /* so that fc-match properly displays file: foo... */
132         if (e->object == FC_FILE_OBJECT)
133         {
134             FcChar8 * s;
135             FcPatternObjectGetString (p, FC_FILE_OBJECT, 0, &s);
136             printf (" \"%s\"", s);
137             switch (FcPatternEltValues(e)->binding) {
138             case FcValueBindingWeak:
139                 printf ("(w)");
140                 break;
141             case FcValueBindingStrong:
142                 printf ("(s)");
143                 break;
144             case FcValueBindingSame:
145                 printf ("(=)");
146                 break;
147             }
148         }
149         else
150             FcValueListPrint (FcPatternEltValues(e));
151         printf ("\n");
152     }
153     printf ("\n");
154 }
155
156 void
157 FcOpPrint (FcOp op)
158 {
159     switch (op) {
160     case FcOpInteger: printf ("Integer"); break;
161     case FcOpDouble: printf ("Double"); break;
162     case FcOpString: printf ("String"); break;
163     case FcOpMatrix: printf ("Matrix"); break;
164     case FcOpBool: printf ("Bool"); break;
165     case FcOpCharSet: printf ("CharSet"); break;
166     case FcOpField: printf ("Field"); break;
167     case FcOpConst: printf ("Const"); break;
168     case FcOpAssign: printf ("Assign"); break;
169     case FcOpAssignReplace: printf ("AssignReplace"); break;
170     case FcOpPrepend: printf ("Prepend"); break;
171     case FcOpPrependFirst: printf ("PrependFirst"); break;
172     case FcOpAppend: printf ("Append"); break;
173     case FcOpAppendLast: printf ("AppendLast"); break;
174     case FcOpQuest: printf ("Quest"); break;
175     case FcOpOr: printf ("Or"); break;
176     case FcOpAnd: printf ("And"); break;
177     case FcOpEqual: printf ("Equal"); break;
178     case FcOpNotEqual: printf ("NotEqual"); break;
179     case FcOpLess: printf ("Less"); break;
180     case FcOpLessEqual: printf ("LessEqual"); break;
181     case FcOpMore: printf ("More"); break;
182     case FcOpMoreEqual: printf ("MoreEqual"); break;
183     case FcOpContains: printf ("Contains"); break;
184     case FcOpNotContains: printf ("NotContains"); break;
185     case FcOpPlus: printf ("Plus"); break;
186     case FcOpMinus: printf ("Minus"); break;
187     case FcOpTimes: printf ("Times"); break;
188     case FcOpDivide: printf ("Divide"); break;
189     case FcOpNot: printf ("Not"); break;
190     case FcOpNil: printf ("Nil"); break;
191     case FcOpComma: printf ("Comma"); break;
192     case FcOpFloor: printf ("Floor"); break;
193     case FcOpCeil: printf ("Ceil"); break;
194     case FcOpRound: printf ("Round"); break;
195     case FcOpTrunc: printf ("Trunc"); break;
196     case FcOpListing: printf ("Listing"); break;
197     case FcOpInvalid: printf ("Invalid"); break;
198     }
199 }
200
201 void
202 FcExprPrint (const FcExpr *expr)
203 {
204     if (!expr) printf ("none");
205     else switch (expr->op) {
206     case FcOpInteger: printf ("%d", expr->u.ival); break;
207     case FcOpDouble: printf ("%g", expr->u.dval); break;
208     case FcOpString: printf ("\"%s\"", expr->u.sval); break;
209     case FcOpMatrix: printf ("[%g %g %g %g]",
210                               expr->u.mval->xx,
211                               expr->u.mval->xy,
212                               expr->u.mval->yx,
213                               expr->u.mval->yy); break;
214     case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
215     case FcOpCharSet: printf ("charset\n"); break;
216     case FcOpNil: printf ("nil\n"); break;
217     case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break;
218     case FcOpConst: printf ("%s", expr->u.constant); break;
219     case FcOpQuest:
220         FcExprPrint (expr->u.tree.left);
221         printf (" quest ");
222         FcExprPrint (expr->u.tree.right->u.tree.left);
223         printf (" colon ");
224         FcExprPrint (expr->u.tree.right->u.tree.right);
225         break;
226     case FcOpAssign:
227     case FcOpAssignReplace:
228     case FcOpPrependFirst:
229     case FcOpPrepend:
230     case FcOpAppend:
231     case FcOpAppendLast:
232     case FcOpOr:
233     case FcOpAnd:
234     case FcOpEqual:
235     case FcOpNotEqual:
236     case FcOpLess:
237     case FcOpLessEqual:
238     case FcOpMore:
239     case FcOpMoreEqual:
240     case FcOpContains:
241     case FcOpListing:
242     case FcOpNotContains:
243     case FcOpPlus:
244     case FcOpMinus:
245     case FcOpTimes:
246     case FcOpDivide:
247     case FcOpComma:
248         FcExprPrint (expr->u.tree.left);
249         printf (" ");
250         switch (expr->op) {
251         case FcOpAssign: printf ("Assign"); break;
252         case FcOpAssignReplace: printf ("AssignReplace"); break;
253         case FcOpPrependFirst: printf ("PrependFirst"); break;
254         case FcOpPrepend: printf ("Prepend"); break;
255         case FcOpAppend: printf ("Append"); break;
256         case FcOpAppendLast: printf ("AppendLast"); break;
257         case FcOpOr: printf ("Or"); break;
258         case FcOpAnd: printf ("And"); break;
259         case FcOpEqual: printf ("Equal"); break;
260         case FcOpNotEqual: printf ("NotEqual"); break;
261         case FcOpLess: printf ("Less"); break;
262         case FcOpLessEqual: printf ("LessEqual"); break;
263         case FcOpMore: printf ("More"); break;
264         case FcOpMoreEqual: printf ("MoreEqual"); break;
265         case FcOpContains: printf ("Contains"); break;
266         case FcOpListing: printf ("Listing"); break;
267         case FcOpNotContains: printf ("NotContains"); break;
268         case FcOpPlus: printf ("Plus"); break;
269         case FcOpMinus: printf ("Minus"); break;
270         case FcOpTimes: printf ("Times"); break;
271         case FcOpDivide: printf ("Divide"); break;
272         case FcOpComma: printf ("Comma"); break;
273         default: break;
274         }
275         printf (" ");
276         FcExprPrint (expr->u.tree.right);
277         break;
278     case FcOpNot:
279         printf ("Not ");
280         FcExprPrint (expr->u.tree.left);
281         break;
282     case FcOpFloor:
283         printf ("Floor ");
284         FcExprPrint (expr->u.tree.left);
285         break;
286     case FcOpCeil:
287         printf ("Ceil ");
288         FcExprPrint (expr->u.tree.left);
289         break;
290     case FcOpRound:
291         printf ("Round ");
292         FcExprPrint (expr->u.tree.left);
293         break;
294     case FcOpTrunc:
295         printf ("Trunc ");
296         FcExprPrint (expr->u.tree.left);
297         break;
298     case FcOpInvalid: printf ("Invalid"); break;
299     }
300 }
301
302 void
303 FcTestPrint (const FcTest *test)
304 {
305     switch (test->kind) {
306     case FcMatchPattern:
307         printf ("pattern ");
308         break;
309     case FcMatchFont:
310         printf ("font ");
311         break;
312     }
313     switch (test->qual) {
314     case FcQualAny:
315         printf ("any ");
316         break;
317     case FcQualAll:
318         printf ("all ");
319         break;
320     case FcQualFirst:
321         printf ("first ");
322         break;
323     case FcQualNotFirst:
324         printf ("not_first ");
325         break;
326     }
327     printf ("%s ", FcObjectName (test->object));
328     FcOpPrint (test->op);
329     printf (" ");
330     FcExprPrint (test->expr);
331     printf ("\n");
332 }
333
334 void
335 FcEditPrint (const FcEdit *edit)
336 {
337     printf ("Edit %s ", FcObjectName (edit->object));
338     FcOpPrint (edit->op);
339     printf (" ");
340     FcExprPrint (edit->expr);
341 }
342
343 void
344 FcSubstPrint (const FcSubst *subst)
345 {
346     FcEdit      *e;
347     FcTest      *t;
348     
349     printf ("match\n");
350     for (t = subst->test; t; t = t->next)
351     {
352         printf ("\t");
353         FcTestPrint (t);
354     }
355     printf ("edit\n");
356     for (e = subst->edit; e; e = e->next)
357     {
358         printf ("\t");
359         FcEditPrint (e);
360         printf (";\n");
361     }
362     printf ("\n");
363 }
364
365 void
366 FcFontSetPrint (const FcFontSet *s)
367 {
368     int     i;
369
370     printf ("FontSet %d of %d\n", s->nfont, s->sfont);
371     for (i = 0; i < s->nfont; i++)
372     {
373         printf ("Font %d ", i);
374         FcPatternPrint (s->fonts[i]);
375     }
376 }
377
378 int FcDebugVal;
379
380 void
381 FcInitDebug (void)
382 {
383     char    *e;
384
385     e = getenv ("FC_DEBUG");
386     if (e)
387     {
388         printf ("FC_DEBUG=%s\n", e);
389         FcDebugVal = atoi (e);
390         if (FcDebugVal < 0)
391             FcDebugVal = 0;
392     }
393 }