return e;
}
+static FcExpr *
+FcExprCreateLangSet (FcConfig *config, FcLangSet *langset)
+{
+ FcExpr *e = FcConfigAllocExpr (config);
+ if (e)
+ {
+ e->op = FcOpLangSet;
+ e->u.lval = FcLangSetCopy (langset);
+ }
+ return e;
+}
+
static FcExpr *
FcExprCreateField (FcConfig *config, const char *field)
{
case FcOpCharSet:
FcCharSetDestroy (e->u.cval);
break;
+ case FcOpLangSet:
+ FcLangSetDestroy (e->u.lval);
+ break;
case FcOpBool:
break;
case FcOpField:
FcElementRange,
FcElementBool,
FcElementCharSet,
+ FcElementLangSet,
FcElementName,
FcElementConst,
FcElementOr,
{ "range", FcElementRange },
{ "bool", FcElementBool },
{ "charset", FcElementCharSet },
+ { "langset", FcElementLangSet },
{ "name", FcElementName },
{ "const", FcElementConst },
{ "or", FcElementOr },
FcVStackRange,
FcVStackBool,
FcVStackCharSet,
+ FcVStackLangSet,
FcVStackTest,
FcVStackExpr,
FcRange range;
FcBool bool_;
FcCharSet *charset;
+ FcLangSet *langset;
FcTest *test;
FcQual qual;
case FcOpCharSet:
FcTypecheckValue (parse, FcTypeCharSet, type);
break;
+ case FcOpLangSet:
+ FcTypecheckValue (parse, FcTypeLangSet, type);
+ break;
case FcOpNil:
break;
case FcOpField:
return FcTrue;
}
+static FcBool
+FcVStackPushLangSet (FcConfigParse *parse, FcLangSet *langset)
+{
+ FcVStack *vstack;
+ if (!langset)
+ return FcFalse;
+ vstack = FcVStackCreateAndPush (parse);
+ if (!vstack)
+ return FcFalse;
+ vstack->u.langset = langset;
+ vstack->tag = FcVStackLangSet;
+ return FcTrue;
+}
+
static FcBool
FcVStackPushTest (FcConfigParse *parse, FcTest *test)
{
case FcVStackCharSet:
FcCharSetDestroy (vstack->u.charset);
break;
+ case FcVStackLangSet:
+ FcLangSetDestroy (vstack->u.langset);
+ break;
case FcVStackTest:
FcTestDestroy (vstack->u.test);
break;
FcCharSetDestroy (charset);
}
+static void
+FcParseLangSet (FcConfigParse *parse)
+{
+ FcVStack *vstack;
+ FcLangSet *langset = FcLangSetCreate ();
+ int n = 0;
+
+ while ((vstack = FcVStackPeek (parse)))
+ {
+ switch (vstack->tag) {
+ case FcVStackString:
+ if (!FcLangSetAdd (langset, vstack->u.string))
+ {
+ FcConfigMessage (parse, FcSevereWarning, "invalid langset: %s", vstack->u.string);
+ }
+ else
+ n++;
+ break;
+ default:
+ FcConfigMessage (parse, FcSevereError, "invalid element in langset");
+ break;
+ }
+ FcVStackPopAndDestroy (parse);
+ }
+ if (n > 0)
+ FcVStackPushLangSet (parse, langset);
+ else
+ FcLangSetDestroy (langset);
+}
+
static FcBool
FcConfigLexBinding (FcConfigParse *parse,
const FcChar8 *binding_string,
case FcVStackCharSet:
expr = FcExprCreateCharSet (parse->config, vstack->u.charset);
break;
+ case FcVStackLangSet:
+ expr = FcExprCreateLangSet (parse->config, vstack->u.langset);
+ break;
case FcVStackTest:
break;
case FcVStackExpr:
if (value.u.c)
value.type = FcTypeCharSet;
break;
+ case FcVStackLangSet:
+ value.u.l = FcLangSetCopy (vstack->u.langset);
+ if (value.u.l)
+ value.type = FcTypeLangSet;
+ break;
default:
FcConfigMessage (parse, FcSevereWarning, "unknown pattern element %d",
vstack->tag);
case FcElementCharSet:
FcParseCharSet (parse);
break;
+ case FcElementLangSet:
+ FcParseLangSet (parse);
+ break;
case FcElementSelectfont:
break;
case FcElementAcceptfont: