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