fcdbg.c revision 6fc018e4
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;
642c393a42Smrg    }
652c393a42Smrg}
662c393a42Smrg
67c9710b42Smrgvoid
68c9710b42SmrgFcValuePrintFile (FILE *f, const FcValue v)
69c9710b42Smrg{
70c9710b42Smrg    fprintf (f, " ");
71c9710b42Smrg    _FcValuePrintFile (f, v);
72c9710b42Smrg}
73c9710b42Smrg
74ca08ab68Smrgvoid
75ca08ab68SmrgFcValuePrint (const FcValue v)
76ca08ab68Smrg{
77ca08ab68Smrg    printf (" ");
78c9710b42Smrg    _FcValuePrintFile (stdout, v);
79ca08ab68Smrg}
80ca08ab68Smrg
81ca08ab68Smrgvoid
82ca08ab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
83ca08ab68Smrg{
84ca08ab68Smrg    if (show_pos_mark)
85c9710b42Smrg	printf (" [marker] ");
86ca08ab68Smrg    else
87ca08ab68Smrg	printf (" ");
88c9710b42Smrg    _FcValuePrintFile (stdout, v);
89ca08ab68Smrg}
90ca08ab68Smrg
91ca08ab68Smrgstatic void
92ca08ab68SmrgFcValueBindingPrint (const FcValueListPtr l)
93ca08ab68Smrg{
94ca08ab68Smrg    switch (l->binding) {
95ca08ab68Smrg    case FcValueBindingWeak:
96ca08ab68Smrg	printf ("(w)");
97ca08ab68Smrg	break;
98ca08ab68Smrg    case FcValueBindingStrong:
99ca08ab68Smrg	printf ("(s)");
100ca08ab68Smrg	break;
101ca08ab68Smrg    case FcValueBindingSame:
102ca08ab68Smrg	printf ("(=)");
103ca08ab68Smrg	break;
1046fc018e4Smrg    default:
1056fc018e4Smrg	/* shouldn't be reached */
1066fc018e4Smrg	printf ("(?)");
1076fc018e4Smrg	break;
108ca08ab68Smrg    }
109ca08ab68Smrg}
110ca08ab68Smrg
111ca08ab68Smrgvoid
112ca08ab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos)
113ca08ab68Smrg{
114ca08ab68Smrg    for (; l != NULL; l = FcValueListNext(l))
115ca08ab68Smrg    {
116ca08ab68Smrg	FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos);
117ca08ab68Smrg	FcValueBindingPrint (l);
118ca08ab68Smrg    }
119ca08ab68Smrg    if (!pos)
120c9710b42Smrg	printf (" [marker]");
121ca08ab68Smrg}
122ca08ab68Smrg
1232c393a42Smrgvoid
1242c393a42SmrgFcValueListPrint (FcValueListPtr l)
1252c393a42Smrg{
1262c393a42Smrg    for (; l != NULL; l = FcValueListNext(l))
1272c393a42Smrg    {
128ca08ab68Smrg	FcValuePrint (FcValueCanonicalize (&l->value));
129ca08ab68Smrg	FcValueBindingPrint (l);
1302c393a42Smrg    }
1312c393a42Smrg}
1322c393a42Smrg
1332c393a42Smrgvoid
1342c393a42SmrgFcLangSetPrint (const FcLangSet *ls)
1352c393a42Smrg{
1362c393a42Smrg    FcStrBuf	buf;
1372c393a42Smrg    FcChar8	init_buf[1024];
138ca08ab68Smrg
1392c393a42Smrg    FcStrBufInit (&buf, init_buf, sizeof (init_buf));
1402c393a42Smrg    if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
1412c393a42Smrg       printf ("%s", buf.buf);
1422c393a42Smrg    else
1432c393a42Smrg       printf ("langset (alloc error)");
1442c393a42Smrg    FcStrBufDestroy (&buf);
1452c393a42Smrg}
1462c393a42Smrg
1472c393a42Smrgvoid
1482c393a42SmrgFcCharSetPrint (const FcCharSet *c)
1492c393a42Smrg{
1502c393a42Smrg    int	i, j;
1512c393a42Smrg    intptr_t	*leaves = FcCharSetLeaves (c);
1522c393a42Smrg    FcChar16	*numbers = FcCharSetNumbers (c);
153ca08ab68Smrg
1542c393a42Smrg#if 0
1552c393a42Smrg    printf ("CharSet  0x%x\n", (intptr_t) c);
1562c393a42Smrg    printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
1572c393a42Smrg    printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
158ca08ab68Smrg
1592c393a42Smrg    for (i = 0; i < c->num; i++)
1602c393a42Smrg    {
161ca08ab68Smrg	printf ("Page %d: %04x +%d = 0x%x\n",
162ca08ab68Smrg		i, numbers[i], leaves[i],
1632c393a42Smrg		(intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
1642c393a42Smrg    }
1652c393a42Smrg#endif
1662c393a42Smrg
167a6844aabSmrg    printf ("\n");
1682c393a42Smrg    for (i = 0; i < c->num; i++)
1692c393a42Smrg    {
1702c393a42Smrg	intptr_t	leaf_offset = leaves[i];
1712c393a42Smrg	FcCharLeaf	*leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf);
1722c393a42Smrg
173a6844aabSmrg	printf ("\t");
1742c393a42Smrg	printf ("%04x:", numbers[i]);
1752c393a42Smrg	for (j = 0; j < 256/32; j++)
1762c393a42Smrg	    printf (" %08x", leaf->map[j]);
1772c393a42Smrg	printf ("\n");
1782c393a42Smrg    }
1792c393a42Smrg}
1802c393a42Smrg
1812c393a42Smrgvoid
1822c393a42SmrgFcPatternPrint (const FcPattern *p)
1832c393a42Smrg{
1842c393a42Smrg    int		    i;
1852c393a42Smrg    FcPatternElt   *e;
186ca08ab68Smrg
1872c393a42Smrg    if (!p)
1882c393a42Smrg    {
1892c393a42Smrg	printf ("Null pattern\n");
1902c393a42Smrg	return;
1912c393a42Smrg    }
1922c393a42Smrg    printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
1932c393a42Smrg    for (i = 0; i < p->num; i++)
1942c393a42Smrg    {
1952c393a42Smrg	e = &FcPatternElts(p)[i];
1962c393a42Smrg	printf ("\t%s:", FcObjectName(e->object));
197a6844aabSmrg	FcValueListPrint (FcPatternEltValues(e));
1982c393a42Smrg	printf ("\n");
1992c393a42Smrg    }
2002c393a42Smrg    printf ("\n");
2012c393a42Smrg}
2022c393a42Smrg
203ca08ab68Smrg#define FcOpFlagsPrint(_o_)		\
204ca08ab68Smrg    {					\
205ca08ab68Smrg	int f = FC_OP_GET_FLAGS (_o_);	\
206ca08ab68Smrg	if (f & FcOpFlagIgnoreBlanks)	\
207ca08ab68Smrg	    printf ("(ignore blanks)");	\
208ca08ab68Smrg    }
209ca08ab68Smrg
2102c393a42Smrgvoid
211ca08ab68SmrgFcOpPrint (FcOp op_)
2122c393a42Smrg{
213ca08ab68Smrg    FcOp op = FC_OP_GET_OP (op_);
214ca08ab68Smrg
2152c393a42Smrg    switch (op) {
2162c393a42Smrg    case FcOpInteger: printf ("Integer"); break;
2172c393a42Smrg    case FcOpDouble: printf ("Double"); break;
2182c393a42Smrg    case FcOpString: printf ("String"); break;
2192c393a42Smrg    case FcOpMatrix: printf ("Matrix"); break;
220ca08ab68Smrg    case FcOpRange: printf ("Range"); break;
2212c393a42Smrg    case FcOpBool: printf ("Bool"); break;
2222c393a42Smrg    case FcOpCharSet: printf ("CharSet"); break;
223ca08ab68Smrg    case FcOpLangSet: printf ("LangSet"); break;
2242c393a42Smrg    case FcOpField: printf ("Field"); break;
2252c393a42Smrg    case FcOpConst: printf ("Const"); break;
2262c393a42Smrg    case FcOpAssign: printf ("Assign"); break;
2272c393a42Smrg    case FcOpAssignReplace: printf ("AssignReplace"); break;
2282c393a42Smrg    case FcOpPrepend: printf ("Prepend"); break;
2292c393a42Smrg    case FcOpPrependFirst: printf ("PrependFirst"); break;
2302c393a42Smrg    case FcOpAppend: printf ("Append"); break;
2312c393a42Smrg    case FcOpAppendLast: printf ("AppendLast"); break;
232c9710b42Smrg    case FcOpDelete: printf ("Delete"); break;
233c9710b42Smrg    case FcOpDeleteAll: printf ("DeleteAll"); break;
2342c393a42Smrg    case FcOpQuest: printf ("Quest"); break;
2352c393a42Smrg    case FcOpOr: printf ("Or"); break;
2362c393a42Smrg    case FcOpAnd: printf ("And"); break;
237ca08ab68Smrg    case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break;
238ca08ab68Smrg    case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break;
2392c393a42Smrg    case FcOpLess: printf ("Less"); break;
2402c393a42Smrg    case FcOpLessEqual: printf ("LessEqual"); break;
2412c393a42Smrg    case FcOpMore: printf ("More"); break;
2422c393a42Smrg    case FcOpMoreEqual: printf ("MoreEqual"); break;
2432c393a42Smrg    case FcOpContains: printf ("Contains"); break;
2442c393a42Smrg    case FcOpNotContains: printf ("NotContains"); break;
2452c393a42Smrg    case FcOpPlus: printf ("Plus"); break;
2462c393a42Smrg    case FcOpMinus: printf ("Minus"); break;
2472c393a42Smrg    case FcOpTimes: printf ("Times"); break;
2482c393a42Smrg    case FcOpDivide: printf ("Divide"); break;
2492c393a42Smrg    case FcOpNot: printf ("Not"); break;
2502c393a42Smrg    case FcOpNil: printf ("Nil"); break;
2512c393a42Smrg    case FcOpComma: printf ("Comma"); break;
2522c393a42Smrg    case FcOpFloor: printf ("Floor"); break;
2532c393a42Smrg    case FcOpCeil: printf ("Ceil"); break;
2542c393a42Smrg    case FcOpRound: printf ("Round"); break;
2552c393a42Smrg    case FcOpTrunc: printf ("Trunc"); break;
256ca08ab68Smrg    case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break;
2572c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
2582c393a42Smrg    }
2592c393a42Smrg}
2602c393a42Smrg
2612c393a42Smrgvoid
2622c393a42SmrgFcExprPrint (const FcExpr *expr)
2632c393a42Smrg{
2642c393a42Smrg    if (!expr) printf ("none");
265ca08ab68Smrg    else switch (FC_OP_GET_OP (expr->op)) {
2662c393a42Smrg    case FcOpInteger: printf ("%d", expr->u.ival); break;
2672c393a42Smrg    case FcOpDouble: printf ("%g", expr->u.dval); break;
2682c393a42Smrg    case FcOpString: printf ("\"%s\"", expr->u.sval); break;
269c9710b42Smrg    case FcOpMatrix:
270c9710b42Smrg	printf ("[");
271c9710b42Smrg	FcExprPrint (expr->u.mexpr->xx);
272c9710b42Smrg	printf (" ");
273c9710b42Smrg	FcExprPrint (expr->u.mexpr->xy);
274c9710b42Smrg	printf ("; ");
275c9710b42Smrg	FcExprPrint (expr->u.mexpr->yx);
276c9710b42Smrg	printf (" ");
277c9710b42Smrg	FcExprPrint (expr->u.mexpr->yy);
278c9710b42Smrg	printf ("]");
279c9710b42Smrg	break;
280ca08ab68Smrg    case FcOpRange: break;
2812c393a42Smrg    case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
2822c393a42Smrg    case FcOpCharSet: printf ("charset\n"); break;
283ca08ab68Smrg    case FcOpLangSet:
284ca08ab68Smrg	printf ("langset:");
285ca08ab68Smrg	FcLangSetPrint(expr->u.lval);
286ca08ab68Smrg	printf ("\n");
287ca08ab68Smrg	break;
2882c393a42Smrg    case FcOpNil: printf ("nil\n"); break;
289c9710b42Smrg    case FcOpField: printf ("%s ", FcObjectName(expr->u.name.object));
290c9710b42Smrg      switch ((int) expr->u.name.kind) {
291c9710b42Smrg      case FcMatchPattern:
292c9710b42Smrg	  printf ("(pattern) ");
293c9710b42Smrg	  break;
294c9710b42Smrg      case FcMatchFont:
295c9710b42Smrg	  printf ("(font) ");
296c9710b42Smrg	  break;
297c9710b42Smrg      }
298c9710b42Smrg      break;
2992c393a42Smrg    case FcOpConst: printf ("%s", expr->u.constant); break;
3002c393a42Smrg    case FcOpQuest:
3012c393a42Smrg	FcExprPrint (expr->u.tree.left);
3022c393a42Smrg	printf (" quest ");
3032c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.left);
3042c393a42Smrg	printf (" colon ");
3052c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.right);
3062c393a42Smrg	break;
3072c393a42Smrg    case FcOpAssign:
3082c393a42Smrg    case FcOpAssignReplace:
3092c393a42Smrg    case FcOpPrependFirst:
3102c393a42Smrg    case FcOpPrepend:
3112c393a42Smrg    case FcOpAppend:
3122c393a42Smrg    case FcOpAppendLast:
3132c393a42Smrg    case FcOpOr:
3142c393a42Smrg    case FcOpAnd:
3152c393a42Smrg    case FcOpEqual:
3162c393a42Smrg    case FcOpNotEqual:
3172c393a42Smrg    case FcOpLess:
3182c393a42Smrg    case FcOpLessEqual:
3192c393a42Smrg    case FcOpMore:
3202c393a42Smrg    case FcOpMoreEqual:
3212c393a42Smrg    case FcOpContains:
3222c393a42Smrg    case FcOpListing:
3232c393a42Smrg    case FcOpNotContains:
3242c393a42Smrg    case FcOpPlus:
3252c393a42Smrg    case FcOpMinus:
3262c393a42Smrg    case FcOpTimes:
3272c393a42Smrg    case FcOpDivide:
3282c393a42Smrg    case FcOpComma:
3292c393a42Smrg	FcExprPrint (expr->u.tree.left);
3302c393a42Smrg	printf (" ");
331ca08ab68Smrg	switch (FC_OP_GET_OP (expr->op)) {
3322c393a42Smrg	case FcOpAssign: printf ("Assign"); break;
3332c393a42Smrg	case FcOpAssignReplace: printf ("AssignReplace"); break;
3342c393a42Smrg	case FcOpPrependFirst: printf ("PrependFirst"); break;
3352c393a42Smrg	case FcOpPrepend: printf ("Prepend"); break;
3362c393a42Smrg	case FcOpAppend: printf ("Append"); break;
3372c393a42Smrg	case FcOpAppendLast: printf ("AppendLast"); break;
3382c393a42Smrg	case FcOpOr: printf ("Or"); break;
3392c393a42Smrg	case FcOpAnd: printf ("And"); break;
340ca08ab68Smrg	case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break;
341ca08ab68Smrg	case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break;
3422c393a42Smrg	case FcOpLess: printf ("Less"); break;
3432c393a42Smrg	case FcOpLessEqual: printf ("LessEqual"); break;
3442c393a42Smrg	case FcOpMore: printf ("More"); break;
3452c393a42Smrg	case FcOpMoreEqual: printf ("MoreEqual"); break;
3462c393a42Smrg	case FcOpContains: printf ("Contains"); break;
347ca08ab68Smrg	case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break;
3482c393a42Smrg	case FcOpNotContains: printf ("NotContains"); break;
3492c393a42Smrg	case FcOpPlus: printf ("Plus"); break;
3502c393a42Smrg	case FcOpMinus: printf ("Minus"); break;
3512c393a42Smrg	case FcOpTimes: printf ("Times"); break;
3522c393a42Smrg	case FcOpDivide: printf ("Divide"); break;
3532c393a42Smrg	case FcOpComma: printf ("Comma"); break;
3542c393a42Smrg	default: break;
3552c393a42Smrg	}
3562c393a42Smrg	printf (" ");
3572c393a42Smrg	FcExprPrint (expr->u.tree.right);
3582c393a42Smrg	break;
3592c393a42Smrg    case FcOpNot:
3602c393a42Smrg	printf ("Not ");
3612c393a42Smrg	FcExprPrint (expr->u.tree.left);
3622c393a42Smrg	break;
3632c393a42Smrg    case FcOpFloor:
3642c393a42Smrg	printf ("Floor ");
3652c393a42Smrg	FcExprPrint (expr->u.tree.left);
3662c393a42Smrg	break;
3672c393a42Smrg    case FcOpCeil:
3682c393a42Smrg	printf ("Ceil ");
3692c393a42Smrg	FcExprPrint (expr->u.tree.left);
3702c393a42Smrg	break;
3712c393a42Smrg    case FcOpRound:
3722c393a42Smrg	printf ("Round ");
3732c393a42Smrg	FcExprPrint (expr->u.tree.left);
3742c393a42Smrg	break;
3752c393a42Smrg    case FcOpTrunc:
3762c393a42Smrg	printf ("Trunc ");
3772c393a42Smrg	FcExprPrint (expr->u.tree.left);
3782c393a42Smrg	break;
3792c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
3802c393a42Smrg    }
3812c393a42Smrg}
3822c393a42Smrg
3832c393a42Smrgvoid
3842c393a42SmrgFcTestPrint (const FcTest *test)
3852c393a42Smrg{
3862c393a42Smrg    switch (test->kind) {
3872c393a42Smrg    case FcMatchPattern:
3882c393a42Smrg	printf ("pattern ");
3892c393a42Smrg	break;
3902c393a42Smrg    case FcMatchFont:
3912c393a42Smrg	printf ("font ");
3922c393a42Smrg	break;
3932c393a42Smrg    case FcMatchScan:
3942c393a42Smrg	printf ("scan ");
3952c393a42Smrg	break;
3962c393a42Smrg    }
3972c393a42Smrg    switch (test->qual) {
3982c393a42Smrg    case FcQualAny:
3992c393a42Smrg	printf ("any ");
4002c393a42Smrg	break;
4012c393a42Smrg    case FcQualAll:
4022c393a42Smrg	printf ("all ");
4032c393a42Smrg	break;
4042c393a42Smrg    case FcQualFirst:
4052c393a42Smrg	printf ("first ");
4062c393a42Smrg	break;
4072c393a42Smrg    case FcQualNotFirst:
4082c393a42Smrg	printf ("not_first ");
4092c393a42Smrg	break;
4102c393a42Smrg    }
4112c393a42Smrg    printf ("%s ", FcObjectName (test->object));
4122c393a42Smrg    FcOpPrint (test->op);
4132c393a42Smrg    printf (" ");
4142c393a42Smrg    FcExprPrint (test->expr);
4152c393a42Smrg    printf ("\n");
4162c393a42Smrg}
4172c393a42Smrg
4182c393a42Smrgvoid
4192c393a42SmrgFcEditPrint (const FcEdit *edit)
4202c393a42Smrg{
4212c393a42Smrg    printf ("Edit %s ", FcObjectName (edit->object));
4222c393a42Smrg    FcOpPrint (edit->op);
4232c393a42Smrg    printf (" ");
4242c393a42Smrg    FcExprPrint (edit->expr);
4252c393a42Smrg}
4262c393a42Smrg
4272c393a42Smrgvoid
4282c393a42SmrgFcSubstPrint (const FcSubst *subst)
4292c393a42Smrg{
4306fc018e4Smrg    FcRule *r;
4316fc018e4Smrg    FcRuleType last_type = FcRuleUnknown;
432ca08ab68Smrg
4332c393a42Smrg    printf ("match\n");
4346fc018e4Smrg    for (r = subst->rule; r; r = r->next)
4352c393a42Smrg    {
4366fc018e4Smrg	if (last_type != r->type)
4376fc018e4Smrg	{
4386fc018e4Smrg	    switch (r->type) {
4396fc018e4Smrg	    case FcRuleTest:
4406fc018e4Smrg		printf ("[test]\n");
4416fc018e4Smrg		break;
4426fc018e4Smrg	    case FcRuleEdit:
4436fc018e4Smrg		printf ("[edit]\n");
4446fc018e4Smrg		break;
4456fc018e4Smrg	    default:
4466fc018e4Smrg		break;
4476fc018e4Smrg	    }
4486fc018e4Smrg	    last_type = r->type;
4496fc018e4Smrg	}
4502c393a42Smrg	printf ("\t");
4516fc018e4Smrg	switch (r->type) {
4526fc018e4Smrg	case FcRuleTest:
4536fc018e4Smrg	    FcTestPrint (r->u.test);
4546fc018e4Smrg	    break;
4556fc018e4Smrg	case FcRuleEdit:
4566fc018e4Smrg	    FcEditPrint (r->u.edit);
4576fc018e4Smrg	    printf (";\n");
4586fc018e4Smrg	    break;
4596fc018e4Smrg	default:
4606fc018e4Smrg	    break;
4616fc018e4Smrg	}
4622c393a42Smrg    }
4632c393a42Smrg    printf ("\n");
4642c393a42Smrg}
4652c393a42Smrg
4662c393a42Smrgvoid
4672c393a42SmrgFcFontSetPrint (const FcFontSet *s)
4682c393a42Smrg{
4692c393a42Smrg    int	    i;
4702c393a42Smrg
4712c393a42Smrg    printf ("FontSet %d of %d\n", s->nfont, s->sfont);
4722c393a42Smrg    for (i = 0; i < s->nfont; i++)
4732c393a42Smrg    {
4742c393a42Smrg	printf ("Font %d ", i);
4752c393a42Smrg	FcPatternPrint (s->fonts[i]);
4762c393a42Smrg    }
4772c393a42Smrg}
4782c393a42Smrg
4792c393a42Smrgint FcDebugVal;
4802c393a42Smrg
4812c393a42Smrgvoid
4822c393a42SmrgFcInitDebug (void)
4832c393a42Smrg{
484c9710b42Smrg    if (!FcDebugVal) {
485c9710b42Smrg	char    *e;
4862c393a42Smrg
487c9710b42Smrg	e = getenv ("FC_DEBUG");
488c9710b42Smrg	if (e)
489c9710b42Smrg	{
490c9710b42Smrg	    printf ("FC_DEBUG=%s\n", e);
491c9710b42Smrg	    FcDebugVal = atoi (e);
492c9710b42Smrg	    if (FcDebugVal < 0)
493c9710b42Smrg		FcDebugVal = 0;
494c9710b42Smrg	}
4952c393a42Smrg    }
4962c393a42Smrg}
4972c393a42Smrg#define __fcdbg__
4982c393a42Smrg#include "fcaliastail.h"
4992c393a42Smrg#undef __fcdbg__
500