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