fcdbg.c revision a6844aab
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 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 * 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 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 printf ("\n"); 120 for (i = 0; i < c->num; i++) 121 { 122 intptr_t leaf_offset = leaves[i]; 123 FcCharLeaf *leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf); 124 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 FcValueListPrint (FcPatternEltValues(e)); 150 printf ("\n"); 151 } 152 printf ("\n"); 153} 154 155void 156FcOpPrint (FcOp op) 157{ 158 switch (op) { 159 case FcOpInteger: printf ("Integer"); break; 160 case FcOpDouble: printf ("Double"); break; 161 case FcOpString: printf ("String"); break; 162 case FcOpMatrix: printf ("Matrix"); break; 163 case FcOpBool: printf ("Bool"); break; 164 case FcOpCharSet: printf ("CharSet"); break; 165 case FcOpField: printf ("Field"); break; 166 case FcOpConst: printf ("Const"); break; 167 case FcOpAssign: printf ("Assign"); break; 168 case FcOpAssignReplace: printf ("AssignReplace"); break; 169 case FcOpPrepend: printf ("Prepend"); break; 170 case FcOpPrependFirst: printf ("PrependFirst"); break; 171 case FcOpAppend: printf ("Append"); break; 172 case FcOpAppendLast: printf ("AppendLast"); break; 173 case FcOpQuest: printf ("Quest"); break; 174 case FcOpOr: printf ("Or"); break; 175 case FcOpAnd: printf ("And"); break; 176 case FcOpEqual: printf ("Equal"); break; 177 case FcOpNotEqual: printf ("NotEqual"); break; 178 case FcOpLess: printf ("Less"); break; 179 case FcOpLessEqual: printf ("LessEqual"); break; 180 case FcOpMore: printf ("More"); break; 181 case FcOpMoreEqual: printf ("MoreEqual"); break; 182 case FcOpContains: printf ("Contains"); break; 183 case FcOpNotContains: printf ("NotContains"); break; 184 case FcOpPlus: printf ("Plus"); break; 185 case FcOpMinus: printf ("Minus"); break; 186 case FcOpTimes: printf ("Times"); break; 187 case FcOpDivide: printf ("Divide"); break; 188 case FcOpNot: printf ("Not"); break; 189 case FcOpNil: printf ("Nil"); break; 190 case FcOpComma: printf ("Comma"); break; 191 case FcOpFloor: printf ("Floor"); break; 192 case FcOpCeil: printf ("Ceil"); break; 193 case FcOpRound: printf ("Round"); break; 194 case FcOpTrunc: printf ("Trunc"); break; 195 case FcOpListing: printf ("Listing"); break; 196 case FcOpInvalid: printf ("Invalid"); break; 197 } 198} 199 200void 201FcExprPrint (const FcExpr *expr) 202{ 203 if (!expr) printf ("none"); 204 else switch (expr->op) { 205 case FcOpInteger: printf ("%d", expr->u.ival); break; 206 case FcOpDouble: printf ("%g", expr->u.dval); break; 207 case FcOpString: printf ("\"%s\"", expr->u.sval); break; 208 case FcOpMatrix: printf ("[%g %g %g %g]", 209 expr->u.mval->xx, 210 expr->u.mval->xy, 211 expr->u.mval->yx, 212 expr->u.mval->yy); break; 213 case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break; 214 case FcOpCharSet: printf ("charset\n"); break; 215 case FcOpNil: printf ("nil\n"); break; 216 case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break; 217 case FcOpConst: printf ("%s", expr->u.constant); break; 218 case FcOpQuest: 219 FcExprPrint (expr->u.tree.left); 220 printf (" quest "); 221 FcExprPrint (expr->u.tree.right->u.tree.left); 222 printf (" colon "); 223 FcExprPrint (expr->u.tree.right->u.tree.right); 224 break; 225 case FcOpAssign: 226 case FcOpAssignReplace: 227 case FcOpPrependFirst: 228 case FcOpPrepend: 229 case FcOpAppend: 230 case FcOpAppendLast: 231 case FcOpOr: 232 case FcOpAnd: 233 case FcOpEqual: 234 case FcOpNotEqual: 235 case FcOpLess: 236 case FcOpLessEqual: 237 case FcOpMore: 238 case FcOpMoreEqual: 239 case FcOpContains: 240 case FcOpListing: 241 case FcOpNotContains: 242 case FcOpPlus: 243 case FcOpMinus: 244 case FcOpTimes: 245 case FcOpDivide: 246 case FcOpComma: 247 FcExprPrint (expr->u.tree.left); 248 printf (" "); 249 switch (expr->op) { 250 case FcOpAssign: printf ("Assign"); break; 251 case FcOpAssignReplace: printf ("AssignReplace"); break; 252 case FcOpPrependFirst: printf ("PrependFirst"); break; 253 case FcOpPrepend: printf ("Prepend"); break; 254 case FcOpAppend: printf ("Append"); break; 255 case FcOpAppendLast: printf ("AppendLast"); break; 256 case FcOpOr: printf ("Or"); break; 257 case FcOpAnd: printf ("And"); break; 258 case FcOpEqual: printf ("Equal"); break; 259 case FcOpNotEqual: printf ("NotEqual"); break; 260 case FcOpLess: printf ("Less"); break; 261 case FcOpLessEqual: printf ("LessEqual"); break; 262 case FcOpMore: printf ("More"); break; 263 case FcOpMoreEqual: printf ("MoreEqual"); break; 264 case FcOpContains: printf ("Contains"); break; 265 case FcOpListing: printf ("Listing"); break; 266 case FcOpNotContains: printf ("NotContains"); break; 267 case FcOpPlus: printf ("Plus"); break; 268 case FcOpMinus: printf ("Minus"); break; 269 case FcOpTimes: printf ("Times"); break; 270 case FcOpDivide: printf ("Divide"); break; 271 case FcOpComma: printf ("Comma"); break; 272 default: break; 273 } 274 printf (" "); 275 FcExprPrint (expr->u.tree.right); 276 break; 277 case FcOpNot: 278 printf ("Not "); 279 FcExprPrint (expr->u.tree.left); 280 break; 281 case FcOpFloor: 282 printf ("Floor "); 283 FcExprPrint (expr->u.tree.left); 284 break; 285 case FcOpCeil: 286 printf ("Ceil "); 287 FcExprPrint (expr->u.tree.left); 288 break; 289 case FcOpRound: 290 printf ("Round "); 291 FcExprPrint (expr->u.tree.left); 292 break; 293 case FcOpTrunc: 294 printf ("Trunc "); 295 FcExprPrint (expr->u.tree.left); 296 break; 297 case FcOpInvalid: printf ("Invalid"); break; 298 } 299} 300 301void 302FcTestPrint (const FcTest *test) 303{ 304 switch (test->kind) { 305 case FcMatchPattern: 306 printf ("pattern "); 307 break; 308 case FcMatchFont: 309 printf ("font "); 310 break; 311 case FcMatchScan: 312 printf ("scan "); 313 break; 314 } 315 switch (test->qual) { 316 case FcQualAny: 317 printf ("any "); 318 break; 319 case FcQualAll: 320 printf ("all "); 321 break; 322 case FcQualFirst: 323 printf ("first "); 324 break; 325 case FcQualNotFirst: 326 printf ("not_first "); 327 break; 328 } 329 printf ("%s ", FcObjectName (test->object)); 330 FcOpPrint (test->op); 331 printf (" "); 332 FcExprPrint (test->expr); 333 printf ("\n"); 334} 335 336void 337FcEditPrint (const FcEdit *edit) 338{ 339 printf ("Edit %s ", FcObjectName (edit->object)); 340 FcOpPrint (edit->op); 341 printf (" "); 342 FcExprPrint (edit->expr); 343} 344 345void 346FcSubstPrint (const FcSubst *subst) 347{ 348 FcEdit *e; 349 FcTest *t; 350 351 printf ("match\n"); 352 for (t = subst->test; t; t = t->next) 353 { 354 printf ("\t"); 355 FcTestPrint (t); 356 } 357 printf ("edit\n"); 358 for (e = subst->edit; e; e = e->next) 359 { 360 printf ("\t"); 361 FcEditPrint (e); 362 printf (";\n"); 363 } 364 printf ("\n"); 365} 366 367void 368FcFontSetPrint (const FcFontSet *s) 369{ 370 int i; 371 372 printf ("FontSet %d of %d\n", s->nfont, s->sfont); 373 for (i = 0; i < s->nfont; i++) 374 { 375 printf ("Font %d ", i); 376 FcPatternPrint (s->fonts[i]); 377 } 378} 379 380int FcDebugVal; 381 382void 383FcInitDebug (void) 384{ 385 char *e; 386 387 e = getenv ("FC_DEBUG"); 388 if (e) 389 { 390 printf ("FC_DEBUG=%s\n", e); 391 FcDebugVal = atoi (e); 392 if (FcDebugVal < 0) 393 FcDebugVal = 0; 394 } 395} 396#define __fcdbg__ 397#include "fcaliastail.h" 398#undef __fcdbg__ 399