Make FcCacheIsMmapSafe() threadsafe
[platform/upstream/fontconfig.git] / src / fcdbg.c
1 /*
2  * fontconfig/src/fcdbg.c
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 the author(s) not be used in
11  * advertising or publicity pertaining to distribution of the software without
12  * specific, written prior permission.  The authors make 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  * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL THE AUTHOR(S) 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 static void
30 _FcValuePrintFile (FILE *f, const FcValue v)
31 {
32     switch (v.type) {
33     case FcTypeVoid:
34         fprintf (f, "<void>");
35         break;
36     case FcTypeInteger:
37         fprintf (f, "%d(i)", v.u.i);
38         break;
39     case FcTypeDouble:
40         fprintf (f, "%g(f)", v.u.d);
41         break;
42     case FcTypeString:
43         fprintf (f, "\"%s\"", v.u.s);
44         break;
45     case FcTypeBool:
46         fprintf (f, "%s", v.u.b ? "True" : "False");
47         break;
48     case FcTypeMatrix:
49         fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
50         break;
51     case FcTypeCharSet: /* XXX */
52         if (f == stdout)
53             FcCharSetPrint (v.u.c);
54         break;
55     case FcTypeLangSet:
56         FcLangSetPrint (v.u.l);
57         break;
58     case FcTypeFTFace:
59         fprintf (f, "face");
60         break;
61     }
62 }
63
64 void
65 FcValuePrintFile (FILE *f, const FcValue v)
66 {
67     fprintf (f, " ");
68     _FcValuePrintFile (f, v);
69 }
70
71 void
72 FcValuePrint (const FcValue v)
73 {
74     printf (" ");
75     _FcValuePrintFile (stdout, v);
76 }
77
78 void
79 FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
80 {
81     if (show_pos_mark)
82         printf (" [insert here] ");
83     else
84         printf (" ");
85     _FcValuePrintFile (stdout, v);
86 }
87
88 static void
89 FcValueBindingPrint (const FcValueListPtr l)
90 {
91     switch (l->binding) {
92     case FcValueBindingWeak:
93         printf ("(w)");
94         break;
95     case FcValueBindingStrong:
96         printf ("(s)");
97         break;
98     case FcValueBindingSame:
99         printf ("(=)");
100         break;
101     }
102 }
103
104 void
105 FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos)
106 {
107     for (; l != NULL; l = FcValueListNext(l))
108     {
109         FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos);
110         FcValueBindingPrint (l);
111     }
112     if (!pos)
113         printf (" [insert here]");
114 }
115
116 void
117 FcValueListPrint (FcValueListPtr l)
118 {
119     for (; l != NULL; l = FcValueListNext(l))
120     {
121         FcValuePrint (FcValueCanonicalize (&l->value));
122         FcValueBindingPrint (l);
123     }
124 }
125
126 void
127 FcLangSetPrint (const FcLangSet *ls)
128 {
129     FcStrBuf    buf;
130     FcChar8     init_buf[1024];
131
132     FcStrBufInit (&buf, init_buf, sizeof (init_buf));
133     if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
134        printf ("%s", buf.buf);
135     else
136        printf ("langset (alloc error)");
137     FcStrBufDestroy (&buf);
138 }
139
140 void
141 FcCharSetPrint (const FcCharSet *c)
142 {
143     int i, j;
144     intptr_t    *leaves = FcCharSetLeaves (c);
145     FcChar16    *numbers = FcCharSetNumbers (c);
146
147 #if 0
148     printf ("CharSet  0x%x\n", (intptr_t) c);
149     printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
150     printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
151
152     for (i = 0; i < c->num; i++)
153     {
154         printf ("Page %d: %04x +%d = 0x%x\n",
155                 i, numbers[i], leaves[i],
156                 (intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
157     }
158 #endif
159                 
160     printf ("\n");
161     for (i = 0; i < c->num; i++)
162     {
163         intptr_t        leaf_offset = leaves[i];
164         FcCharLeaf      *leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf);
165         
166         printf ("\t");
167         printf ("%04x:", numbers[i]);
168         for (j = 0; j < 256/32; j++)
169             printf (" %08x", leaf->map[j]);
170         printf ("\n");
171     }
172 }
173
174 void
175 FcPatternPrint (const FcPattern *p)
176 {
177     int             i;
178     FcPatternElt   *e;
179
180     if (!p)
181     {
182         printf ("Null pattern\n");
183         return;
184     }
185     printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
186     for (i = 0; i < p->num; i++)
187     {
188         e = &FcPatternElts(p)[i];
189         printf ("\t%s:", FcObjectName(e->object));
190         FcValueListPrint (FcPatternEltValues(e));
191         printf ("\n");
192     }
193     printf ("\n");
194 }
195
196 #define FcOpFlagsPrint(_o_)             \
197     {                                   \
198         int f = FC_OP_GET_FLAGS (_o_);  \
199         if (f & FcOpFlagIgnoreBlanks)   \
200             printf ("(ignore blanks)"); \
201     }
202
203 void
204 FcOpPrint (FcOp op_)
205 {
206     FcOp op = FC_OP_GET_OP (op_);
207
208     switch (op) {
209     case FcOpInteger: printf ("Integer"); break;
210     case FcOpDouble: printf ("Double"); break;
211     case FcOpString: printf ("String"); break;
212     case FcOpMatrix: printf ("Matrix"); break;
213     case FcOpRange: printf ("Range"); break;
214     case FcOpBool: printf ("Bool"); break;
215     case FcOpCharSet: printf ("CharSet"); break;
216     case FcOpLangSet: printf ("LangSet"); break;
217     case FcOpField: printf ("Field"); break;
218     case FcOpConst: printf ("Const"); break;
219     case FcOpAssign: printf ("Assign"); break;
220     case FcOpAssignReplace: printf ("AssignReplace"); break;
221     case FcOpPrepend: printf ("Prepend"); break;
222     case FcOpPrependFirst: printf ("PrependFirst"); break;
223     case FcOpAppend: printf ("Append"); break;
224     case FcOpAppendLast: printf ("AppendLast"); break;
225     case FcOpQuest: printf ("Quest"); break;
226     case FcOpOr: printf ("Or"); break;
227     case FcOpAnd: printf ("And"); break;
228     case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break;
229     case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break;
230     case FcOpLess: printf ("Less"); break;
231     case FcOpLessEqual: printf ("LessEqual"); break;
232     case FcOpMore: printf ("More"); break;
233     case FcOpMoreEqual: printf ("MoreEqual"); break;
234     case FcOpContains: printf ("Contains"); 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 FcOpNot: printf ("Not"); break;
241     case FcOpNil: printf ("Nil"); break;
242     case FcOpComma: printf ("Comma"); break;
243     case FcOpFloor: printf ("Floor"); break;
244     case FcOpCeil: printf ("Ceil"); break;
245     case FcOpRound: printf ("Round"); break;
246     case FcOpTrunc: printf ("Trunc"); break;
247     case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break;
248     case FcOpInvalid: printf ("Invalid"); break;
249     }
250 }
251
252 void
253 FcExprPrint (const FcExpr *expr)
254 {
255     if (!expr) printf ("none");
256     else switch (FC_OP_GET_OP (expr->op)) {
257     case FcOpInteger: printf ("%d", expr->u.ival); break;
258     case FcOpDouble: printf ("%g", expr->u.dval); break;
259     case FcOpString: printf ("\"%s\"", expr->u.sval); break;
260     case FcOpMatrix:
261         printf ("[");
262         FcExprPrint (expr->u.mexpr->xx);
263         printf (" ");
264         FcExprPrint (expr->u.mexpr->xy);
265         printf ("; ");
266         FcExprPrint (expr->u.mexpr->yx);
267         printf (" ");
268         FcExprPrint (expr->u.mexpr->yy);
269         printf ("]");
270         break;
271     case FcOpRange: break;
272     case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
273     case FcOpCharSet: printf ("charset\n"); break;
274     case FcOpLangSet:
275         printf ("langset:");
276         FcLangSetPrint(expr->u.lval);
277         printf ("\n");
278         break;
279     case FcOpNil: printf ("nil\n"); break;
280     case FcOpField: printf ("%s ", FcObjectName(expr->u.name.object));
281       switch ((int) expr->u.name.kind) {
282       case FcMatchPattern:
283           printf ("(pattern) ");
284           break;
285       case FcMatchFont:
286           printf ("(font) ");
287           break;
288       }
289       break;
290     case FcOpConst: printf ("%s", expr->u.constant); break;
291     case FcOpQuest:
292         FcExprPrint (expr->u.tree.left);
293         printf (" quest ");
294         FcExprPrint (expr->u.tree.right->u.tree.left);
295         printf (" colon ");
296         FcExprPrint (expr->u.tree.right->u.tree.right);
297         break;
298     case FcOpAssign:
299     case FcOpAssignReplace:
300     case FcOpPrependFirst:
301     case FcOpPrepend:
302     case FcOpAppend:
303     case FcOpAppendLast:
304     case FcOpOr:
305     case FcOpAnd:
306     case FcOpEqual:
307     case FcOpNotEqual:
308     case FcOpLess:
309     case FcOpLessEqual:
310     case FcOpMore:
311     case FcOpMoreEqual:
312     case FcOpContains:
313     case FcOpListing:
314     case FcOpNotContains:
315     case FcOpPlus:
316     case FcOpMinus:
317     case FcOpTimes:
318     case FcOpDivide:
319     case FcOpComma:
320         FcExprPrint (expr->u.tree.left);
321         printf (" ");
322         switch (FC_OP_GET_OP (expr->op)) {
323         case FcOpAssign: printf ("Assign"); break;
324         case FcOpAssignReplace: printf ("AssignReplace"); break;
325         case FcOpPrependFirst: printf ("PrependFirst"); break;
326         case FcOpPrepend: printf ("Prepend"); break;
327         case FcOpAppend: printf ("Append"); break;
328         case FcOpAppendLast: printf ("AppendLast"); break;
329         case FcOpOr: printf ("Or"); break;
330         case FcOpAnd: printf ("And"); break;
331         case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break;
332         case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break;
333         case FcOpLess: printf ("Less"); break;
334         case FcOpLessEqual: printf ("LessEqual"); break;
335         case FcOpMore: printf ("More"); break;
336         case FcOpMoreEqual: printf ("MoreEqual"); break;
337         case FcOpContains: printf ("Contains"); break;
338         case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break;
339         case FcOpNotContains: printf ("NotContains"); break;
340         case FcOpPlus: printf ("Plus"); break;
341         case FcOpMinus: printf ("Minus"); break;
342         case FcOpTimes: printf ("Times"); break;
343         case FcOpDivide: printf ("Divide"); break;
344         case FcOpComma: printf ("Comma"); break;
345         default: break;
346         }
347         printf (" ");
348         FcExprPrint (expr->u.tree.right);
349         break;
350     case FcOpNot:
351         printf ("Not ");
352         FcExprPrint (expr->u.tree.left);
353         break;
354     case FcOpFloor:
355         printf ("Floor ");
356         FcExprPrint (expr->u.tree.left);
357         break;
358     case FcOpCeil:
359         printf ("Ceil ");
360         FcExprPrint (expr->u.tree.left);
361         break;
362     case FcOpRound:
363         printf ("Round ");
364         FcExprPrint (expr->u.tree.left);
365         break;
366     case FcOpTrunc:
367         printf ("Trunc ");
368         FcExprPrint (expr->u.tree.left);
369         break;
370     case FcOpInvalid: printf ("Invalid"); break;
371     }
372 }
373
374 void
375 FcTestPrint (const FcTest *test)
376 {
377     switch (test->kind) {
378     case FcMatchPattern:
379         printf ("pattern ");
380         break;
381     case FcMatchFont:
382         printf ("font ");
383         break;
384     case FcMatchScan:
385         printf ("scan ");
386         break;
387     }
388     switch (test->qual) {
389     case FcQualAny:
390         printf ("any ");
391         break;
392     case FcQualAll:
393         printf ("all ");
394         break;
395     case FcQualFirst:
396         printf ("first ");
397         break;
398     case FcQualNotFirst:
399         printf ("not_first ");
400         break;
401     }
402     printf ("%s ", FcObjectName (test->object));
403     FcOpPrint (test->op);
404     printf (" ");
405     FcExprPrint (test->expr);
406     printf ("\n");
407 }
408
409 void
410 FcEditPrint (const FcEdit *edit)
411 {
412     printf ("Edit %s ", FcObjectName (edit->object));
413     FcOpPrint (edit->op);
414     printf (" ");
415     FcExprPrint (edit->expr);
416 }
417
418 void
419 FcSubstPrint (const FcSubst *subst)
420 {
421     FcEdit      *e;
422     FcTest      *t;
423
424     printf ("match\n");
425     for (t = subst->test; t; t = t->next)
426     {
427         printf ("\t");
428         FcTestPrint (t);
429     }
430     printf ("edit\n");
431     for (e = subst->edit; e; e = e->next)
432     {
433         printf ("\t");
434         FcEditPrint (e);
435         printf (";\n");
436     }
437     printf ("\n");
438 }
439
440 void
441 FcFontSetPrint (const FcFontSet *s)
442 {
443     int     i;
444
445     printf ("FontSet %d of %d\n", s->nfont, s->sfont);
446     for (i = 0; i < s->nfont; i++)
447     {
448         printf ("Font %d ", i);
449         FcPatternPrint (s->fonts[i]);
450     }
451 }
452
453 int FcDebugVal;
454
455 void
456 FcInitDebug (void)
457 {
458     if (!FcDebugVal) {
459         char    *e;
460
461         e = getenv ("FC_DEBUG");
462         if (e)
463         {
464             printf ("FC_DEBUG=%s\n", e);
465             FcDebugVal = atoi (e);
466             if (FcDebugVal < 0)
467                 FcDebugVal = 0;
468         }
469     }
470 }
471 #define __fcdbg__
472 #include "fcaliastail.h"
473 #undef __fcdbg__