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