fcdbg.c revision a6844aab
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 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 * 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
29void
30FcValuePrint (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
65void
66FcValueListPrint (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
85void
86FcLangSetPrint (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
99void
100FcCharSetPrint (const FcCharSet *c)
101{
102    int	i, j;
103    intptr_t	*leaves = FcCharSetLeaves (c);
104    FcChar16	*numbers = FcCharSetNumbers (c);
105
106#if 0
107    printf ("CharSet  0x%x\n", (intptr_t) c);
108    printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
109    printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
110
111    for (i = 0; i < c->num; i++)
112    {
113	printf ("Page %d: %04x +%d = 0x%x\n",
114		i, numbers[i], leaves[i],
115		(intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
116    }
117#endif
118
119    printf ("\n");
120    for (i = 0; i < c->num; i++)
121    {
122	intptr_t	leaf_offset = leaves[i];
123	FcCharLeaf	*leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf);
124
125	printf ("\t");
126	printf ("%04x:", numbers[i]);
127	for (j = 0; j < 256/32; j++)
128	    printf (" %08x", leaf->map[j]);
129	printf ("\n");
130    }
131}
132
133void
134FcPatternPrint (const FcPattern *p)
135{
136    int		    i;
137    FcPatternElt   *e;
138
139    if (!p)
140    {
141	printf ("Null pattern\n");
142	return;
143    }
144    printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
145    for (i = 0; i < p->num; i++)
146    {
147	e = &FcPatternElts(p)[i];
148	printf ("\t%s:", FcObjectName(e->object));
149	FcValueListPrint (FcPatternEltValues(e));
150	printf ("\n");
151    }
152    printf ("\n");
153}
154
155void
156FcOpPrint (FcOp op)
157{
158    switch (op) {
159    case FcOpInteger: printf ("Integer"); break;
160    case FcOpDouble: printf ("Double"); break;
161    case FcOpString: printf ("String"); break;
162    case FcOpMatrix: printf ("Matrix"); break;
163    case FcOpBool: printf ("Bool"); break;
164    case FcOpCharSet: printf ("CharSet"); break;
165    case FcOpField: printf ("Field"); break;
166    case FcOpConst: printf ("Const"); break;
167    case FcOpAssign: printf ("Assign"); break;
168    case FcOpAssignReplace: printf ("AssignReplace"); break;
169    case FcOpPrepend: printf ("Prepend"); break;
170    case FcOpPrependFirst: printf ("PrependFirst"); break;
171    case FcOpAppend: printf ("Append"); break;
172    case FcOpAppendLast: printf ("AppendLast"); break;
173    case FcOpQuest: printf ("Quest"); break;
174    case FcOpOr: printf ("Or"); break;
175    case FcOpAnd: printf ("And"); break;
176    case FcOpEqual: printf ("Equal"); break;
177    case FcOpNotEqual: printf ("NotEqual"); break;
178    case FcOpLess: printf ("Less"); break;
179    case FcOpLessEqual: printf ("LessEqual"); break;
180    case FcOpMore: printf ("More"); break;
181    case FcOpMoreEqual: printf ("MoreEqual"); break;
182    case FcOpContains: printf ("Contains"); break;
183    case FcOpNotContains: printf ("NotContains"); break;
184    case FcOpPlus: printf ("Plus"); break;
185    case FcOpMinus: printf ("Minus"); break;
186    case FcOpTimes: printf ("Times"); break;
187    case FcOpDivide: printf ("Divide"); break;
188    case FcOpNot: printf ("Not"); break;
189    case FcOpNil: printf ("Nil"); break;
190    case FcOpComma: printf ("Comma"); break;
191    case FcOpFloor: printf ("Floor"); break;
192    case FcOpCeil: printf ("Ceil"); break;
193    case FcOpRound: printf ("Round"); break;
194    case FcOpTrunc: printf ("Trunc"); break;
195    case FcOpListing: printf ("Listing"); break;
196    case FcOpInvalid: printf ("Invalid"); break;
197    }
198}
199
200void
201FcExprPrint (const FcExpr *expr)
202{
203    if (!expr) printf ("none");
204    else switch (expr->op) {
205    case FcOpInteger: printf ("%d", expr->u.ival); break;
206    case FcOpDouble: printf ("%g", expr->u.dval); break;
207    case FcOpString: printf ("\"%s\"", expr->u.sval); break;
208    case FcOpMatrix: printf ("[%g %g %g %g]",
209			      expr->u.mval->xx,
210			      expr->u.mval->xy,
211			      expr->u.mval->yx,
212			      expr->u.mval->yy); break;
213    case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
214    case FcOpCharSet: printf ("charset\n"); break;
215    case FcOpNil: printf ("nil\n"); break;
216    case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break;
217    case FcOpConst: printf ("%s", expr->u.constant); break;
218    case FcOpQuest:
219	FcExprPrint (expr->u.tree.left);
220	printf (" quest ");
221	FcExprPrint (expr->u.tree.right->u.tree.left);
222	printf (" colon ");
223	FcExprPrint (expr->u.tree.right->u.tree.right);
224	break;
225    case FcOpAssign:
226    case FcOpAssignReplace:
227    case FcOpPrependFirst:
228    case FcOpPrepend:
229    case FcOpAppend:
230    case FcOpAppendLast:
231    case FcOpOr:
232    case FcOpAnd:
233    case FcOpEqual:
234    case FcOpNotEqual:
235    case FcOpLess:
236    case FcOpLessEqual:
237    case FcOpMore:
238    case FcOpMoreEqual:
239    case FcOpContains:
240    case FcOpListing:
241    case FcOpNotContains:
242    case FcOpPlus:
243    case FcOpMinus:
244    case FcOpTimes:
245    case FcOpDivide:
246    case FcOpComma:
247	FcExprPrint (expr->u.tree.left);
248	printf (" ");
249	switch (expr->op) {
250	case FcOpAssign: printf ("Assign"); break;
251	case FcOpAssignReplace: printf ("AssignReplace"); break;
252	case FcOpPrependFirst: printf ("PrependFirst"); break;
253	case FcOpPrepend: printf ("Prepend"); break;
254	case FcOpAppend: printf ("Append"); break;
255	case FcOpAppendLast: printf ("AppendLast"); break;
256	case FcOpOr: printf ("Or"); break;
257	case FcOpAnd: printf ("And"); break;
258	case FcOpEqual: printf ("Equal"); break;
259	case FcOpNotEqual: printf ("NotEqual"); break;
260	case FcOpLess: printf ("Less"); break;
261	case FcOpLessEqual: printf ("LessEqual"); break;
262	case FcOpMore: printf ("More"); break;
263	case FcOpMoreEqual: printf ("MoreEqual"); break;
264	case FcOpContains: printf ("Contains"); break;
265	case FcOpListing: printf ("Listing"); break;
266	case FcOpNotContains: printf ("NotContains"); break;
267	case FcOpPlus: printf ("Plus"); break;
268	case FcOpMinus: printf ("Minus"); break;
269	case FcOpTimes: printf ("Times"); break;
270	case FcOpDivide: printf ("Divide"); break;
271	case FcOpComma: printf ("Comma"); break;
272	default: break;
273	}
274	printf (" ");
275	FcExprPrint (expr->u.tree.right);
276	break;
277    case FcOpNot:
278	printf ("Not ");
279	FcExprPrint (expr->u.tree.left);
280	break;
281    case FcOpFloor:
282	printf ("Floor ");
283	FcExprPrint (expr->u.tree.left);
284	break;
285    case FcOpCeil:
286	printf ("Ceil ");
287	FcExprPrint (expr->u.tree.left);
288	break;
289    case FcOpRound:
290	printf ("Round ");
291	FcExprPrint (expr->u.tree.left);
292	break;
293    case FcOpTrunc:
294	printf ("Trunc ");
295	FcExprPrint (expr->u.tree.left);
296	break;
297    case FcOpInvalid: printf ("Invalid"); break;
298    }
299}
300
301void
302FcTestPrint (const FcTest *test)
303{
304    switch (test->kind) {
305    case FcMatchPattern:
306	printf ("pattern ");
307	break;
308    case FcMatchFont:
309	printf ("font ");
310	break;
311    case FcMatchScan:
312	printf ("scan ");
313	break;
314    }
315    switch (test->qual) {
316    case FcQualAny:
317	printf ("any ");
318	break;
319    case FcQualAll:
320	printf ("all ");
321	break;
322    case FcQualFirst:
323	printf ("first ");
324	break;
325    case FcQualNotFirst:
326	printf ("not_first ");
327	break;
328    }
329    printf ("%s ", FcObjectName (test->object));
330    FcOpPrint (test->op);
331    printf (" ");
332    FcExprPrint (test->expr);
333    printf ("\n");
334}
335
336void
337FcEditPrint (const FcEdit *edit)
338{
339    printf ("Edit %s ", FcObjectName (edit->object));
340    FcOpPrint (edit->op);
341    printf (" ");
342    FcExprPrint (edit->expr);
343}
344
345void
346FcSubstPrint (const FcSubst *subst)
347{
348    FcEdit	*e;
349    FcTest	*t;
350
351    printf ("match\n");
352    for (t = subst->test; t; t = t->next)
353    {
354	printf ("\t");
355	FcTestPrint (t);
356    }
357    printf ("edit\n");
358    for (e = subst->edit; e; e = e->next)
359    {
360	printf ("\t");
361	FcEditPrint (e);
362	printf (";\n");
363    }
364    printf ("\n");
365}
366
367void
368FcFontSetPrint (const FcFontSet *s)
369{
370    int	    i;
371
372    printf ("FontSet %d of %d\n", s->nfont, s->sfont);
373    for (i = 0; i < s->nfont; i++)
374    {
375	printf ("Font %d ", i);
376	FcPatternPrint (s->fonts[i]);
377    }
378}
379
380int FcDebugVal;
381
382void
383FcInitDebug (void)
384{
385    char    *e;
386
387    e = getenv ("FC_DEBUG");
388    if (e)
389    {
390        printf ("FC_DEBUG=%s\n", e);
391        FcDebugVal = atoi (e);
392        if (FcDebugVal < 0)
393   	    FcDebugVal = 0;
394    }
395}
396#define __fcdbg__
397#include "fcaliastail.h"
398#undef __fcdbg__
399