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