fcdbg.c revision 953daeba
12c393a42Smrg/*
2a6844aabSmrg * fontconfig/src/fcdbg.c
32c393a42Smrg *
42c393a42Smrg * Copyright © 2000 Keith Packard
52c393a42Smrg *
62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its
72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that
82c393a42Smrg * the above copyright notice appear in all copies and that both that
92c393a42Smrg * copyright notice and this permission notice appear in supporting
10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in
112c393a42Smrg * advertising or publicity pertaining to distribution of the software without
12ca08ab68Smrg * specific, written prior permission.  The authors make no
132c393a42Smrg * representations about the suitability of this software for any purpose.  It
142c393a42Smrg * is provided "as is" without express or implied warranty.
152c393a42Smrg *
16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18a6844aabSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE.
232c393a42Smrg */
242c393a42Smrg
252c393a42Smrg#include "fcint.h"
262c393a42Smrg#include <stdio.h>
272c393a42Smrg#include <stdlib.h>
282c393a42Smrg
29ca08ab68Smrgstatic void
30c9710b42Smrg_FcValuePrintFile (FILE *f, const FcValue v)
312c393a42Smrg{
322c393a42Smrg    switch (v.type) {
336fc018e4Smrg    case FcTypeUnknown:
346fc018e4Smrg	fprintf (f, "<unknown>");
356fc018e4Smrg	break;
362c393a42Smrg    case FcTypeVoid:
37c9710b42Smrg	fprintf (f, "<void>");
382c393a42Smrg	break;
392c393a42Smrg    case FcTypeInteger:
40c9710b42Smrg	fprintf (f, "%d(i)", v.u.i);
412c393a42Smrg	break;
422c393a42Smrg    case FcTypeDouble:
43c9710b42Smrg	fprintf (f, "%g(f)", v.u.d);
442c393a42Smrg	break;
452c393a42Smrg    case FcTypeString:
46c9710b42Smrg	fprintf (f, "\"%s\"", v.u.s);
472c393a42Smrg	break;
482c393a42Smrg    case FcTypeBool:
49c9710b42Smrg	fprintf (f, "%s", v.u.b ? "True" : "False");
502c393a42Smrg	break;
512c393a42Smrg    case FcTypeMatrix:
52c9710b42Smrg	fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
532c393a42Smrg	break;
542c393a42Smrg    case FcTypeCharSet:	/* XXX */
55c9710b42Smrg	if (f == stdout)
56c9710b42Smrg	    FcCharSetPrint (v.u.c);
572c393a42Smrg	break;
582c393a42Smrg    case FcTypeLangSet:
592c393a42Smrg	FcLangSetPrint (v.u.l);
602c393a42Smrg	break;
612c393a42Smrg    case FcTypeFTFace:
62c9710b42Smrg	fprintf (f, "face");
632c393a42Smrg	break;
64953daebaSmrg    case FcTypeRange:
65953daebaSmrg	fprintf (f, "[%g %g)", v.u.r->begin, v.u.r->end);
66953daebaSmrg	break;
672c393a42Smrg    }
682c393a42Smrg}
692c393a42Smrg
70c9710b42Smrgvoid
71c9710b42SmrgFcValuePrintFile (FILE *f, const FcValue v)
72c9710b42Smrg{
73c9710b42Smrg    fprintf (f, " ");
74c9710b42Smrg    _FcValuePrintFile (f, v);
75c9710b42Smrg}
76c9710b42Smrg
77ca08ab68Smrgvoid
78ca08ab68SmrgFcValuePrint (const FcValue v)
79ca08ab68Smrg{
80ca08ab68Smrg    printf (" ");
81c9710b42Smrg    _FcValuePrintFile (stdout, v);
82ca08ab68Smrg}
83ca08ab68Smrg
84ca08ab68Smrgvoid
85ca08ab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
86ca08ab68Smrg{
87ca08ab68Smrg    if (show_pos_mark)
88c9710b42Smrg	printf (" [marker] ");
89ca08ab68Smrg    else
90ca08ab68Smrg	printf (" ");
91c9710b42Smrg    _FcValuePrintFile (stdout, v);
92ca08ab68Smrg}
93ca08ab68Smrg
94ca08ab68Smrgstatic void
95ca08ab68SmrgFcValueBindingPrint (const FcValueListPtr l)
96ca08ab68Smrg{
97ca08ab68Smrg    switch (l->binding) {
98ca08ab68Smrg    case FcValueBindingWeak:
99ca08ab68Smrg	printf ("(w)");
100ca08ab68Smrg	break;
101ca08ab68Smrg    case FcValueBindingStrong:
102ca08ab68Smrg	printf ("(s)");
103ca08ab68Smrg	break;
104ca08ab68Smrg    case FcValueBindingSame:
105ca08ab68Smrg	printf ("(=)");
106ca08ab68Smrg	break;
1076fc018e4Smrg    default:
1086fc018e4Smrg	/* shouldn't be reached */
1096fc018e4Smrg	printf ("(?)");
1106fc018e4Smrg	break;
111ca08ab68Smrg    }
112ca08ab68Smrg}
113ca08ab68Smrg
114ca08ab68Smrgvoid
115ca08ab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos)
116ca08ab68Smrg{
117ca08ab68Smrg    for (; l != NULL; l = FcValueListNext(l))
118ca08ab68Smrg    {
119ca08ab68Smrg	FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos);
120ca08ab68Smrg	FcValueBindingPrint (l);
121ca08ab68Smrg    }
122ca08ab68Smrg    if (!pos)
123c9710b42Smrg	printf (" [marker]");
124ca08ab68Smrg}
125ca08ab68Smrg
1262c393a42Smrgvoid
1272c393a42SmrgFcValueListPrint (FcValueListPtr l)
1282c393a42Smrg{
1292c393a42Smrg    for (; l != NULL; l = FcValueListNext(l))
1302c393a42Smrg    {
131ca08ab68Smrg	FcValuePrint (FcValueCanonicalize (&l->value));
132ca08ab68Smrg	FcValueBindingPrint (l);
1332c393a42Smrg    }
1342c393a42Smrg}
1352c393a42Smrg
1362c393a42Smrgvoid
1372c393a42SmrgFcLangSetPrint (const FcLangSet *ls)
1382c393a42Smrg{
1392c393a42Smrg    FcStrBuf	buf;
1402c393a42Smrg    FcChar8	init_buf[1024];
141ca08ab68Smrg
1422c393a42Smrg    FcStrBufInit (&buf, init_buf, sizeof (init_buf));
1432c393a42Smrg    if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
1442c393a42Smrg       printf ("%s", buf.buf);
1452c393a42Smrg    else
1462c393a42Smrg       printf ("langset (alloc error)");
1472c393a42Smrg    FcStrBufDestroy (&buf);
1482c393a42Smrg}
1492c393a42Smrg
1502c393a42Smrgvoid
1512c393a42SmrgFcCharSetPrint (const FcCharSet *c)
1522c393a42Smrg{
1532c393a42Smrg    int	i, j;
1542c393a42Smrg    intptr_t	*leaves = FcCharSetLeaves (c);
1552c393a42Smrg    FcChar16	*numbers = FcCharSetNumbers (c);
156ca08ab68Smrg
1572c393a42Smrg#if 0
1582c393a42Smrg    printf ("CharSet  0x%x\n", (intptr_t) c);
1592c393a42Smrg    printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
1602c393a42Smrg    printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
161ca08ab68Smrg
1622c393a42Smrg    for (i = 0; i < c->num; i++)
1632c393a42Smrg    {
164ca08ab68Smrg	printf ("Page %d: %04x +%d = 0x%x\n",
165ca08ab68Smrg		i, numbers[i], leaves[i],
1662c393a42Smrg		(intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
1672c393a42Smrg    }
1682c393a42Smrg#endif
1692c393a42Smrg
170a6844aabSmrg    printf ("\n");
1712c393a42Smrg    for (i = 0; i < c->num; i++)
1722c393a42Smrg    {
1732c393a42Smrg	intptr_t	leaf_offset = leaves[i];
1742c393a42Smrg	FcCharLeaf	*leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf);
1752c393a42Smrg
176a6844aabSmrg	printf ("\t");
1772c393a42Smrg	printf ("%04x:", numbers[i]);
1782c393a42Smrg	for (j = 0; j < 256/32; j++)
1792c393a42Smrg	    printf (" %08x", leaf->map[j]);
1802c393a42Smrg	printf ("\n");
1812c393a42Smrg    }
1822c393a42Smrg}
1832c393a42Smrg
1842c393a42Smrgvoid
1852c393a42SmrgFcPatternPrint (const FcPattern *p)
1862c393a42Smrg{
1872c393a42Smrg    int		    i;
1882c393a42Smrg    FcPatternElt   *e;
189ca08ab68Smrg
1902c393a42Smrg    if (!p)
1912c393a42Smrg    {
1922c393a42Smrg	printf ("Null pattern\n");
1932c393a42Smrg	return;
1942c393a42Smrg    }
1952c393a42Smrg    printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
1962c393a42Smrg    for (i = 0; i < p->num; i++)
1972c393a42Smrg    {
1982c393a42Smrg	e = &FcPatternElts(p)[i];
1992c393a42Smrg	printf ("\t%s:", FcObjectName(e->object));
200a6844aabSmrg	FcValueListPrint (FcPatternEltValues(e));
2012c393a42Smrg	printf ("\n");
2022c393a42Smrg    }
2032c393a42Smrg    printf ("\n");
2042c393a42Smrg}
2052c393a42Smrg
206ca08ab68Smrg#define FcOpFlagsPrint(_o_)		\
207ca08ab68Smrg    {					\
208ca08ab68Smrg	int f = FC_OP_GET_FLAGS (_o_);	\
209ca08ab68Smrg	if (f & FcOpFlagIgnoreBlanks)	\
210ca08ab68Smrg	    printf ("(ignore blanks)");	\
211ca08ab68Smrg    }
212ca08ab68Smrg
213953daebaSmrgvoid
214953daebaSmrgFcPatternPrint2 (FcPattern         *pp1,
215953daebaSmrg		 FcPattern         *pp2,
216953daebaSmrg		 const FcObjectSet *os)
217953daebaSmrg{
218953daebaSmrg    int i, j, k, pos;
219953daebaSmrg    FcPatternElt *e1, *e2;
220953daebaSmrg    FcPattern *p1, *p2;
221953daebaSmrg
222953daebaSmrg    if (os)
223953daebaSmrg    {
224953daebaSmrg	p1 = FcPatternFilter (pp1, os);
225953daebaSmrg	p2 = FcPatternFilter (pp2, os);
226953daebaSmrg    }
227953daebaSmrg    else
228953daebaSmrg    {
229953daebaSmrg	p1 = pp1;
230953daebaSmrg	p2 = pp2;
231953daebaSmrg    }
232953daebaSmrg    printf ("Pattern has %d elts (size %d), %d elts (size %d)\n",
233953daebaSmrg	    p1->num, p1->size, p2->num, p2->size);
234953daebaSmrg    for (i = 0, j = 0; i < p1->num; i++)
235953daebaSmrg    {
236953daebaSmrg	e1 = &FcPatternElts(p1)[i];
237953daebaSmrg	e2 = &FcPatternElts(p2)[j];
238953daebaSmrg	if (!e2 || e1->object != e2->object)
239953daebaSmrg	{
240953daebaSmrg	    pos = FcPatternPosition (p2, FcObjectName (e1->object));
241953daebaSmrg	    if (pos >= 0)
242953daebaSmrg	    {
243953daebaSmrg		for (k = j; k < pos; k++)
244953daebaSmrg		{
245953daebaSmrg		    e2 = &FcPatternElts(p2)[k];
246953daebaSmrg		    printf ("\t%s: (None) -> ", FcObjectName (e2->object));
247953daebaSmrg		    FcValueListPrint (FcPatternEltValues (e2));
248953daebaSmrg		    printf ("\n");
249953daebaSmrg		}
250953daebaSmrg		j = pos;
251953daebaSmrg		goto cont;
252953daebaSmrg	    }
253953daebaSmrg	    else
254953daebaSmrg	    {
255953daebaSmrg		printf ("\t%s:", FcObjectName (e1->object));
256953daebaSmrg		FcValueListPrint (FcPatternEltValues (e1));
257953daebaSmrg		printf (" -> (None)\n");
258953daebaSmrg	    }
259953daebaSmrg	}
260953daebaSmrg	else
261953daebaSmrg	{
262953daebaSmrg	cont:
263953daebaSmrg	    printf ("\t%s:", FcObjectName (e1->object));
264953daebaSmrg	    FcValueListPrint (FcPatternEltValues (e1));
265953daebaSmrg	    printf (" -> ");
266953daebaSmrg	    e2 = &FcPatternElts(p2)[j];
267953daebaSmrg	    FcValueListPrint (FcPatternEltValues (e2));
268953daebaSmrg	    printf ("\n");
269953daebaSmrg	    j++;
270953daebaSmrg	}
271953daebaSmrg    }
272953daebaSmrg    if (j < p2->num)
273953daebaSmrg    {
274953daebaSmrg	for (k = j; k < p2->num; k++)
275953daebaSmrg	{
276953daebaSmrg	    e2 = &FcPatternElts(p2)[k];
277953daebaSmrg	    if (FcObjectName (e2->object))
278953daebaSmrg	    {
279953daebaSmrg		printf ("\t%s: (None) -> ", FcObjectName (e2->object));
280953daebaSmrg		FcValueListPrint (FcPatternEltValues (e2));
281953daebaSmrg		printf ("\n");
282953daebaSmrg	    }
283953daebaSmrg	}
284953daebaSmrg    }
285953daebaSmrg    if (p1 != pp1)
286953daebaSmrg	FcPatternDestroy (p1);
287953daebaSmrg    if (p2 != pp2)
288953daebaSmrg	FcPatternDestroy (p2);
289953daebaSmrg}
290953daebaSmrg
2912c393a42Smrgvoid
292ca08ab68SmrgFcOpPrint (FcOp op_)
2932c393a42Smrg{
294ca08ab68Smrg    FcOp op = FC_OP_GET_OP (op_);
295ca08ab68Smrg
2962c393a42Smrg    switch (op) {
2972c393a42Smrg    case FcOpInteger: printf ("Integer"); break;
2982c393a42Smrg    case FcOpDouble: printf ("Double"); break;
2992c393a42Smrg    case FcOpString: printf ("String"); break;
3002c393a42Smrg    case FcOpMatrix: printf ("Matrix"); break;
301ca08ab68Smrg    case FcOpRange: printf ("Range"); break;
3022c393a42Smrg    case FcOpBool: printf ("Bool"); break;
3032c393a42Smrg    case FcOpCharSet: printf ("CharSet"); break;
304ca08ab68Smrg    case FcOpLangSet: printf ("LangSet"); break;
3052c393a42Smrg    case FcOpField: printf ("Field"); break;
3062c393a42Smrg    case FcOpConst: printf ("Const"); break;
3072c393a42Smrg    case FcOpAssign: printf ("Assign"); break;
3082c393a42Smrg    case FcOpAssignReplace: printf ("AssignReplace"); break;
3092c393a42Smrg    case FcOpPrepend: printf ("Prepend"); break;
3102c393a42Smrg    case FcOpPrependFirst: printf ("PrependFirst"); break;
3112c393a42Smrg    case FcOpAppend: printf ("Append"); break;
3122c393a42Smrg    case FcOpAppendLast: printf ("AppendLast"); break;
313c9710b42Smrg    case FcOpDelete: printf ("Delete"); break;
314c9710b42Smrg    case FcOpDeleteAll: printf ("DeleteAll"); break;
3152c393a42Smrg    case FcOpQuest: printf ("Quest"); break;
3162c393a42Smrg    case FcOpOr: printf ("Or"); break;
3172c393a42Smrg    case FcOpAnd: printf ("And"); break;
318ca08ab68Smrg    case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break;
319ca08ab68Smrg    case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break;
3202c393a42Smrg    case FcOpLess: printf ("Less"); break;
3212c393a42Smrg    case FcOpLessEqual: printf ("LessEqual"); break;
3222c393a42Smrg    case FcOpMore: printf ("More"); break;
3232c393a42Smrg    case FcOpMoreEqual: printf ("MoreEqual"); break;
3242c393a42Smrg    case FcOpContains: printf ("Contains"); break;
3252c393a42Smrg    case FcOpNotContains: printf ("NotContains"); break;
3262c393a42Smrg    case FcOpPlus: printf ("Plus"); break;
3272c393a42Smrg    case FcOpMinus: printf ("Minus"); break;
3282c393a42Smrg    case FcOpTimes: printf ("Times"); break;
3292c393a42Smrg    case FcOpDivide: printf ("Divide"); break;
3302c393a42Smrg    case FcOpNot: printf ("Not"); break;
3312c393a42Smrg    case FcOpNil: printf ("Nil"); break;
3322c393a42Smrg    case FcOpComma: printf ("Comma"); break;
3332c393a42Smrg    case FcOpFloor: printf ("Floor"); break;
3342c393a42Smrg    case FcOpCeil: printf ("Ceil"); break;
3352c393a42Smrg    case FcOpRound: printf ("Round"); break;
3362c393a42Smrg    case FcOpTrunc: printf ("Trunc"); break;
337ca08ab68Smrg    case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break;
3382c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
3392c393a42Smrg    }
3402c393a42Smrg}
3412c393a42Smrg
3422c393a42Smrgvoid
3432c393a42SmrgFcExprPrint (const FcExpr *expr)
3442c393a42Smrg{
3452c393a42Smrg    if (!expr) printf ("none");
346ca08ab68Smrg    else switch (FC_OP_GET_OP (expr->op)) {
3472c393a42Smrg    case FcOpInteger: printf ("%d", expr->u.ival); break;
3482c393a42Smrg    case FcOpDouble: printf ("%g", expr->u.dval); break;
3492c393a42Smrg    case FcOpString: printf ("\"%s\"", expr->u.sval); break;
350c9710b42Smrg    case FcOpMatrix:
351c9710b42Smrg	printf ("[");
352c9710b42Smrg	FcExprPrint (expr->u.mexpr->xx);
353c9710b42Smrg	printf (" ");
354c9710b42Smrg	FcExprPrint (expr->u.mexpr->xy);
355c9710b42Smrg	printf ("; ");
356c9710b42Smrg	FcExprPrint (expr->u.mexpr->yx);
357c9710b42Smrg	printf (" ");
358c9710b42Smrg	FcExprPrint (expr->u.mexpr->yy);
359c9710b42Smrg	printf ("]");
360c9710b42Smrg	break;
361953daebaSmrg    case FcOpRange:
362953daebaSmrg	printf ("(%g, %g)", expr->u.rval->begin, expr->u.rval->end);
363953daebaSmrg	break;
3642c393a42Smrg    case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
3652c393a42Smrg    case FcOpCharSet: printf ("charset\n"); break;
366ca08ab68Smrg    case FcOpLangSet:
367ca08ab68Smrg	printf ("langset:");
368ca08ab68Smrg	FcLangSetPrint(expr->u.lval);
369ca08ab68Smrg	printf ("\n");
370ca08ab68Smrg	break;
3712c393a42Smrg    case FcOpNil: printf ("nil\n"); break;
372c9710b42Smrg    case FcOpField: printf ("%s ", FcObjectName(expr->u.name.object));
373c9710b42Smrg      switch ((int) expr->u.name.kind) {
374c9710b42Smrg      case FcMatchPattern:
375c9710b42Smrg	  printf ("(pattern) ");
376c9710b42Smrg	  break;
377c9710b42Smrg      case FcMatchFont:
378c9710b42Smrg	  printf ("(font) ");
379c9710b42Smrg	  break;
380c9710b42Smrg      }
381c9710b42Smrg      break;
3822c393a42Smrg    case FcOpConst: printf ("%s", expr->u.constant); break;
3832c393a42Smrg    case FcOpQuest:
3842c393a42Smrg	FcExprPrint (expr->u.tree.left);
3852c393a42Smrg	printf (" quest ");
3862c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.left);
3872c393a42Smrg	printf (" colon ");
3882c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.right);
3892c393a42Smrg	break;
3902c393a42Smrg    case FcOpAssign:
3912c393a42Smrg    case FcOpAssignReplace:
3922c393a42Smrg    case FcOpPrependFirst:
3932c393a42Smrg    case FcOpPrepend:
3942c393a42Smrg    case FcOpAppend:
3952c393a42Smrg    case FcOpAppendLast:
3962c393a42Smrg    case FcOpOr:
3972c393a42Smrg    case FcOpAnd:
3982c393a42Smrg    case FcOpEqual:
3992c393a42Smrg    case FcOpNotEqual:
4002c393a42Smrg    case FcOpLess:
4012c393a42Smrg    case FcOpLessEqual:
4022c393a42Smrg    case FcOpMore:
4032c393a42Smrg    case FcOpMoreEqual:
4042c393a42Smrg    case FcOpContains:
4052c393a42Smrg    case FcOpListing:
4062c393a42Smrg    case FcOpNotContains:
4072c393a42Smrg    case FcOpPlus:
4082c393a42Smrg    case FcOpMinus:
4092c393a42Smrg    case FcOpTimes:
4102c393a42Smrg    case FcOpDivide:
4112c393a42Smrg    case FcOpComma:
4122c393a42Smrg	FcExprPrint (expr->u.tree.left);
4132c393a42Smrg	printf (" ");
414ca08ab68Smrg	switch (FC_OP_GET_OP (expr->op)) {
4152c393a42Smrg	case FcOpAssign: printf ("Assign"); break;
4162c393a42Smrg	case FcOpAssignReplace: printf ("AssignReplace"); break;
4172c393a42Smrg	case FcOpPrependFirst: printf ("PrependFirst"); break;
4182c393a42Smrg	case FcOpPrepend: printf ("Prepend"); break;
4192c393a42Smrg	case FcOpAppend: printf ("Append"); break;
4202c393a42Smrg	case FcOpAppendLast: printf ("AppendLast"); break;
4212c393a42Smrg	case FcOpOr: printf ("Or"); break;
4222c393a42Smrg	case FcOpAnd: printf ("And"); break;
423ca08ab68Smrg	case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break;
424ca08ab68Smrg	case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break;
4252c393a42Smrg	case FcOpLess: printf ("Less"); break;
4262c393a42Smrg	case FcOpLessEqual: printf ("LessEqual"); break;
4272c393a42Smrg	case FcOpMore: printf ("More"); break;
4282c393a42Smrg	case FcOpMoreEqual: printf ("MoreEqual"); break;
4292c393a42Smrg	case FcOpContains: printf ("Contains"); break;
430ca08ab68Smrg	case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break;
4312c393a42Smrg	case FcOpNotContains: printf ("NotContains"); break;
4322c393a42Smrg	case FcOpPlus: printf ("Plus"); break;
4332c393a42Smrg	case FcOpMinus: printf ("Minus"); break;
4342c393a42Smrg	case FcOpTimes: printf ("Times"); break;
4352c393a42Smrg	case FcOpDivide: printf ("Divide"); break;
4362c393a42Smrg	case FcOpComma: printf ("Comma"); break;
4372c393a42Smrg	default: break;
4382c393a42Smrg	}
4392c393a42Smrg	printf (" ");
4402c393a42Smrg	FcExprPrint (expr->u.tree.right);
4412c393a42Smrg	break;
4422c393a42Smrg    case FcOpNot:
4432c393a42Smrg	printf ("Not ");
4442c393a42Smrg	FcExprPrint (expr->u.tree.left);
4452c393a42Smrg	break;
4462c393a42Smrg    case FcOpFloor:
4472c393a42Smrg	printf ("Floor ");
4482c393a42Smrg	FcExprPrint (expr->u.tree.left);
4492c393a42Smrg	break;
4502c393a42Smrg    case FcOpCeil:
4512c393a42Smrg	printf ("Ceil ");
4522c393a42Smrg	FcExprPrint (expr->u.tree.left);
4532c393a42Smrg	break;
4542c393a42Smrg    case FcOpRound:
4552c393a42Smrg	printf ("Round ");
4562c393a42Smrg	FcExprPrint (expr->u.tree.left);
4572c393a42Smrg	break;
4582c393a42Smrg    case FcOpTrunc:
4592c393a42Smrg	printf ("Trunc ");
4602c393a42Smrg	FcExprPrint (expr->u.tree.left);
4612c393a42Smrg	break;
4622c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
4632c393a42Smrg    }
4642c393a42Smrg}
4652c393a42Smrg
4662c393a42Smrgvoid
4672c393a42SmrgFcTestPrint (const FcTest *test)
4682c393a42Smrg{
4692c393a42Smrg    switch (test->kind) {
4702c393a42Smrg    case FcMatchPattern:
4712c393a42Smrg	printf ("pattern ");
4722c393a42Smrg	break;
4732c393a42Smrg    case FcMatchFont:
4742c393a42Smrg	printf ("font ");
4752c393a42Smrg	break;
4762c393a42Smrg    case FcMatchScan:
4772c393a42Smrg	printf ("scan ");
4782c393a42Smrg	break;
4792c393a42Smrg    }
4802c393a42Smrg    switch (test->qual) {
4812c393a42Smrg    case FcQualAny:
4822c393a42Smrg	printf ("any ");
4832c393a42Smrg	break;
4842c393a42Smrg    case FcQualAll:
4852c393a42Smrg	printf ("all ");
4862c393a42Smrg	break;
4872c393a42Smrg    case FcQualFirst:
4882c393a42Smrg	printf ("first ");
4892c393a42Smrg	break;
4902c393a42Smrg    case FcQualNotFirst:
4912c393a42Smrg	printf ("not_first ");
4922c393a42Smrg	break;
4932c393a42Smrg    }
4942c393a42Smrg    printf ("%s ", FcObjectName (test->object));
4952c393a42Smrg    FcOpPrint (test->op);
4962c393a42Smrg    printf (" ");
4972c393a42Smrg    FcExprPrint (test->expr);
4982c393a42Smrg    printf ("\n");
4992c393a42Smrg}
5002c393a42Smrg
5012c393a42Smrgvoid
5022c393a42SmrgFcEditPrint (const FcEdit *edit)
5032c393a42Smrg{
5042c393a42Smrg    printf ("Edit %s ", FcObjectName (edit->object));
5052c393a42Smrg    FcOpPrint (edit->op);
5062c393a42Smrg    printf (" ");
5072c393a42Smrg    FcExprPrint (edit->expr);
5082c393a42Smrg}
5092c393a42Smrg
5102c393a42Smrgvoid
5112c393a42SmrgFcSubstPrint (const FcSubst *subst)
5122c393a42Smrg{
5136fc018e4Smrg    FcRule *r;
5146fc018e4Smrg    FcRuleType last_type = FcRuleUnknown;
515ca08ab68Smrg
5162c393a42Smrg    printf ("match\n");
5176fc018e4Smrg    for (r = subst->rule; r; r = r->next)
5182c393a42Smrg    {
5196fc018e4Smrg	if (last_type != r->type)
5206fc018e4Smrg	{
5216fc018e4Smrg	    switch (r->type) {
5226fc018e4Smrg	    case FcRuleTest:
5236fc018e4Smrg		printf ("[test]\n");
5246fc018e4Smrg		break;
5256fc018e4Smrg	    case FcRuleEdit:
5266fc018e4Smrg		printf ("[edit]\n");
5276fc018e4Smrg		break;
5286fc018e4Smrg	    default:
5296fc018e4Smrg		break;
5306fc018e4Smrg	    }
5316fc018e4Smrg	    last_type = r->type;
5326fc018e4Smrg	}
5332c393a42Smrg	printf ("\t");
5346fc018e4Smrg	switch (r->type) {
5356fc018e4Smrg	case FcRuleTest:
5366fc018e4Smrg	    FcTestPrint (r->u.test);
5376fc018e4Smrg	    break;
5386fc018e4Smrg	case FcRuleEdit:
5396fc018e4Smrg	    FcEditPrint (r->u.edit);
5406fc018e4Smrg	    printf (";\n");
5416fc018e4Smrg	    break;
5426fc018e4Smrg	default:
5436fc018e4Smrg	    break;
5446fc018e4Smrg	}
5452c393a42Smrg    }
5462c393a42Smrg    printf ("\n");
5472c393a42Smrg}
5482c393a42Smrg
5492c393a42Smrgvoid
5502c393a42SmrgFcFontSetPrint (const FcFontSet *s)
5512c393a42Smrg{
5522c393a42Smrg    int	    i;
5532c393a42Smrg
5542c393a42Smrg    printf ("FontSet %d of %d\n", s->nfont, s->sfont);
5552c393a42Smrg    for (i = 0; i < s->nfont; i++)
5562c393a42Smrg    {
5572c393a42Smrg	printf ("Font %d ", i);
5582c393a42Smrg	FcPatternPrint (s->fonts[i]);
5592c393a42Smrg    }
5602c393a42Smrg}
5612c393a42Smrg
5622c393a42Smrgint FcDebugVal;
5632c393a42Smrg
5642c393a42Smrgvoid
5652c393a42SmrgFcInitDebug (void)
5662c393a42Smrg{
567c9710b42Smrg    if (!FcDebugVal) {
568c9710b42Smrg	char    *e;
5692c393a42Smrg
570c9710b42Smrg	e = getenv ("FC_DEBUG");
571c9710b42Smrg	if (e)
572c9710b42Smrg	{
573c9710b42Smrg	    printf ("FC_DEBUG=%s\n", e);
574c9710b42Smrg	    FcDebugVal = atoi (e);
575c9710b42Smrg	    if (FcDebugVal < 0)
576c9710b42Smrg		FcDebugVal = 0;
577c9710b42Smrg	}
5782c393a42Smrg    }
5792c393a42Smrg}
5802c393a42Smrg#define __fcdbg__
5812c393a42Smrg#include "fcaliastail.h"
5822c393a42Smrg#undef __fcdbg__
583