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