fcdbg.c revision ca08ab68
12c393a42Smrg/* 2a6844aabSmrg * fontconfig/src/fcdbg.c 32c393a42Smrg * 42c393a42Smrg * Copyright © 2000 Keith Packard 52c393a42Smrg * 62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its 72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that 82c393a42Smrg * the above copyright notice appear in all copies and that both that 92c393a42Smrg * copyright notice and this permission notice appear in supporting 10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in 112c393a42Smrg * advertising or publicity pertaining to distribution of the software without 12ca08ab68Smrg * specific, written prior permission. The authors make no 132c393a42Smrg * representations about the suitability of this software for any purpose. It 142c393a42Smrg * is provided "as is" without express or implied warranty. 152c393a42Smrg * 16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18a6844aabSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE. 232c393a42Smrg */ 242c393a42Smrg 252c393a42Smrg#include "fcint.h" 262c393a42Smrg#include <stdio.h> 272c393a42Smrg#include <stdlib.h> 282c393a42Smrg 29ca08ab68Smrgstatic void 30ca08ab68Smrg_FcValuePrint (const FcValue v) 312c393a42Smrg{ 322c393a42Smrg switch (v.type) { 332c393a42Smrg case FcTypeVoid: 34ca08ab68Smrg printf ("<void>"); 352c393a42Smrg break; 362c393a42Smrg case FcTypeInteger: 37ca08ab68Smrg printf ("%d(i)", v.u.i); 382c393a42Smrg break; 392c393a42Smrg case FcTypeDouble: 40ca08ab68Smrg printf ("%g(f)", v.u.d); 412c393a42Smrg break; 422c393a42Smrg case FcTypeString: 43ca08ab68Smrg printf ("\"%s\"", v.u.s); 442c393a42Smrg break; 452c393a42Smrg case FcTypeBool: 46ca08ab68Smrg printf ("%s", v.u.b ? "FcTrue" : "FcFalse"); 472c393a42Smrg break; 482c393a42Smrg case FcTypeMatrix: 49ca08ab68Smrg printf ("(%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); 502c393a42Smrg break; 512c393a42Smrg case FcTypeCharSet: /* XXX */ 522c393a42Smrg FcCharSetPrint (v.u.c); 532c393a42Smrg break; 542c393a42Smrg case FcTypeLangSet: 552c393a42Smrg FcLangSetPrint (v.u.l); 562c393a42Smrg break; 572c393a42Smrg case FcTypeFTFace: 58ca08ab68Smrg printf ("face"); 592c393a42Smrg break; 602c393a42Smrg } 612c393a42Smrg} 622c393a42Smrg 63ca08ab68Smrgvoid 64ca08ab68SmrgFcValuePrint (const FcValue v) 65ca08ab68Smrg{ 66ca08ab68Smrg printf (" "); 67ca08ab68Smrg _FcValuePrint (v); 68ca08ab68Smrg} 69ca08ab68Smrg 70ca08ab68Smrgvoid 71ca08ab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark) 72ca08ab68Smrg{ 73ca08ab68Smrg if (show_pos_mark) 74ca08ab68Smrg printf (" [insert here] "); 75ca08ab68Smrg else 76ca08ab68Smrg printf (" "); 77ca08ab68Smrg _FcValuePrint (v); 78ca08ab68Smrg} 79ca08ab68Smrg 80ca08ab68Smrgstatic void 81ca08ab68SmrgFcValueBindingPrint (const FcValueListPtr l) 82ca08ab68Smrg{ 83ca08ab68Smrg switch (l->binding) { 84ca08ab68Smrg case FcValueBindingWeak: 85ca08ab68Smrg printf ("(w)"); 86ca08ab68Smrg break; 87ca08ab68Smrg case FcValueBindingStrong: 88ca08ab68Smrg printf ("(s)"); 89ca08ab68Smrg break; 90ca08ab68Smrg case FcValueBindingSame: 91ca08ab68Smrg printf ("(=)"); 92ca08ab68Smrg break; 93ca08ab68Smrg } 94ca08ab68Smrg} 95ca08ab68Smrg 96ca08ab68Smrgvoid 97ca08ab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos) 98ca08ab68Smrg{ 99ca08ab68Smrg for (; l != NULL; l = FcValueListNext(l)) 100ca08ab68Smrg { 101ca08ab68Smrg FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos); 102ca08ab68Smrg FcValueBindingPrint (l); 103ca08ab68Smrg } 104ca08ab68Smrg if (!pos) 105ca08ab68Smrg printf (" [insert here]"); 106ca08ab68Smrg} 107ca08ab68Smrg 1082c393a42Smrgvoid 1092c393a42SmrgFcValueListPrint (FcValueListPtr l) 1102c393a42Smrg{ 1112c393a42Smrg for (; l != NULL; l = FcValueListNext(l)) 1122c393a42Smrg { 113ca08ab68Smrg FcValuePrint (FcValueCanonicalize (&l->value)); 114ca08ab68Smrg FcValueBindingPrint (l); 1152c393a42Smrg } 1162c393a42Smrg} 1172c393a42Smrg 1182c393a42Smrgvoid 1192c393a42SmrgFcLangSetPrint (const FcLangSet *ls) 1202c393a42Smrg{ 1212c393a42Smrg FcStrBuf buf; 1222c393a42Smrg FcChar8 init_buf[1024]; 123ca08ab68Smrg 1242c393a42Smrg FcStrBufInit (&buf, init_buf, sizeof (init_buf)); 1252c393a42Smrg if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0')) 1262c393a42Smrg printf ("%s", buf.buf); 1272c393a42Smrg else 1282c393a42Smrg printf ("langset (alloc error)"); 1292c393a42Smrg FcStrBufDestroy (&buf); 1302c393a42Smrg} 1312c393a42Smrg 1322c393a42Smrgvoid 1332c393a42SmrgFcCharSetPrint (const FcCharSet *c) 1342c393a42Smrg{ 1352c393a42Smrg int i, j; 1362c393a42Smrg intptr_t *leaves = FcCharSetLeaves (c); 1372c393a42Smrg FcChar16 *numbers = FcCharSetNumbers (c); 138ca08ab68Smrg 1392c393a42Smrg#if 0 1402c393a42Smrg printf ("CharSet 0x%x\n", (intptr_t) c); 1412c393a42Smrg printf ("Leaves: +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves); 1422c393a42Smrg printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers); 143ca08ab68Smrg 1442c393a42Smrg for (i = 0; i < c->num; i++) 1452c393a42Smrg { 146ca08ab68Smrg printf ("Page %d: %04x +%d = 0x%x\n", 147ca08ab68Smrg i, numbers[i], leaves[i], 1482c393a42Smrg (intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf)); 1492c393a42Smrg } 1502c393a42Smrg#endif 1512c393a42Smrg 152a6844aabSmrg printf ("\n"); 1532c393a42Smrg for (i = 0; i < c->num; i++) 1542c393a42Smrg { 1552c393a42Smrg intptr_t leaf_offset = leaves[i]; 1562c393a42Smrg FcCharLeaf *leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf); 1572c393a42Smrg 158a6844aabSmrg printf ("\t"); 1592c393a42Smrg printf ("%04x:", numbers[i]); 1602c393a42Smrg for (j = 0; j < 256/32; j++) 1612c393a42Smrg printf (" %08x", leaf->map[j]); 1622c393a42Smrg printf ("\n"); 1632c393a42Smrg } 1642c393a42Smrg} 1652c393a42Smrg 1662c393a42Smrgvoid 1672c393a42SmrgFcPatternPrint (const FcPattern *p) 1682c393a42Smrg{ 1692c393a42Smrg int i; 1702c393a42Smrg FcPatternElt *e; 171ca08ab68Smrg 1722c393a42Smrg if (!p) 1732c393a42Smrg { 1742c393a42Smrg printf ("Null pattern\n"); 1752c393a42Smrg return; 1762c393a42Smrg } 1772c393a42Smrg printf ("Pattern has %d elts (size %d)\n", p->num, p->size); 1782c393a42Smrg for (i = 0; i < p->num; i++) 1792c393a42Smrg { 1802c393a42Smrg e = &FcPatternElts(p)[i]; 1812c393a42Smrg printf ("\t%s:", FcObjectName(e->object)); 182a6844aabSmrg FcValueListPrint (FcPatternEltValues(e)); 1832c393a42Smrg printf ("\n"); 1842c393a42Smrg } 1852c393a42Smrg printf ("\n"); 1862c393a42Smrg} 1872c393a42Smrg 188ca08ab68Smrg#define FcOpFlagsPrint(_o_) \ 189ca08ab68Smrg { \ 190ca08ab68Smrg int f = FC_OP_GET_FLAGS (_o_); \ 191ca08ab68Smrg if (f & FcOpFlagIgnoreBlanks) \ 192ca08ab68Smrg printf ("(ignore blanks)"); \ 193ca08ab68Smrg } 194ca08ab68Smrg 1952c393a42Smrgvoid 196ca08ab68SmrgFcOpPrint (FcOp op_) 1972c393a42Smrg{ 198ca08ab68Smrg FcOp op = FC_OP_GET_OP (op_); 199ca08ab68Smrg 2002c393a42Smrg switch (op) { 2012c393a42Smrg case FcOpInteger: printf ("Integer"); break; 2022c393a42Smrg case FcOpDouble: printf ("Double"); break; 2032c393a42Smrg case FcOpString: printf ("String"); break; 2042c393a42Smrg case FcOpMatrix: printf ("Matrix"); break; 205ca08ab68Smrg case FcOpRange: printf ("Range"); break; 2062c393a42Smrg case FcOpBool: printf ("Bool"); break; 2072c393a42Smrg case FcOpCharSet: printf ("CharSet"); break; 208ca08ab68Smrg case FcOpLangSet: printf ("LangSet"); break; 2092c393a42Smrg case FcOpField: printf ("Field"); break; 2102c393a42Smrg case FcOpConst: printf ("Const"); break; 2112c393a42Smrg case FcOpAssign: printf ("Assign"); break; 2122c393a42Smrg case FcOpAssignReplace: printf ("AssignReplace"); break; 2132c393a42Smrg case FcOpPrepend: printf ("Prepend"); break; 2142c393a42Smrg case FcOpPrependFirst: printf ("PrependFirst"); break; 2152c393a42Smrg case FcOpAppend: printf ("Append"); break; 2162c393a42Smrg case FcOpAppendLast: printf ("AppendLast"); break; 2172c393a42Smrg case FcOpQuest: printf ("Quest"); break; 2182c393a42Smrg case FcOpOr: printf ("Or"); break; 2192c393a42Smrg case FcOpAnd: printf ("And"); break; 220ca08ab68Smrg case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (op_); break; 221ca08ab68Smrg case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (op_); break; 2222c393a42Smrg case FcOpLess: printf ("Less"); break; 2232c393a42Smrg case FcOpLessEqual: printf ("LessEqual"); break; 2242c393a42Smrg case FcOpMore: printf ("More"); break; 2252c393a42Smrg case FcOpMoreEqual: printf ("MoreEqual"); break; 2262c393a42Smrg case FcOpContains: printf ("Contains"); break; 2272c393a42Smrg case FcOpNotContains: printf ("NotContains"); break; 2282c393a42Smrg case FcOpPlus: printf ("Plus"); break; 2292c393a42Smrg case FcOpMinus: printf ("Minus"); break; 2302c393a42Smrg case FcOpTimes: printf ("Times"); break; 2312c393a42Smrg case FcOpDivide: printf ("Divide"); break; 2322c393a42Smrg case FcOpNot: printf ("Not"); break; 2332c393a42Smrg case FcOpNil: printf ("Nil"); break; 2342c393a42Smrg case FcOpComma: printf ("Comma"); break; 2352c393a42Smrg case FcOpFloor: printf ("Floor"); break; 2362c393a42Smrg case FcOpCeil: printf ("Ceil"); break; 2372c393a42Smrg case FcOpRound: printf ("Round"); break; 2382c393a42Smrg case FcOpTrunc: printf ("Trunc"); break; 239ca08ab68Smrg case FcOpListing: printf ("Listing"); FcOpFlagsPrint (op_); break; 2402c393a42Smrg case FcOpInvalid: printf ("Invalid"); break; 2412c393a42Smrg } 2422c393a42Smrg} 2432c393a42Smrg 2442c393a42Smrgvoid 2452c393a42SmrgFcExprPrint (const FcExpr *expr) 2462c393a42Smrg{ 2472c393a42Smrg if (!expr) printf ("none"); 248ca08ab68Smrg else switch (FC_OP_GET_OP (expr->op)) { 2492c393a42Smrg case FcOpInteger: printf ("%d", expr->u.ival); break; 2502c393a42Smrg case FcOpDouble: printf ("%g", expr->u.dval); break; 2512c393a42Smrg case FcOpString: printf ("\"%s\"", expr->u.sval); break; 2522c393a42Smrg case FcOpMatrix: printf ("[%g %g %g %g]", 2532c393a42Smrg expr->u.mval->xx, 2542c393a42Smrg expr->u.mval->xy, 2552c393a42Smrg expr->u.mval->yx, 2562c393a42Smrg expr->u.mval->yy); break; 257ca08ab68Smrg case FcOpRange: break; 2582c393a42Smrg case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break; 2592c393a42Smrg case FcOpCharSet: printf ("charset\n"); break; 260ca08ab68Smrg case FcOpLangSet: 261ca08ab68Smrg printf ("langset:"); 262ca08ab68Smrg FcLangSetPrint(expr->u.lval); 263ca08ab68Smrg printf ("\n"); 264ca08ab68Smrg break; 2652c393a42Smrg case FcOpNil: printf ("nil\n"); break; 2662c393a42Smrg case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break; 2672c393a42Smrg case FcOpConst: printf ("%s", expr->u.constant); break; 2682c393a42Smrg case FcOpQuest: 2692c393a42Smrg FcExprPrint (expr->u.tree.left); 2702c393a42Smrg printf (" quest "); 2712c393a42Smrg FcExprPrint (expr->u.tree.right->u.tree.left); 2722c393a42Smrg printf (" colon "); 2732c393a42Smrg FcExprPrint (expr->u.tree.right->u.tree.right); 2742c393a42Smrg break; 2752c393a42Smrg case FcOpAssign: 2762c393a42Smrg case FcOpAssignReplace: 2772c393a42Smrg case FcOpPrependFirst: 2782c393a42Smrg case FcOpPrepend: 2792c393a42Smrg case FcOpAppend: 2802c393a42Smrg case FcOpAppendLast: 2812c393a42Smrg case FcOpOr: 2822c393a42Smrg case FcOpAnd: 2832c393a42Smrg case FcOpEqual: 2842c393a42Smrg case FcOpNotEqual: 2852c393a42Smrg case FcOpLess: 2862c393a42Smrg case FcOpLessEqual: 2872c393a42Smrg case FcOpMore: 2882c393a42Smrg case FcOpMoreEqual: 2892c393a42Smrg case FcOpContains: 2902c393a42Smrg case FcOpListing: 2912c393a42Smrg case FcOpNotContains: 2922c393a42Smrg case FcOpPlus: 2932c393a42Smrg case FcOpMinus: 2942c393a42Smrg case FcOpTimes: 2952c393a42Smrg case FcOpDivide: 2962c393a42Smrg case FcOpComma: 2972c393a42Smrg FcExprPrint (expr->u.tree.left); 2982c393a42Smrg printf (" "); 299ca08ab68Smrg switch (FC_OP_GET_OP (expr->op)) { 3002c393a42Smrg case FcOpAssign: printf ("Assign"); break; 3012c393a42Smrg case FcOpAssignReplace: printf ("AssignReplace"); break; 3022c393a42Smrg case FcOpPrependFirst: printf ("PrependFirst"); break; 3032c393a42Smrg case FcOpPrepend: printf ("Prepend"); break; 3042c393a42Smrg case FcOpAppend: printf ("Append"); break; 3052c393a42Smrg case FcOpAppendLast: printf ("AppendLast"); break; 3062c393a42Smrg case FcOpOr: printf ("Or"); break; 3072c393a42Smrg case FcOpAnd: printf ("And"); break; 308ca08ab68Smrg case FcOpEqual: printf ("Equal"); FcOpFlagsPrint (expr->op); break; 309ca08ab68Smrg case FcOpNotEqual: printf ("NotEqual"); FcOpFlagsPrint (expr->op); break; 3102c393a42Smrg case FcOpLess: printf ("Less"); break; 3112c393a42Smrg case FcOpLessEqual: printf ("LessEqual"); break; 3122c393a42Smrg case FcOpMore: printf ("More"); break; 3132c393a42Smrg case FcOpMoreEqual: printf ("MoreEqual"); break; 3142c393a42Smrg case FcOpContains: printf ("Contains"); break; 315ca08ab68Smrg case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break; 3162c393a42Smrg case FcOpNotContains: printf ("NotContains"); break; 3172c393a42Smrg case FcOpPlus: printf ("Plus"); break; 3182c393a42Smrg case FcOpMinus: printf ("Minus"); break; 3192c393a42Smrg case FcOpTimes: printf ("Times"); break; 3202c393a42Smrg case FcOpDivide: printf ("Divide"); break; 3212c393a42Smrg case FcOpComma: printf ("Comma"); break; 3222c393a42Smrg default: break; 3232c393a42Smrg } 3242c393a42Smrg printf (" "); 3252c393a42Smrg FcExprPrint (expr->u.tree.right); 3262c393a42Smrg break; 3272c393a42Smrg case FcOpNot: 3282c393a42Smrg printf ("Not "); 3292c393a42Smrg FcExprPrint (expr->u.tree.left); 3302c393a42Smrg break; 3312c393a42Smrg case FcOpFloor: 3322c393a42Smrg printf ("Floor "); 3332c393a42Smrg FcExprPrint (expr->u.tree.left); 3342c393a42Smrg break; 3352c393a42Smrg case FcOpCeil: 3362c393a42Smrg printf ("Ceil "); 3372c393a42Smrg FcExprPrint (expr->u.tree.left); 3382c393a42Smrg break; 3392c393a42Smrg case FcOpRound: 3402c393a42Smrg printf ("Round "); 3412c393a42Smrg FcExprPrint (expr->u.tree.left); 3422c393a42Smrg break; 3432c393a42Smrg case FcOpTrunc: 3442c393a42Smrg printf ("Trunc "); 3452c393a42Smrg FcExprPrint (expr->u.tree.left); 3462c393a42Smrg break; 3472c393a42Smrg case FcOpInvalid: printf ("Invalid"); break; 3482c393a42Smrg } 3492c393a42Smrg} 3502c393a42Smrg 3512c393a42Smrgvoid 3522c393a42SmrgFcTestPrint (const FcTest *test) 3532c393a42Smrg{ 3542c393a42Smrg switch (test->kind) { 3552c393a42Smrg case FcMatchPattern: 3562c393a42Smrg printf ("pattern "); 3572c393a42Smrg break; 3582c393a42Smrg case FcMatchFont: 3592c393a42Smrg printf ("font "); 3602c393a42Smrg break; 3612c393a42Smrg case FcMatchScan: 3622c393a42Smrg printf ("scan "); 3632c393a42Smrg break; 3642c393a42Smrg } 3652c393a42Smrg switch (test->qual) { 3662c393a42Smrg case FcQualAny: 3672c393a42Smrg printf ("any "); 3682c393a42Smrg break; 3692c393a42Smrg case FcQualAll: 3702c393a42Smrg printf ("all "); 3712c393a42Smrg break; 3722c393a42Smrg case FcQualFirst: 3732c393a42Smrg printf ("first "); 3742c393a42Smrg break; 3752c393a42Smrg case FcQualNotFirst: 3762c393a42Smrg printf ("not_first "); 3772c393a42Smrg break; 3782c393a42Smrg } 3792c393a42Smrg printf ("%s ", FcObjectName (test->object)); 3802c393a42Smrg FcOpPrint (test->op); 3812c393a42Smrg printf (" "); 3822c393a42Smrg FcExprPrint (test->expr); 3832c393a42Smrg printf ("\n"); 3842c393a42Smrg} 3852c393a42Smrg 3862c393a42Smrgvoid 3872c393a42SmrgFcEditPrint (const FcEdit *edit) 3882c393a42Smrg{ 3892c393a42Smrg printf ("Edit %s ", FcObjectName (edit->object)); 3902c393a42Smrg FcOpPrint (edit->op); 3912c393a42Smrg printf (" "); 3922c393a42Smrg FcExprPrint (edit->expr); 3932c393a42Smrg} 3942c393a42Smrg 3952c393a42Smrgvoid 3962c393a42SmrgFcSubstPrint (const FcSubst *subst) 3972c393a42Smrg{ 3982c393a42Smrg FcEdit *e; 3992c393a42Smrg FcTest *t; 400ca08ab68Smrg 4012c393a42Smrg printf ("match\n"); 4022c393a42Smrg for (t = subst->test; t; t = t->next) 4032c393a42Smrg { 4042c393a42Smrg printf ("\t"); 4052c393a42Smrg FcTestPrint (t); 4062c393a42Smrg } 4072c393a42Smrg printf ("edit\n"); 4082c393a42Smrg for (e = subst->edit; e; e = e->next) 4092c393a42Smrg { 4102c393a42Smrg printf ("\t"); 4112c393a42Smrg FcEditPrint (e); 4122c393a42Smrg printf (";\n"); 4132c393a42Smrg } 4142c393a42Smrg printf ("\n"); 4152c393a42Smrg} 4162c393a42Smrg 4172c393a42Smrgvoid 4182c393a42SmrgFcFontSetPrint (const FcFontSet *s) 4192c393a42Smrg{ 4202c393a42Smrg int i; 4212c393a42Smrg 4222c393a42Smrg printf ("FontSet %d of %d\n", s->nfont, s->sfont); 4232c393a42Smrg for (i = 0; i < s->nfont; i++) 4242c393a42Smrg { 4252c393a42Smrg printf ("Font %d ", i); 4262c393a42Smrg FcPatternPrint (s->fonts[i]); 4272c393a42Smrg } 4282c393a42Smrg} 4292c393a42Smrg 4302c393a42Smrgint FcDebugVal; 4312c393a42Smrg 4322c393a42Smrgvoid 4332c393a42SmrgFcInitDebug (void) 4342c393a42Smrg{ 4352c393a42Smrg char *e; 4362c393a42Smrg 4372c393a42Smrg e = getenv ("FC_DEBUG"); 4382c393a42Smrg if (e) 4392c393a42Smrg { 4402c393a42Smrg printf ("FC_DEBUG=%s\n", e); 4412c393a42Smrg FcDebugVal = atoi (e); 4422c393a42Smrg if (FcDebugVal < 0) 4432c393a42Smrg FcDebugVal = 0; 4442c393a42Smrg } 4452c393a42Smrg} 4462c393a42Smrg#define __fcdbg__ 4472c393a42Smrg#include "fcaliastail.h" 4482c393a42Smrg#undef __fcdbg__ 449