]> git.wh0rd.org Git - fontconfig.git/blob - src/fcdbg.c
Allow double or integer for numeric values in matching
[fontconfig.git] / src / fcdbg.c
1 /*
2  * $XFree86: xc/lib/fontconfig/src/fcdbg.c,v 1.10 2002/08/22 18:53:22 keithp Exp $
3  *
4  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
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     FcStrBuf    buf;
33     FcChar8     init_buf[1024];
34     
35     switch (v.type) {
36     case FcTypeVoid:
37         printf (" <void>");
38         break;
39     case FcTypeInteger:
40         printf (" %d(i)", v.u.i);
41         break;
42     case FcTypeDouble:
43         printf (" %g(f)", v.u.d);
44         break;
45     case FcTypeString:
46         printf (" \"%s\"", v.u.s);
47         break;
48     case FcTypeBool:
49         printf (" %s", v.u.b ? "FcTrue" : "FcFalse");
50         break;
51     case FcTypeMatrix:
52         printf (" (%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
53         break;
54     case FcTypeCharSet: /* XXX */
55         printf (" set");
56         break;
57     case FcTypeLangSet:
58         FcStrBufInit (&buf, init_buf, sizeof (init_buf));
59         if (FcNameUnparseLangSet (&buf, v.u.l) && FcStrBufChar (&buf,'\0'))
60             printf (" %s", buf.buf);
61         else
62             printf ("langset (alloc error)");
63         FcStrBufDestroy (&buf);
64         break;
65     case FcTypeFTFace:
66         printf (" face");
67         break;
68     }
69 }
70
71 void
72 FcValueListPrint (const FcValueList *l)
73 {
74     for (; l; l = l->next)
75     {
76         FcValuePrint (l->value);
77         switch (l->binding) {
78         case FcValueBindingWeak:
79             printf ("(w)");
80             break;
81         case FcValueBindingStrong:
82             printf ("(s)");
83             break;
84         case FcValueBindingSame:
85             printf ("(=)");
86             break;
87         }
88     }
89 }
90
91 void
92 FcPatternPrint (const FcPattern *p)
93 {
94     int             i;
95     FcPatternElt   *e;
96     
97     if (!p)
98     {
99         printf ("Null pattern\n");
100         return;
101     }
102     printf ("Pattern %d of %d\n", p->num, p->size);
103     for (i = 0; i < p->num; i++)
104     {
105         e = &p->elts[i];
106         printf ("\t%s:", e->object);
107         FcValueListPrint (e->values);
108         printf ("\n");
109     }
110     printf ("\n");
111 }
112
113 void
114 FcOpPrint (FcOp op)
115 {
116     switch (op) {
117     case FcOpInteger: printf ("Integer"); break;
118     case FcOpDouble: printf ("Double"); break;
119     case FcOpString: printf ("String"); break;
120     case FcOpMatrix: printf ("Matrix"); break;
121     case FcOpBool: printf ("Bool"); break;
122     case FcOpCharSet: printf ("CharSet"); break;
123     case FcOpField: printf ("Field"); break;
124     case FcOpConst: printf ("Const"); break;
125     case FcOpAssign: printf ("Assign"); break;
126     case FcOpAssignReplace: printf ("AssignReplace"); break;
127     case FcOpPrepend: printf ("Prepend"); break;
128     case FcOpPrependFirst: printf ("PrependFirst"); break;
129     case FcOpAppend: printf ("Append"); break;
130     case FcOpAppendLast: printf ("AppendLast"); break;
131     case FcOpQuest: printf ("Quest"); break;
132     case FcOpOr: printf ("Or"); break;
133     case FcOpAnd: printf ("And"); break;
134     case FcOpEqual: printf ("Equal"); break;
135     case FcOpNotEqual: printf ("NotEqual"); break;
136     case FcOpLess: printf ("Less"); break;
137     case FcOpLessEqual: printf ("LessEqual"); break;
138     case FcOpMore: printf ("More"); break;
139     case FcOpMoreEqual: printf ("MoreEqual"); break;
140     case FcOpContains: printf ("Contains"); break;
141     case FcOpNotContains: printf ("NotContains"); break;
142     case FcOpPlus: printf ("Plus"); break;
143     case FcOpMinus: printf ("Minus"); break;
144     case FcOpTimes: printf ("Times"); break;
145     case FcOpDivide: printf ("Divide"); break;
146     case FcOpNot: printf ("Not"); break;
147     case FcOpNil: printf ("Nil"); break;
148     case FcOpComma: printf ("Comma"); break;
149     case FcOpInvalid: printf ("Invalid"); break;
150     }
151 }
152
153 void
154 FcExprPrint (const FcExpr *expr)
155 {
156     switch (expr->op) {
157     case FcOpInteger: printf ("%d", expr->u.ival); break;
158     case FcOpDouble: printf ("%g", expr->u.dval); break;
159     case FcOpString: printf ("\"%s\"", expr->u.sval); break;
160     case FcOpMatrix: printf ("[%g %g %g %g]",
161                               expr->u.mval->xx,
162                               expr->u.mval->xy,
163                               expr->u.mval->yx,
164                               expr->u.mval->yy); break;
165     case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
166     case FcOpCharSet: printf ("charset\n"); break;
167     case FcOpNil: printf ("nil\n"); break;
168     case FcOpField: printf ("%s", expr->u.field); break;
169     case FcOpConst: printf ("%s", expr->u.constant); break;
170     case FcOpQuest:
171         FcExprPrint (expr->u.tree.left);
172         printf (" quest ");
173         FcExprPrint (expr->u.tree.right->u.tree.left);
174         printf (" colon ");
175         FcExprPrint (expr->u.tree.right->u.tree.right);
176         break;
177     case FcOpAssign:
178     case FcOpAssignReplace:
179     case FcOpPrependFirst:
180     case FcOpPrepend:
181     case FcOpAppend:
182     case FcOpAppendLast:
183     case FcOpOr:
184     case FcOpAnd:
185     case FcOpEqual:
186     case FcOpNotEqual:
187     case FcOpLess:
188     case FcOpLessEqual:
189     case FcOpMore:
190     case FcOpMoreEqual:
191     case FcOpContains:
192     case FcOpNotContains:
193     case FcOpPlus:
194     case FcOpMinus:
195     case FcOpTimes:
196     case FcOpDivide:
197     case FcOpComma:
198         FcExprPrint (expr->u.tree.left);
199         printf (" ");
200         switch (expr->op) {
201         case FcOpAssign: printf ("Assign"); break;
202         case FcOpAssignReplace: printf ("AssignReplace"); break;
203         case FcOpPrependFirst: printf ("PrependFirst"); break;
204         case FcOpPrepend: printf ("Prepend"); break;
205         case FcOpAppend: printf ("Append"); break;
206         case FcOpAppendLast: printf ("AppendLast"); break;
207         case FcOpOr: printf ("Or"); break;
208         case FcOpAnd: printf ("And"); break;
209         case FcOpEqual: printf ("Equal"); break;
210         case FcOpNotEqual: printf ("NotEqual"); break;
211         case FcOpLess: printf ("Less"); break;
212         case FcOpLessEqual: printf ("LessEqual"); break;
213         case FcOpMore: printf ("More"); break;
214         case FcOpMoreEqual: printf ("MoreEqual"); break;
215         case FcOpContains: printf ("Contains"); break;
216         case FcOpNotContains: printf ("NotContains"); break;
217         case FcOpPlus: printf ("Plus"); break;
218         case FcOpMinus: printf ("Minus"); break;
219         case FcOpTimes: printf ("Times"); break;
220         case FcOpDivide: printf ("Divide"); break;
221         case FcOpComma: printf ("Comma"); break;
222         default: break;
223         }
224         printf (" ");
225         FcExprPrint (expr->u.tree.right);
226         break;
227     case FcOpNot:
228         printf ("Not ");
229         FcExprPrint (expr->u.tree.left);
230         break;
231     case FcOpInvalid: printf ("Invalid"); break;
232     }
233 }
234
235 void
236 FcTestPrint (const FcTest *test)
237 {
238     switch (test->kind) {
239     case FcMatchPattern:
240         printf ("pattern ");
241         break;
242     case FcMatchFont:
243         printf ("font ");
244         break;
245     }
246     switch (test->qual) {
247     case FcQualAny:
248         printf ("any ");
249         break;
250     case FcQualAll:
251         printf ("all ");
252         break;
253     case FcQualFirst:
254         printf ("first ");
255         break;
256     case FcQualNotFirst:
257         printf ("not_first ");
258         break;
259     }
260     printf ("%s ", test->field);
261     FcOpPrint (test->op);
262     printf (" ");
263     FcExprPrint (test->expr);
264     printf ("\n");
265 }
266
267 void
268 FcEditPrint (const FcEdit *edit)
269 {
270     printf ("Edit %s ", edit->field);
271     FcOpPrint (edit->op);
272     printf (" ");
273     FcExprPrint (edit->expr);
274 }
275
276 void
277 FcSubstPrint (const FcSubst *subst)
278 {
279     FcEdit      *e;
280     FcTest      *t;
281     
282     printf ("match\n");
283     for (t = subst->test; t; t = t->next)
284     {
285         printf ("\t");
286         FcTestPrint (t);
287     }
288     printf ("edit\n");
289     for (e = subst->edit; e; e = e->next)
290     {
291         printf ("\t");
292         FcEditPrint (e);
293         printf (";\n");
294     }
295     printf ("\n");
296 }
297
298 void
299 FcFontSetPrint (const FcFontSet *s)
300 {
301     int     i;
302
303     printf ("FontSet %d of %d\n", s->nfont, s->sfont);
304     for (i = 0; i < s->nfont; i++)
305     {
306         printf ("Font %d ", i);
307         FcPatternPrint (s->fonts[i]);
308     }
309 }
310
311 int
312 FcDebug (void)
313 {
314     static int  initialized;
315     static int  debug;
316
317     if (!initialized)
318     {
319         char    *e;
320
321         initialized = 1;
322         e = getenv ("FC_DEBUG");
323         if (e)
324         {
325             printf ("FC_DEBUG=%s\n", e);
326             debug = atoi (e);
327             if (debug < 0)
328                 debug = 0;
329         }
330     }
331     return debug;
332 }