(root)/
fontconfig-2.14.2/
src/
fcdbg.c
       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__