/*
- * $RCSId: xc/lib/fontconfig/src/fcxml.c,v 1.21 2002/08/22 18:53:22 keithp Exp $
+ * fontconfig/src/fcxml.c
*
* Copyright © 2002 Keith Packard
*
int integer;
double _double;
FcMatrix *matrix;
- FcBool bool;
+ FcBool bool_;
FcTest *test;
FcQual qual;
const FcChar8 *name;
FcConfig *config;
XML_Parser parser;
+ int pstack_static_used;
+ FcPStack pstack_static[8];
} FcConfigParse;
typedef enum _FcConfigSeverity {
}
static FcBool
-FcVStackPushBool (FcConfigParse *parse, FcBool bool)
+FcVStackPushBool (FcConfigParse *parse, FcBool bool_)
{
FcVStack *vstack = FcVStackCreate ();
if (!vstack)
return FcFalse;
- vstack->u.bool = bool;
+ vstack->u.bool_ = bool_;
vstack->tag = FcVStackBool;
FcVStackPush (parse, vstack);
return FcTrue;
slen = 0;
for (i = 0; attr[i]; i++)
slen += strlen ((char *) attr[i]) + 1;
+ if (i == 0)
+ return 0;
new = malloc ((i + 1) * sizeof (FcChar8 *) + slen);
if (!new)
+ {
+ FcConfigMessage (0, FcSevereError, "out of memory");
return 0;
+ }
FcMemAlloc (FC_MEM_ATTR, 1); /* size is too expensive */
s = (FcChar8 *) (new + (i + 1));
for (i = 0; attr[i]; i++)
static FcBool
FcPStackPush (FcConfigParse *parse, FcElement element, const XML_Char **attr)
{
- FcPStack *new = malloc (sizeof (FcPStack));
+ FcPStack *new;
- if (!new)
- return FcFalse;
- FcMemAlloc (FC_MEM_PSTACK, sizeof (FcPStack));
- new->prev = parse->pstack;
- new->element = element;
- if (attr)
+ if (parse->pstack_static_used < sizeof (parse->pstack_static) / sizeof (parse->pstack_static[0]))
+ new = &parse->pstack_static[parse->pstack_static_used++];
+ else
{
- new->attr = FcConfigSaveAttr (attr);
- if (!new->attr)
- {
- FcConfigMessage (parse, FcSevereError, "out of memory");
- FcMemFree (FC_MEM_PSTACK, sizeof (FcPStack));
- free (new);
+ new = malloc (sizeof (FcPStack));
+ if (!new)
return FcFalse;
- }
+ FcMemAlloc (FC_MEM_PSTACK, sizeof (FcPStack));
}
- else
- new->attr = 0;
+
+ new->prev = parse->pstack;
+ new->element = element;
+ new->attr = FcConfigSaveAttr (attr);
FcStrBufInit (&new->str, 0, 0);
parse->pstack = new;
return FcTrue;
FcMemFree (FC_MEM_ATTR, 1); /* size is to expensive */
free (old->attr);
}
- FcMemFree (FC_MEM_PSTACK, sizeof (FcPStack));
- free (old);
+
+ if (old == &parse->pstack_static[parse->pstack_static_used - 1])
+ parse->pstack_static_used--;
+ else
+ {
+ FcMemFree (FC_MEM_PSTACK, sizeof (FcPStack));
+ free (old);
+ }
return FcTrue;
}
FcConfigInit (FcConfigParse *parse, const FcChar8 *name, FcConfig *config, XML_Parser parser)
{
parse->pstack = 0;
+ parse->pstack_static_used = 0;
parse->vstack = 0;
parse->error = FcFalse;
parse->name = name;
if (!parse->pstack)
return;
- s = FcStrBufDone (&parse->pstack->str);
+ s = FcStrBufDoneStatic (&parse->pstack->str);
if (!s)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid integer", s);
else
FcVStackPushInteger (parse, l);
- FcStrFree (s);
+ FcStrBufDestroy (&parse->pstack->str);
}
/*
if (!parse->pstack)
return;
- s = FcStrBufDone (&parse->pstack->str);
+ s = FcStrBufDoneStatic (&parse->pstack->str);
if (!s)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid double", s);
else
FcVStackPushDouble (parse, d);
- FcStrFree (s);
+ FcStrBufDestroy (&parse->pstack->str);
}
static void
}
static FcBool
-FcConfigLexBool (FcConfigParse *parse, const FcChar8 *bool)
+FcConfigLexBool (FcConfigParse *parse, const FcChar8 *bool_)
{
FcBool result = FcFalse;
- if (!FcNameBool (bool, &result))
+ if (!FcNameBool (bool_, &result))
FcConfigMessage (parse, FcSevereWarning, "\"%s\" is not known boolean",
- bool);
+ bool_);
return result;
}
if (!parse->pstack)
return;
- s = FcStrBufDone (&parse->pstack->str);
+ s = FcStrBufDoneStatic (&parse->pstack->str);
if (!s)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
return;
}
FcVStackPushBool (parse, FcConfigLexBool (parse, s));
- FcStrFree (s);
+ FcStrBufDestroy (&parse->pstack->str);
}
static FcBool
if (!parse->pstack)
return;
- s = FcStrBufDone (&parse->pstack->str);
+ s = FcStrBufDoneStatic (&parse->pstack->str);
if (!s)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
return;
}
expr = FcExprCreateString (s);
- FcStrFree (s);
+ FcStrBufDestroy (&parse->pstack->str);
if (expr)
FcVStackPushExpr (parse, FcVStackFamily, expr);
}
expr = FcExprCreateMatrix (vstack->u.matrix);
break;
case FcVStackBool:
- expr = FcExprCreateBool (vstack->u.bool);
+ expr = FcExprCreateBool (vstack->u.bool_);
break;
case FcVStackTest:
break;
const FcChar8 *i;
FcBool ignore_missing = FcFalse;
- s = FcStrBufDone (&parse->pstack->str);
+ s = FcStrBufDoneStatic (&parse->pstack->str);
if (!s)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
ignore_missing = FcTrue;
if (!FcConfigParseAndLoad (parse->config, s, !ignore_missing))
parse->error = FcTrue;
- FcStrFree (s);
+ FcStrBufDestroy (&parse->pstack->str);
}
typedef struct _FcOpMap {
value.type = FcTypeMatrix;
break;
case FcVStackBool:
- value.u.b = vstack->u.bool;
+ value.u.b = vstack->u.bool_;
value.type = FcTypeBool;
break;
default:
if (!FcPatternAdd (pattern, name, value, FcTrue))
{
FcConfigMessage (parse, FcSevereError, "out of memory");
+ FcValueDestroy(value);
break;
}
+ FcValueDestroy(value);
}
FcVStackPushPattern (parse, pattern);
case FcElementFontconfig:
break;
case FcElementDir:
- data = FcStrBufDone (&parse->pstack->str);
+ data = FcStrBufDoneStatic (&parse->pstack->str);
if (!data)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
#ifdef _WIN32
if (strcmp (data, "CUSTOMFONTDIR") == 0)
{
+ char *p;
FcStrFree (data);
data = malloc (1000);
if (!data)
FcStrFree (data);
break;
}
- char *p = strrchr (data, '\\');
+ p = strrchr (data, '\\');
if (p) *p = '\0';
strcat (data, "\\fonts");
}
+ else if (strcmp (data, "APPSHAREFONTDIR") == 0)
+ {
+ char *p;
+ FcStrFree (data);
+ data = malloc (1000);
+ if (!data)
+ {
+ FcConfigMessage (parse, FcSevereError, "out of memory");
+ break;
+ }
+ FcMemAlloc (FC_MEM_STRING, 1000);
+ if(!GetModuleFileName(NULL, data, 1000))
+ {
+ FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed");
+ FcStrFree (data);
+ break;
+ }
+ p = strrchr (data, '\\');
+ if (p) *p = '\0';
+ strcat (data, "\\..\\share\\fonts");
+ }
else if (strcmp (data, "WINDOWSFONTDIR") == 0)
{
int rc;
strcat (data, "fonts");
}
#endif
- if (!FcStrUsesHome (data) || FcConfigHome ())
+ if (strlen ((char *) data) == 0)
+ FcConfigMessage (parse, FcSevereWarning, "empty font directory name ignored");
+ else if (!FcStrUsesHome (data) || FcConfigHome ())
{
if (!FcConfigAddDir (parse->config, data))
FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", data);
}
- FcStrFree (data);
+ FcStrBufDestroy (&parse->pstack->str);
break;
case FcElementCacheDir:
data = FcStrBufDone (&parse->pstack->str);
break;
case FcElementCache:
- data = FcStrBufDone (&parse->pstack->str);
+ data = FcStrBufDoneStatic (&parse->pstack->str);
if (!data)
{
FcConfigMessage (parse, FcSevereError, "out of memory");
break;
}
/* discard this data; no longer used */
- FcStrFree (data);
+ FcStrBufDestroy (&parse->pstack->str);
break;
case FcElementInclude:
FcParseInclude (parse);