fcdbg.c revision 6fc018e4
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 the author(s) not be used in 11 * advertising or publicity pertaining to distribution of the software without 12 * specific, written prior permission. The authors make 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 29static void 30_FcValuePrintFile (FILE *f, const FcValue v) 31{ 32 switch (v.type) { 33 case FcTypeUnknown: 34 fprintf (f, "<unknown>"); 35 break; 36 case FcTypeVoid: 37 fprintf (f, "<void>"); 38 break; 39 case FcTypeInteger: 40 fprintf (f, "%d(i)", v.u.i); 41 break; 42 case FcTypeDouble: 43 fprintf (f, "%g(f)", v.u.d); 44 break; 45 case FcTypeString: 46 fprintf (f, "\"%s\"", v.u.s); 47 break; 48 case FcTypeBool: 49 fprintf (f, "%s", v.u.b ? "True" : "False"); 50 break; 51 case FcTypeMatrix: 52 fprintf (f, "[%g %g; %g %g]", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); 53 break; 54 case FcTypeCharSet: /* XXX */ 55 if (f == stdout) 56 FcCharSetPrint (v.u.c); 57 break; 58 case FcTypeLangSet: 59 FcLangSetPrint (v.u.l); 60 break; 61 case FcTypeFTFace: 62 fprintf (f, "face"); 63 break; 64 } 65} 66 67void 68FcValuePrintFile (FILE *f, const FcValue v) 69{ 70 fprintf (f, " "); 71 _FcValuePrintFile (f, v); 72} 73 74void 75FcValuePrint (const FcValue v) 76{ 77 printf (" "); 78 _FcValuePrintFile (stdout, v); 79} 80 81void 82FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark) 83{ 84 if (show_pos_mark) 85 printf (" [marker] "); 86 else 87 printf (" "); 88 _FcValuePrintFile (stdout, v); 89} 90 91static void 92FcValueBindingPrint (const FcValueListPtr l) 93{ 94 switch (l->binding) { 95 case FcValueBindingWeak: 96 printf ("(w)"); 97 break; 98 case FcValueBindingStrong: 99 printf ("(s)"); 100 break; 101 case FcValueBindingSame: 102 printf ("(=)"); 103 break; 104 default: 105 /* shouldn't be reached */ 106 printf ("(?)"); 107 break; 108 } 109} 110 111void 112FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos) 113{ 114 for (; l != NULL; l = FcValueListNext(l)) 115 { 116 FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos); 117 FcValueBindingPrint (l); 118 } 119 if (!pos) 120 printf (" [marker]"); 121} 122 123void 124FcValueListPrint (FcValueListPtr l) 125{ 126 for (; l != NULL; l = FcValueListNext(l)) 127 { 128 FcValuePrint (FcValueCanonicalize (&l->value)); 129 FcValueBindingPrint (l); 130 } 131} 132 133void 134FcLangSetPrint (const FcLangSet *ls) 135{ 136 FcStrBuf buf; 137 FcChar8 init_buf[1024]; 138 139 FcStrBufInit (&buf, init_buf, sizeof (init_buf)); 140 if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0')) 141 printf ("%s", buf.buf); 142 else 143 printf ("langset (alloc error)"); 144 FcStrBufDestroy (&buf); 145} 146 147void 148FcCharSetPrint (const FcCharSet *c) 149{ 150 int i, j; 151 intptr_t *leaves = FcCharSetLeaves (c); 152 FcChar16 *numbers = FcCharSetNumbers (c); 153 154#if 0 155 printf ("CharSet 0x%x\n", (intptr_t) c); 156 printf ("Leaves: +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves); 157 printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers); 158 159 for (i = 0; i < c->num; i++) 160 { 161 printf ("Page %d: %04x +%d = 0x%x\n", 162 i, numbers[i], leaves[i], 163 (intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf)); 164 } 165#endif 166 167 printf ("\n"); 168 for (i = 0; i < c->num; i++) 169 { 170 intptr_t leaf_offset = leaves[i]; 171 FcCharLeaf *leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf); 172 173 printf ("\t"); 174 printf ("%04x:", numbers[i]); 175 for (j = 0; j < 256/32; j++) 176 printf (" %08x", leaf->map[j]); 177 printf ("\n"); 178 } 179} 180 181void 182FcPatternPrint (const FcPattern *p) 183{ 184 int i; 185 FcPatternElt *e; 186 187 if (!p) 188 { 189 printf ("Null pattern\n"); 190 return; 191 } 192 printf ("Pattern has %d elts (size %d)\n", p->num, p->size); 193 for (i = 0; i < p->num; i++) 194 { 195 e = &FcPatternElts(p)[i]; 196 printf ("\t%s:", FcObjectName(e->object)); 197 FcValueListPrint (FcPatternEltValues(e)); 198 printf ("\n"); 199 } 200 printf ("\n"); 201} 202 203#define FcOpFlagsPrint(_o_) \ 204 { \ 205 int f = FC_OP_GET_FLAGS (_o_); \ 206 if (f & FcOpFlagIgnoreBlanks) \ 207 printf ("(ignore blanks)"); \ 208 } 209 210void 211FcOpPrint (FcOp op_) 212{ 213 FcOp op = FC_OP_GET_OP (op_); 214 215 switch (op) { 216 case FcOpInteger: printf ("Integer"); break; 217 case FcOpDouble: printf ("Double"); break; 218 case FcOpString: printf ("String"); break; 219 case FcOpMatrix: printf ("Matrix"); break; 220 case FcOpRange: printf ("Range"); break; 221 case FcOpBool: printf ("Bool"); break; 222 case FcOpCharSet: printf ("CharSet"); break; 223 case FcOpLangSet: printf ("LangSet"); break; 224 case FcOpField: printf ("Field"); break; 225 case FcOpConst: printf ("Const"); break; 226 case FcOpAssign: printf ("Assign"); break; 227 case FcOpAssignReplace: printf ("AssignReplace"); break; 228 case FcOpPrepend: printf ("Prepend"); break; 229 case FcOpPrependFirst: printf ("PrependFirst"); break; 230 case FcOpAppend: printf ("Append"); break; 231 case FcOpAppendLast: printf ("AppendLast"); break; 232 case FcOpDelete: printf ("Delete"); break; 233 case FcOpDeleteAll: printf ("DeleteAll"); break; 234 case FcOpQuest: printf ("Quest"); break; 235 case FcOpOr: printf ("Or"); break; 236 case FcOpAnd: printf ("And"); break; 237 case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break; 238 case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break; 239 case FcOpLess: printf ("Less"); break; 240 case FcOpLessEqual: printf ("LessEqual"); break; 241 case FcOpMore: printf ("More"); break; 242 case FcOpMoreEqual: printf ("MoreEqual"); break; 243 case FcOpContains: printf ("Contains"); break; 244 case FcOpNotContains: printf ("NotContains"); break; 245 case FcOpPlus: printf ("Plus"); break; 246 case FcOpMinus: printf ("Minus"); break; 247 case FcOpTimes: printf ("Times"); break; 248 case FcOpDivide: printf ("Divide"); break; 249 case FcOpNot: printf ("Not"); break; 250 case FcOpNil: printf ("Nil"); break; 251 case FcOpComma: printf ("Comma"); break; 252 case FcOpFloor: printf ("Floor"); break; 253 case FcOpCeil: printf ("Ceil"); break; 254 case FcOpRound: printf ("Round"); break; 255 case FcOpTrunc: printf ("Trunc"); break; 256 case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break; 257 case FcOpInvalid: printf ("Invalid"); break; 258 } 259} 260 261void 262FcExprPrint (const FcExpr *expr) 263{ 264 if (!expr) printf ("none"); 265 else switch (FC_OP_GET_OP (expr->op)) { 266 case FcOpInteger: printf ("%d", expr->u.ival); break; 267 case FcOpDouble: printf ("%g", expr->u.dval); break; 268 case FcOpString: printf ("\"%s\"", expr->u.sval); break; 269 case FcOpMatrix: 270 printf ("["); 271 FcExprPrint (expr->u.mexpr->xx); 272 printf (" "); 273 FcExprPrint (expr->u.mexpr->xy); 274 printf ("; "); 275 FcExprPrint (expr->u.mexpr->yx); 276 printf (" "); 277 FcExprPrint (expr->u.mexpr->yy); 278 printf ("]"); 279 break; 280 case FcOpRange: break; 281 case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break; 282 case FcOpCharSet: printf ("charset\n"); break; 283 case FcOpLangSet: 284 printf ("langset:"); 285 FcLangSetPrint(expr->u.lval); 286 printf ("\n"); 287 break; 288 case FcOpNil: printf ("nil\n"); break; 289 case FcOpField: printf ("%s ", FcObjectName(expr->u.name.object)); 290 switch ((int) expr->u.name.kind) { 291 case FcMatchPattern: 292 printf ("(pattern) "); 293 break; 294 case FcMatchFont: 295 printf ("(font) "); 296 break; 297 } 298 break; 299 case FcOpConst: printf ("%s", expr->u.constant); break; 300 case FcOpQuest: 301 FcExprPrint (expr->u.tree.left); 302 printf (" quest "); 303 FcExprPrint (expr->u.tree.right->u.tree.left); 304 printf (" colon "); 305 FcExprPrint (expr->u.tree.right->u.tree.right); 306 break; 307 case FcOpAssign: 308 case FcOpAssignReplace: 309 case FcOpPrependFirst: 310 case FcOpPrepend: 311 case FcOpAppend: 312 case FcOpAppendLast: 313 case FcOpOr: 314 case FcOpAnd: 315 case FcOpEqual: 316 case FcOpNotEqual: 317 case FcOpLess: 318 case FcOpLessEqual: 319 case FcOpMore: 320 case FcOpMoreEqual: 321 case FcOpContains: 322 case FcOpListing: 323 case FcOpNotContains: 324 case FcOpPlus: 325 case FcOpMinus: 326 case FcOpTimes: 327 case FcOpDivide: 328 case FcOpComma: 329 FcExprPrint (expr->u.tree.left); 330 printf (" "); 331 switch (FC_OP_GET_OP (expr->op)) { 332 case FcOpAssign: printf ("Assign"); break; 333 case FcOpAssignReplace: printf ("AssignReplace"); break; 334 case FcOpPrependFirst: printf ("PrependFirst"); break; 335 case FcOpPrepend: printf ("Prepend"); break; 336 case FcOpAppend: printf ("Append"); break; 337 case FcOpAppendLast: printf ("AppendLast"); break; 338 case FcOpOr: printf ("Or"); break; 339 case FcOpAnd: printf ("And"); break; 340 case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break; 341 case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break; 342 case FcOpLess: printf ("Less"); break; 343 case FcOpLessEqual: printf ("LessEqual"); break; 344 case FcOpMore: printf ("More"); break; 345 case FcOpMoreEqual: printf ("MoreEqual"); break; 346 case FcOpContains: printf ("Contains"); break; 347 case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break; 348 case FcOpNotContains: printf ("NotContains"); break; 349 case FcOpPlus: printf ("Plus"); break; 350 case FcOpMinus: printf ("Minus"); break; 351 case FcOpTimes: printf ("Times"); break; 352 case FcOpDivide: printf ("Divide"); break; 353 case FcOpComma: printf ("Comma"); break; 354 default: break; 355 } 356 printf (" "); 357 FcExprPrint (expr->u.tree.right); 358 break; 359 case FcOpNot: 360 printf ("Not "); 361 FcExprPrint (expr->u.tree.left); 362 break; 363 case FcOpFloor: 364 printf ("Floor "); 365 FcExprPrint (expr->u.tree.left); 366 break; 367 case FcOpCeil: 368 printf ("Ceil "); 369 FcExprPrint (expr->u.tree.left); 370 break; 371 case FcOpRound: 372 printf ("Round "); 373 FcExprPrint (expr->u.tree.left); 374 break; 375 case FcOpTrunc: 376 printf ("Trunc "); 377 FcExprPrint (expr->u.tree.left); 378 break; 379 case FcOpInvalid: printf ("Invalid"); break; 380 } 381} 382 383void 384FcTestPrint (const FcTest *test) 385{ 386 switch (test->kind) { 387 case FcMatchPattern: 388 printf ("pattern "); 389 break; 390 case FcMatchFont: 391 printf ("font "); 392 break; 393 case FcMatchScan: 394 printf ("scan "); 395 break; 396 } 397 switch (test->qual) { 398 case FcQualAny: 399 printf ("any "); 400 break; 401 case FcQualAll: 402 printf ("all "); 403 break; 404 case FcQualFirst: 405 printf ("first "); 406 break; 407 case FcQualNotFirst: 408 printf ("not_first "); 409 break; 410 } 411 printf ("%s ", FcObjectName (test->object)); 412 FcOpPrint (test->op); 413 printf (" "); 414 FcExprPrint (test->expr); 415 printf ("\n"); 416} 417 418void 419FcEditPrint (const FcEdit *edit) 420{ 421 printf ("Edit %s ", FcObjectName (edit->object)); 422 FcOpPrint (edit->op); 423 printf (" "); 424 FcExprPrint (edit->expr); 425} 426 427void 428FcSubstPrint (const FcSubst *subst) 429{ 430 FcRule *r; 431 FcRuleType last_type = FcRuleUnknown; 432 433 printf ("match\n"); 434 for (r = subst->rule; r; r = r->next) 435 { 436 if (last_type != r->type) 437 { 438 switch (r->type) { 439 case FcRuleTest: 440 printf ("[test]\n"); 441 break; 442 case FcRuleEdit: 443 printf ("[edit]\n"); 444 break; 445 default: 446 break; 447 } 448 last_type = r->type; 449 } 450 printf ("\t"); 451 switch (r->type) { 452 case FcRuleTest: 453 FcTestPrint (r->u.test); 454 break; 455 case FcRuleEdit: 456 FcEditPrint (r->u.edit); 457 printf (";\n"); 458 break; 459 default: 460 break; 461 } 462 } 463 printf ("\n"); 464} 465 466void 467FcFontSetPrint (const FcFontSet *s) 468{ 469 int i; 470 471 printf ("FontSet %d of %d\n", s->nfont, s->sfont); 472 for (i = 0; i < s->nfont; i++) 473 { 474 printf ("Font %d ", i); 475 FcPatternPrint (s->fonts[i]); 476 } 477} 478 479int FcDebugVal; 480 481void 482FcInitDebug (void) 483{ 484 if (!FcDebugVal) { 485 char *e; 486 487 e = getenv ("FC_DEBUG"); 488 if (e) 489 { 490 printf ("FC_DEBUG=%s\n", e); 491 FcDebugVal = atoi (e); 492 if (FcDebugVal < 0) 493 FcDebugVal = 0; 494 } 495 } 496} 497#define __fcdbg__ 498#include "fcaliastail.h" 499#undef __fcdbg__ 500