]> git.wh0rd.org Git - fontconfig.git/blob - src/fcdbg.c
Avoid crashing with null expressions in debug code
[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     if (!expr) printf ("none");
157     else switch (expr->op) {
158     case FcOpInteger: printf ("%d", expr->u.ival); break;
159     case FcOpDouble: printf ("%g", expr->u.dval); break;
160     case FcOpString: printf ("\"%s\"", expr->u.sval); break;
161     case FcOpMatrix: printf ("[%g %g %g %g]",
162                               expr->u.mval->xx,
163                               expr->u.mval->xy,
164                               expr->u.mval->yx,
165                               expr->u.mval->yy); break;
166     case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
167     case FcOpCharSet: printf ("charset\n"); break;
168     case FcOpNil: printf ("nil\n"); break;
169     case FcOpField: printf ("%s", expr->u.field); break;
170     case FcOpConst: printf ("%s", expr->u.constant); break;
171     case FcOpQuest:
172         FcExprPrint (expr->u.tree.left);
173         printf (" quest ");
174         FcExprPrint (expr->u.tree.right->u.tree.left);
175         printf (" colon ");
176         FcExprPrint (expr->u.tree.right->u.tree.right);
177         break;
178     case FcOpAssign:
179     case FcOpAssignReplace:
180     case FcOpPrependFirst:
181     case FcOpPrepend:
182     case FcOpAppend:
183     case FcOpAppendLast:
184     case FcOpOr:
185     case FcOpAnd:
186     case FcOpEqual:
187     case FcOpNotEqual:
188     case FcOpLess:
189     case FcOpLessEqual:
190     case FcOpMore:
191     case FcOpMoreEqual:
192     case FcOpContains:
193     case FcOpNotContains:
194     case FcOpPlus:
195     case FcOpMinus:
196     case FcOpTimes:
197     case FcOpDivide:
198     case FcOpComma:
199         FcExprPrint (expr->u.tree.left);
200         printf (" ");
201         switch (expr->op) {
202         case FcOpAssign: printf ("Assign"); break;
203         case FcOpAssignReplace: printf ("AssignReplace"); break;
204         case FcOpPrependFirst: printf ("PrependFirst"); break;
205         case FcOpPrepend: printf ("Prepend"); break;
206         case FcOpAppend: printf ("Append"); break;
207         case FcOpAppendLast: printf ("AppendLast"); break;
208         case FcOpOr: printf ("Or"); break;
209         case FcOpAnd: printf ("And"); break;
210         case FcOpEqual: printf ("Equal"); break;
211         case FcOpNotEqual: printf ("NotEqual"); break;
212         case FcOpLess: printf ("Less"); break;
213         case FcOpLessEqual: printf ("LessEqual"); break;
214         case FcOpMore: printf ("More"); break;
215         case FcOpMoreEqual: printf ("MoreEqual"); break;
216         case FcOpContains: printf ("Contains"); break;
217         case FcOpNotContains: printf ("NotContains"); break;
218         case FcOpPlus: printf ("Plus"); break;
219         case FcOpMinus: printf ("Minus"); break;
220         case FcOpTimes: printf ("Times"); break;
221         case FcOpDivide: printf ("Divide"); break;
222         case FcOpComma: printf ("Comma"); break;
223         default: break;
224         }
225         printf (" ");
226         FcExprPrint (expr->u.tree.right);
227         break;
228     case FcOpNot:
229         printf ("Not ");
230         FcExprPrint (expr->u.tree.left);
231         break;
232     case FcOpInvalid: printf ("Invalid"); break;
233     }
234 }
235
236 void
237 FcTestPrint (const FcTest *test)
238 {
239     switch (test->kind) {
240     case FcMatchPattern:
241         printf ("pattern ");
242         break;
243     case FcMatchFont:
244         printf ("font ");
245         break;
246     }
247     switch (test->qual) {
248     case FcQualAny:
249         printf ("any ");
250         break;
251     case FcQualAll:
252         printf ("all ");
253         break;
254     case FcQualFirst:
255         printf ("first ");
256         break;
257     case FcQualNotFirst:
258         printf ("not_first ");
259         break;
260     }
261     printf ("%s ", test->field);
262     FcOpPrint (test->op);
263     printf (" ");
264     FcExprPrint (test->expr);
265     printf ("\n");
266 }
267
268 void
269 FcEditPrint (const FcEdit *edit)
270 {
271     printf ("Edit %s ", edit->field);
272     FcOpPrint (edit->op);
273     printf (" ");
274     FcExprPrint (edit->expr);
275 }
276
277 void
278 FcSubstPrint (const FcSubst *subst)
279 {
280     FcEdit      *e;
281     FcTest      *t;
282     
283     printf ("match\n");
284     for (t = subst->test; t; t = t->next)
285     {
286         printf ("\t");
287         FcTestPrint (t);
288     }
289     printf ("edit\n");
290     for (e = subst->edit; e; e = e->next)
291     {
292         printf ("\t");
293         FcEditPrint (e);
294         printf (";\n");
295     }
296     printf ("\n");
297 }
298
299 void
300 FcFontSetPrint (const FcFontSet *s)
301 {
302     int     i;
303
304     printf ("FontSet %d of %d\n", s->nfont, s->sfont);
305     for (i = 0; i < s->nfont; i++)
306     {
307         printf ("Font %d ", i);
308         FcPatternPrint (s->fonts[i]);
309     }
310 }
311
312 int
313 FcDebug (void)
314 {
315     static int  initialized;
316     static int  debug;
317
318     if (!initialized)
319     {
320         char    *e;
321
322         initialized = 1;
323         e = getenv ("FC_DEBUG");
324         if (e)
325         {
326             printf ("FC_DEBUG=%s\n", e);
327             debug = atoi (e);
328             if (debug < 0)
329                 debug = 0;
330         }
331     }
332     return debug;
333 }