fcdbg.c revision c9710b42
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) {
332c393a42Smrg    case FcTypeVoid:
34c9710b42Smrg	fprintf (f, "<void>");
352c393a42Smrg	break;
362c393a42Smrg    case FcTypeInteger:
37c9710b42Smrg	fprintf (f, "%d(i)", v.u.i);
382c393a42Smrg	break;
392c393a42Smrg    case FcTypeDouble:
40c9710b42Smrg	fprintf (f, "%g(f)", v.u.d);
412c393a42Smrg	break;
422c393a42Smrg    case FcTypeString:
43c9710b42Smrg	fprintf (f, "\"%s\"", v.u.s);
442c393a42Smrg	break;
452c393a42Smrg    case FcTypeBool:
46c9710b42Smrg	fprintf (f, "%s", v.u.b ? "True" : "False");
472c393a42Smrg	break;
482c393a42Smrg    case FcTypeMatrix:
49c9710b42Smrg	fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
502c393a42Smrg	break;
512c393a42Smrg    case FcTypeCharSet:	/* XXX */
52c9710b42Smrg	if (f == stdout)
53c9710b42Smrg	    FcCharSetPrint (v.u.c);
542c393a42Smrg	break;
552c393a42Smrg    case FcTypeLangSet:
562c393a42Smrg	FcLangSetPrint (v.u.l);
572c393a42Smrg	break;
582c393a42Smrg    case FcTypeFTFace:
59c9710b42Smrg	fprintf (f, "face");
602c393a42Smrg	break;
612c393a42Smrg    }
622c393a42Smrg}
632c393a42Smrg
64c9710b42Smrgvoid
65c9710b42SmrgFcValuePrintFile (FILE *f, const FcValue v)
66c9710b42Smrg{
67c9710b42Smrg    fprintf (f, " ");
68c9710b42Smrg    _FcValuePrintFile (f, v);
69c9710b42Smrg}
70c9710b42Smrg
71ca08ab68Smrgvoid
72ca08ab68SmrgFcValuePrint (const FcValue v)
73ca08ab68Smrg{
74ca08ab68Smrg    printf (" ");
75c9710b42Smrg    _FcValuePrintFile (stdout, v);
76ca08ab68Smrg}
77ca08ab68Smrg
78ca08ab68Smrgvoid
79ca08ab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark)
80ca08ab68Smrg{
81ca08ab68Smrg    if (show_pos_mark)
82c9710b42Smrg	printf (" [marker] ");
83ca08ab68Smrg    else
84ca08ab68Smrg	printf (" ");
85c9710b42Smrg    _FcValuePrintFile (stdout, v);
86ca08ab68Smrg}
87ca08ab68Smrg
88ca08ab68Smrgstatic void
89ca08ab68SmrgFcValueBindingPrint (const FcValueListPtr l)
90ca08ab68Smrg{
91ca08ab68Smrg    switch (l->binding) {
92ca08ab68Smrg    case FcValueBindingWeak:
93ca08ab68Smrg	printf ("(w)");
94ca08ab68Smrg	break;
95ca08ab68Smrg    case FcValueBindingStrong:
96ca08ab68Smrg	printf ("(s)");
97ca08ab68Smrg	break;
98ca08ab68Smrg    case FcValueBindingSame:
99ca08ab68Smrg	printf ("(=)");
100ca08ab68Smrg	break;
101ca08ab68Smrg    }
102ca08ab68Smrg}
103ca08ab68Smrg
104ca08ab68Smrgvoid
105ca08ab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos)
106ca08ab68Smrg{
107ca08ab68Smrg    for (; l != NULL; l = FcValueListNext(l))
108ca08ab68Smrg    {
109ca08ab68Smrg	FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos);
110ca08ab68Smrg	FcValueBindingPrint (l);
111ca08ab68Smrg    }
112ca08ab68Smrg    if (!pos)
113c9710b42Smrg	printf (" [marker]");
114ca08ab68Smrg}
115ca08ab68Smrg
1162c393a42Smrgvoid
1172c393a42SmrgFcValueListPrint (FcValueListPtr l)
1182c393a42Smrg{
1192c393a42Smrg    for (; l != NULL; l = FcValueListNext(l))
1202c393a42Smrg    {
121ca08ab68Smrg	FcValuePrint (FcValueCanonicalize (&l->value));
122ca08ab68Smrg	FcValueBindingPrint (l);
1232c393a42Smrg    }
1242c393a42Smrg}
1252c393a42Smrg
1262c393a42Smrgvoid
1272c393a42SmrgFcLangSetPrint (const FcLangSet *ls)
1282c393a42Smrg{
1292c393a42Smrg    FcStrBuf	buf;
1302c393a42Smrg    FcChar8	init_buf[1024];
131ca08ab68Smrg
1322c393a42Smrg    FcStrBufInit (&buf, init_buf, sizeof (init_buf));
1332c393a42Smrg    if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
1342c393a42Smrg       printf ("%s", buf.buf);
1352c393a42Smrg    else
1362c393a42Smrg       printf ("langset (alloc error)");
1372c393a42Smrg    FcStrBufDestroy (&buf);
1382c393a42Smrg}
1392c393a42Smrg
1402c393a42Smrgvoid
1412c393a42SmrgFcCharSetPrint (const FcCharSet *c)
1422c393a42Smrg{
1432c393a42Smrg    int	i, j;
1442c393a42Smrg    intptr_t	*leaves = FcCharSetLeaves (c);
1452c393a42Smrg    FcChar16	*numbers = FcCharSetNumbers (c);
146ca08ab68Smrg
1472c393a42Smrg#if 0
1482c393a42Smrg    printf ("CharSet  0x%x\n", (intptr_t) c);
1492c393a42Smrg    printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
1502c393a42Smrg    printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
151ca08ab68Smrg
1522c393a42Smrg    for (i = 0; i < c->num; i++)
1532c393a42Smrg    {
154ca08ab68Smrg	printf ("Page %d: %04x +%d = 0x%x\n",
155ca08ab68Smrg		i, numbers[i], leaves[i],
1562c393a42Smrg		(intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
1572c393a42Smrg    }
1582c393a42Smrg#endif
1592c393a42Smrg
160a6844aabSmrg    printf ("\n");
1612c393a42Smrg    for (i = 0; i < c->num; i++)
1622c393a42Smrg    {
1632c393a42Smrg	intptr_t	leaf_offset = leaves[i];
1642c393a42Smrg	FcCharLeaf	*leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf);
1652c393a42Smrg
166a6844aabSmrg	printf ("\t");
1672c393a42Smrg	printf ("%04x:", numbers[i]);
1682c393a42Smrg	for (j = 0; j < 256/32; j++)
1692c393a42Smrg	    printf (" %08x", leaf->map[j]);
1702c393a42Smrg	printf ("\n");
1712c393a42Smrg    }
1722c393a42Smrg}
1732c393a42Smrg
1742c393a42Smrgvoid
1752c393a42SmrgFcPatternPrint (const FcPattern *p)
1762c393a42Smrg{
1772c393a42Smrg    int		    i;
1782c393a42Smrg    FcPatternElt   *e;
179ca08ab68Smrg
1802c393a42Smrg    if (!p)
1812c393a42Smrg    {
1822c393a42Smrg	printf ("Null pattern\n");
1832c393a42Smrg	return;
1842c393a42Smrg    }
1852c393a42Smrg    printf ("Pattern has %d elts (size %d)\n", p->num, p->size);
1862c393a42Smrg    for (i = 0; i < p->num; i++)
1872c393a42Smrg    {
1882c393a42Smrg	e = &FcPatternElts(p)[i];
1892c393a42Smrg	printf ("\t%s:", FcObjectName(e->object));
190a6844aabSmrg	FcValueListPrint (FcPatternEltValues(e));
1912c393a42Smrg	printf ("\n");
1922c393a42Smrg    }
1932c393a42Smrg    printf ("\n");
1942c393a42Smrg}
1952c393a42Smrg
196ca08ab68Smrg#define FcOpFlagsPrint(_o_)		\
197ca08ab68Smrg    {					\
198ca08ab68Smrg	int f = FC_OP_GET_FLAGS (_o_);	\
199ca08ab68Smrg	if (f & FcOpFlagIgnoreBlanks)	\
200ca08ab68Smrg	    printf ("(ignore blanks)");	\
201ca08ab68Smrg    }
202ca08ab68Smrg
2032c393a42Smrgvoid
204ca08ab68SmrgFcOpPrint (FcOp op_)
2052c393a42Smrg{
206ca08ab68Smrg    FcOp op = FC_OP_GET_OP (op_);
207ca08ab68Smrg
2082c393a42Smrg    switch (op) {
2092c393a42Smrg    case FcOpInteger: printf ("Integer"); break;
2102c393a42Smrg    case FcOpDouble: printf ("Double"); break;
2112c393a42Smrg    case FcOpString: printf ("String"); break;
2122c393a42Smrg    case FcOpMatrix: printf ("Matrix"); break;
213ca08ab68Smrg    case FcOpRange: printf ("Range"); break;
2142c393a42Smrg    case FcOpBool: printf ("Bool"); break;
2152c393a42Smrg    case FcOpCharSet: printf ("CharSet"); break;
216ca08ab68Smrg    case FcOpLangSet: printf ("LangSet"); break;
2172c393a42Smrg    case FcOpField: printf ("Field"); break;
2182c393a42Smrg    case FcOpConst: printf ("Const"); break;
2192c393a42Smrg    case FcOpAssign: printf ("Assign"); break;
2202c393a42Smrg    case FcOpAssignReplace: printf ("AssignReplace"); break;
2212c393a42Smrg    case FcOpPrepend: printf ("Prepend"); break;
2222c393a42Smrg    case FcOpPrependFirst: printf ("PrependFirst"); break;
2232c393a42Smrg    case FcOpAppend: printf ("Append"); break;
2242c393a42Smrg    case FcOpAppendLast: printf ("AppendLast"); break;
225c9710b42Smrg    case FcOpDelete: printf ("Delete"); break;
226c9710b42Smrg    case FcOpDeleteAll: printf ("DeleteAll"); break;
2272c393a42Smrg    case FcOpQuest: printf ("Quest"); break;
2282c393a42Smrg    case FcOpOr: printf ("Or"); break;
2292c393a42Smrg    case FcOpAnd: printf ("And"); break;
230ca08ab68Smrg    case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break;
231ca08ab68Smrg    case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break;
2322c393a42Smrg    case FcOpLess: printf ("Less"); break;
2332c393a42Smrg    case FcOpLessEqual: printf ("LessEqual"); break;
2342c393a42Smrg    case FcOpMore: printf ("More"); break;
2352c393a42Smrg    case FcOpMoreEqual: printf ("MoreEqual"); break;
2362c393a42Smrg    case FcOpContains: printf ("Contains"); break;
2372c393a42Smrg    case FcOpNotContains: printf ("NotContains"); break;
2382c393a42Smrg    case FcOpPlus: printf ("Plus"); break;
2392c393a42Smrg    case FcOpMinus: printf ("Minus"); break;
2402c393a42Smrg    case FcOpTimes: printf ("Times"); break;
2412c393a42Smrg    case FcOpDivide: printf ("Divide"); break;
2422c393a42Smrg    case FcOpNot: printf ("Not"); break;
2432c393a42Smrg    case FcOpNil: printf ("Nil"); break;
2442c393a42Smrg    case FcOpComma: printf ("Comma"); break;
2452c393a42Smrg    case FcOpFloor: printf ("Floor"); break;
2462c393a42Smrg    case FcOpCeil: printf ("Ceil"); break;
2472c393a42Smrg    case FcOpRound: printf ("Round"); break;
2482c393a42Smrg    case FcOpTrunc: printf ("Trunc"); break;
249ca08ab68Smrg    case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break;
2502c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
2512c393a42Smrg    }
2522c393a42Smrg}
2532c393a42Smrg
2542c393a42Smrgvoid
2552c393a42SmrgFcExprPrint (const FcExpr *expr)
2562c393a42Smrg{
2572c393a42Smrg    if (!expr) printf ("none");
258ca08ab68Smrg    else switch (FC_OP_GET_OP (expr->op)) {
2592c393a42Smrg    case FcOpInteger: printf ("%d", expr->u.ival); break;
2602c393a42Smrg    case FcOpDouble: printf ("%g", expr->u.dval); break;
2612c393a42Smrg    case FcOpString: printf ("\"%s\"", expr->u.sval); break;
262c9710b42Smrg    case FcOpMatrix:
263c9710b42Smrg	printf ("[");
264c9710b42Smrg	FcExprPrint (expr->u.mexpr->xx);
265c9710b42Smrg	printf (" ");
266c9710b42Smrg	FcExprPrint (expr->u.mexpr->xy);
267c9710b42Smrg	printf ("; ");
268c9710b42Smrg	FcExprPrint (expr->u.mexpr->yx);
269c9710b42Smrg	printf (" ");
270c9710b42Smrg	FcExprPrint (expr->u.mexpr->yy);
271c9710b42Smrg	printf ("]");
272c9710b42Smrg	break;
273ca08ab68Smrg    case FcOpRange: break;
2742c393a42Smrg    case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
2752c393a42Smrg    case FcOpCharSet: printf ("charset\n"); break;
276ca08ab68Smrg    case FcOpLangSet:
277ca08ab68Smrg	printf ("langset:");
278ca08ab68Smrg	FcLangSetPrint(expr->u.lval);
279ca08ab68Smrg	printf ("\n");
280ca08ab68Smrg	break;
2812c393a42Smrg    case FcOpNil: printf ("nil\n"); break;
282c9710b42Smrg    case FcOpField: printf ("%s ", FcObjectName(expr->u.name.object));
283c9710b42Smrg      switch ((int) expr->u.name.kind) {
284c9710b42Smrg      case FcMatchPattern:
285c9710b42Smrg	  printf ("(pattern) ");
286c9710b42Smrg	  break;
287c9710b42Smrg      case FcMatchFont:
288c9710b42Smrg	  printf ("(font) ");
289c9710b42Smrg	  break;
290c9710b42Smrg      }
291c9710b42Smrg      break;
2922c393a42Smrg    case FcOpConst: printf ("%s", expr->u.constant); break;
2932c393a42Smrg    case FcOpQuest:
2942c393a42Smrg	FcExprPrint (expr->u.tree.left);
2952c393a42Smrg	printf (" quest ");
2962c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.left);
2972c393a42Smrg	printf (" colon ");
2982c393a42Smrg	FcExprPrint (expr->u.tree.right->u.tree.right);
2992c393a42Smrg	break;
3002c393a42Smrg    case FcOpAssign:
3012c393a42Smrg    case FcOpAssignReplace:
3022c393a42Smrg    case FcOpPrependFirst:
3032c393a42Smrg    case FcOpPrepend:
3042c393a42Smrg    case FcOpAppend:
3052c393a42Smrg    case FcOpAppendLast:
3062c393a42Smrg    case FcOpOr:
3072c393a42Smrg    case FcOpAnd:
3082c393a42Smrg    case FcOpEqual:
3092c393a42Smrg    case FcOpNotEqual:
3102c393a42Smrg    case FcOpLess:
3112c393a42Smrg    case FcOpLessEqual:
3122c393a42Smrg    case FcOpMore:
3132c393a42Smrg    case FcOpMoreEqual:
3142c393a42Smrg    case FcOpContains:
3152c393a42Smrg    case FcOpListing:
3162c393a42Smrg    case FcOpNotContains:
3172c393a42Smrg    case FcOpPlus:
3182c393a42Smrg    case FcOpMinus:
3192c393a42Smrg    case FcOpTimes:
3202c393a42Smrg    case FcOpDivide:
3212c393a42Smrg    case FcOpComma:
3222c393a42Smrg	FcExprPrint (expr->u.tree.left);
3232c393a42Smrg	printf (" ");
324ca08ab68Smrg	switch (FC_OP_GET_OP (expr->op)) {
3252c393a42Smrg	case FcOpAssign: printf ("Assign"); break;
3262c393a42Smrg	case FcOpAssignReplace: printf ("AssignReplace"); break;
3272c393a42Smrg	case FcOpPrependFirst: printf ("PrependFirst"); break;
3282c393a42Smrg	case FcOpPrepend: printf ("Prepend"); break;
3292c393a42Smrg	case FcOpAppend: printf ("Append"); break;
3302c393a42Smrg	case FcOpAppendLast: printf ("AppendLast"); break;
3312c393a42Smrg	case FcOpOr: printf ("Or"); break;
3322c393a42Smrg	case FcOpAnd: printf ("And"); break;
333ca08ab68Smrg	case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break;
334ca08ab68Smrg	case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break;
3352c393a42Smrg	case FcOpLess: printf ("Less"); break;
3362c393a42Smrg	case FcOpLessEqual: printf ("LessEqual"); break;
3372c393a42Smrg	case FcOpMore: printf ("More"); break;
3382c393a42Smrg	case FcOpMoreEqual: printf ("MoreEqual"); break;
3392c393a42Smrg	case FcOpContains: printf ("Contains"); break;
340ca08ab68Smrg	case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break;
3412c393a42Smrg	case FcOpNotContains: printf ("NotContains"); break;
3422c393a42Smrg	case FcOpPlus: printf ("Plus"); break;
3432c393a42Smrg	case FcOpMinus: printf ("Minus"); break;
3442c393a42Smrg	case FcOpTimes: printf ("Times"); break;
3452c393a42Smrg	case FcOpDivide: printf ("Divide"); break;
3462c393a42Smrg	case FcOpComma: printf ("Comma"); break;
3472c393a42Smrg	default: break;
3482c393a42Smrg	}
3492c393a42Smrg	printf (" ");
3502c393a42Smrg	FcExprPrint (expr->u.tree.right);
3512c393a42Smrg	break;
3522c393a42Smrg    case FcOpNot:
3532c393a42Smrg	printf ("Not ");
3542c393a42Smrg	FcExprPrint (expr->u.tree.left);
3552c393a42Smrg	break;
3562c393a42Smrg    case FcOpFloor:
3572c393a42Smrg	printf ("Floor ");
3582c393a42Smrg	FcExprPrint (expr->u.tree.left);
3592c393a42Smrg	break;
3602c393a42Smrg    case FcOpCeil:
3612c393a42Smrg	printf ("Ceil ");
3622c393a42Smrg	FcExprPrint (expr->u.tree.left);
3632c393a42Smrg	break;
3642c393a42Smrg    case FcOpRound:
3652c393a42Smrg	printf ("Round ");
3662c393a42Smrg	FcExprPrint (expr->u.tree.left);
3672c393a42Smrg	break;
3682c393a42Smrg    case FcOpTrunc:
3692c393a42Smrg	printf ("Trunc ");
3702c393a42Smrg	FcExprPrint (expr->u.tree.left);
3712c393a42Smrg	break;
3722c393a42Smrg    case FcOpInvalid: printf ("Invalid"); break;
3732c393a42Smrg    }
3742c393a42Smrg}
3752c393a42Smrg
3762c393a42Smrgvoid
3772c393a42SmrgFcTestPrint (const FcTest *test)
3782c393a42Smrg{
3792c393a42Smrg    switch (test->kind) {
3802c393a42Smrg    case FcMatchPattern:
3812c393a42Smrg	printf ("pattern ");
3822c393a42Smrg	break;
3832c393a42Smrg    case FcMatchFont:
3842c393a42Smrg	printf ("font ");
3852c393a42Smrg	break;
3862c393a42Smrg    case FcMatchScan:
3872c393a42Smrg	printf ("scan ");
3882c393a42Smrg	break;
3892c393a42Smrg    }
3902c393a42Smrg    switch (test->qual) {
3912c393a42Smrg    case FcQualAny:
3922c393a42Smrg	printf ("any ");
3932c393a42Smrg	break;
3942c393a42Smrg    case FcQualAll:
3952c393a42Smrg	printf ("all ");
3962c393a42Smrg	break;
3972c393a42Smrg    case FcQualFirst:
3982c393a42Smrg	printf ("first ");
3992c393a42Smrg	break;
4002c393a42Smrg    case FcQualNotFirst:
4012c393a42Smrg	printf ("not_first ");
4022c393a42Smrg	break;
4032c393a42Smrg    }
4042c393a42Smrg    printf ("%s ", FcObjectName (test->object));
4052c393a42Smrg    FcOpPrint (test->op);
4062c393a42Smrg    printf (" ");
4072c393a42Smrg    FcExprPrint (test->expr);
4082c393a42Smrg    printf ("\n");
4092c393a42Smrg}
4102c393a42Smrg
4112c393a42Smrgvoid
4122c393a42SmrgFcEditPrint (const FcEdit *edit)
4132c393a42Smrg{
4142c393a42Smrg    printf ("Edit %s ", FcObjectName (edit->object));
4152c393a42Smrg    FcOpPrint (edit->op);
4162c393a42Smrg    printf (" ");
4172c393a42Smrg    FcExprPrint (edit->expr);
4182c393a42Smrg}
4192c393a42Smrg
4202c393a42Smrgvoid
4212c393a42SmrgFcSubstPrint (const FcSubst *subst)
4222c393a42Smrg{
4232c393a42Smrg    FcEdit	*e;
4242c393a42Smrg    FcTest	*t;
425ca08ab68Smrg
4262c393a42Smrg    printf ("match\n");
4272c393a42Smrg    for (t = subst->test; t; t = t->next)
4282c393a42Smrg    {
4292c393a42Smrg	printf ("\t");
4302c393a42Smrg	FcTestPrint (t);
4312c393a42Smrg    }
4322c393a42Smrg    printf ("edit\n");
4332c393a42Smrg    for (e = subst->edit; e; e = e->next)
4342c393a42Smrg    {
4352c393a42Smrg	printf ("\t");
4362c393a42Smrg	FcEditPrint (e);
4372c393a42Smrg	printf (";\n");
4382c393a42Smrg    }
4392c393a42Smrg    printf ("\n");
4402c393a42Smrg}
4412c393a42Smrg
4422c393a42Smrgvoid
4432c393a42SmrgFcFontSetPrint (const FcFontSet *s)
4442c393a42Smrg{
4452c393a42Smrg    int	    i;
4462c393a42Smrg
4472c393a42Smrg    printf ("FontSet %d of %d\n", s->nfont, s->sfont);
4482c393a42Smrg    for (i = 0; i < s->nfont; i++)
4492c393a42Smrg    {
4502c393a42Smrg	printf ("Font %d ", i);
4512c393a42Smrg	FcPatternPrint (s->fonts[i]);
4522c393a42Smrg    }
4532c393a42Smrg}
4542c393a42Smrg
4552c393a42Smrgint FcDebugVal;
4562c393a42Smrg
4572c393a42Smrgvoid
4582c393a42SmrgFcInitDebug (void)
4592c393a42Smrg{
460c9710b42Smrg    if (!FcDebugVal) {
461c9710b42Smrg	char    *e;
4622c393a42Smrg
463c9710b42Smrg	e = getenv ("FC_DEBUG");
464c9710b42Smrg	if (e)
465c9710b42Smrg	{
466c9710b42Smrg	    printf ("FC_DEBUG=%s\n", e);
467c9710b42Smrg	    FcDebugVal = atoi (e);
468c9710b42Smrg	    if (FcDebugVal < 0)
469c9710b42Smrg		FcDebugVal = 0;
470c9710b42Smrg	}
4712c393a42Smrg    }
4722c393a42Smrg}
4732c393a42Smrg#define __fcdbg__
4742c393a42Smrg#include "fcaliastail.h"
4752c393a42Smrg#undef __fcdbg__
476