]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcname.c
Overhaul the serialization system to create one mmapable file per directory
[fontconfig.git] / src / fcname.c
index ed7c6c595ec3fe8f97e85354755d7ad2ba4ef436..1cdba565305ec3c77ef1b4d121ae57f15fe62925 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * $XFree86: xc/lib/Fc/xftname.c,v 1.10 2001/03/30 18:50:18 keithp Exp $
+ * $RCSId: xc/lib/fontconfig/src/fcname.c,v 1.15 2002/09/26 00:17:28 keithp Exp $
  *
- * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2000 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 
 static const FcObjectType _FcBaseObjectTypes[] = {
     { FC_FAMILY,       FcTypeString, },
+    { FC_FAMILYLANG,   FcTypeString, },
     { FC_STYLE,                FcTypeString, },
+    { FC_STYLELANG,    FcTypeString, },
+    { FC_FULLNAME,     FcTypeString, },
+    { FC_FULLNAMELANG, FcTypeString, },
     { FC_SLANT,                FcTypeInteger, },
     { FC_WEIGHT,       FcTypeInteger, },
+    { FC_WIDTH,                FcTypeInteger, },
     { FC_SIZE,         FcTypeDouble, },
+    { FC_ASPECT,       FcTypeDouble, },
     { FC_PIXEL_SIZE,   FcTypeDouble, },
     { FC_SPACING,      FcTypeInteger, },
     { FC_FOUNDRY,      FcTypeString, },
 /*    { FC_CORE,               FcTypeBool, }, */
     { FC_ANTIALIAS,    FcTypeBool, },
+    { FC_HINT_STYLE,    FcTypeInteger, },
+    { FC_HINTING,      FcTypeBool, },
+    { FC_VERTICAL_LAYOUT,   FcTypeBool, },
+    { FC_AUTOHINT,     FcTypeBool, },
+    { FC_GLOBAL_ADVANCE,    FcTypeBool, },
 /*    { FC_XLFD,               FcTypeString, }, */
     { FC_FILE,         FcTypeString, },
     { FC_INDEX,                FcTypeInteger, },
     { FC_RASTERIZER,   FcTypeString, },
     { FC_OUTLINE,      FcTypeBool, },
     { FC_SCALABLE,     FcTypeBool, },
+    { FC_DPI,          FcTypeDouble },
     { FC_RGBA,         FcTypeInteger, },
     { FC_SCALE,                FcTypeDouble, },
 /*    { FC_RENDER,     FcTypeBool, },*/
@@ -53,7 +65,11 @@ static const FcObjectType _FcBaseObjectTypes[] = {
     { FC_CHAR_HEIGHT,  FcTypeInteger },
     { FC_MATRIX,       FcTypeMatrix },
     { FC_CHARSET,      FcTypeCharSet },
-    { FC_LANG,         FcTypeString },
+    { FC_LANG,         FcTypeLangSet },
+    { FC_FONTVERSION,  FcTypeInteger },
+    { FC_CAPABILITY,   FcTypeString },
+    { FC_FONTFORMAT,   FcTypeString },
+    { FC_EMBOLDEN,     FcTypeBool },
 };
 
 #define NUM_OBJECT_TYPES    (sizeof _FcBaseObjectTypes / sizeof _FcBaseObjectTypes[0])
@@ -82,6 +98,7 @@ FcNameRegisterObjectTypes (const FcObjectType *types, int ntypes)
     l = (FcObjectTypeList *) malloc (sizeof (FcObjectTypeList));
     if (!l)
        return FcFalse;
+    FcMemAlloc (FC_MEM_OBJECTTYPE, sizeof (FcObjectTypeList));
     l->types = types;
     l->ntypes = ntypes;
     l->next = _FcObjectTypes;
@@ -101,6 +118,7 @@ FcNameUnregisterObjectTypes (const FcObjectType *types, int ntypes)
        if (l->types == types && l->ntypes == ntypes)
        {
            *prev = l->next;
+           FcMemFree (FC_MEM_OBJECTTYPE, sizeof (FcObjectTypeList));
            free ((void *) l);
            return FcTrue;
        }
@@ -120,32 +138,126 @@ FcNameGetObjectType (const char *object)
        for (i = 0; i < l->ntypes; i++)
        {
            t = &l->types[i];
-           if (!FcStrCmpIgnoreCase (object, t->object))
+           if (!strcmp (object, t->object))
                return t;
        }
     }
     return 0;
 }
 
+static int objectptr_count = 1;
+static int objectptr_alloc = 0;
+static int * objectptr_indices = 0;
+
+void
+FcObjectNewBank(void)
+{
+    objectptr_count = 1;
+    objectptr_alloc = 0;
+    objectptr_indices = 0;
+}
+
+// XXX todo: introduce a hashtable for faster lookup
+FcObjectPtr
+FcObjectToPtr (const char * object)
+{
+    int                            i;
+    const FcObjectTypeList  *l;
+    const FcObjectType     *t;
+    
+    for (l = _FcObjectTypes; l; l = l->next)
+    {
+       for (i = 0; i < l->ntypes; i++)
+       {
+           t = &l->types[i];
+           if (!strcmp (object, t->object))
+               return i;
+       }
+    }
+    abort();
+    return 0;
+}
+
+const char *
+FcObjectPtrU (FcObjectPtr si)
+{
+    return _FcObjectTypes->types[si].object;
+}
+
+int
+FcObjectNeededBytes (FcObjectPtr si)
+{
+    return 0;
+}
+
+void *
+FcObjectDistributeBytes (FcCache * metadata, void * block_ptr)
+{
+    return block_ptr;
+}
+
+FcObjectPtr
+FcObjectSerialize (FcObjectPtr si)
+{
+    return si;
+}
+
+void
+FcObjectUnserialize (FcCache metadata, FcConfig * config, void *block_ptr)
+{
+}
+
+int
+FcObjectPtrCompare (const FcObjectPtr a, const FcObjectPtr b)
+{
+    return a - b;
+}
+
 static const FcConstant _FcBaseConstants[] = {
-    { "light",         "weight",   FC_WEIGHT_LIGHT, },
-    { "medium",                "weight",   FC_WEIGHT_MEDIUM, },
-    { "demibold",      "weight",   FC_WEIGHT_DEMIBOLD, },
-    { "bold",          "weight",   FC_WEIGHT_BOLD, },
-    { "black",         "weight",   FC_WEIGHT_BLACK, },
-
-    { "roman",         "slant",    FC_SLANT_ROMAN, },
-    { "italic",                "slant",    FC_SLANT_ITALIC, },
-    { "oblique",       "slant",    FC_SLANT_OBLIQUE, },
-
-    { "proportional",  "spacing",  FC_PROPORTIONAL, },
-    { "mono",          "spacing",  FC_MONO, },
-    { "charcell",      "spacing",  FC_CHARCELL, },
-
-    { "rgb",           "rgba",     FC_RGBA_RGB, },
-    { "bgr",           "rgba",     FC_RGBA_BGR, },
-    { "vrgb",          "rgba",     FC_RGBA_VRGB },
-    { "vbgr",          "rgba",     FC_RGBA_VBGR },
+    { (FcChar8 *) "thin",          "weight",   FC_WEIGHT_THIN, },
+    { (FcChar8 *) "extralight",            "weight",   FC_WEIGHT_EXTRALIGHT, },
+    { (FcChar8 *) "ultralight",            "weight",   FC_WEIGHT_EXTRALIGHT, },
+    { (FcChar8 *) "light",         "weight",   FC_WEIGHT_LIGHT, },
+    { (FcChar8 *) "book",          "weight",   FC_WEIGHT_BOOK, },
+    { (FcChar8 *) "regular",       "weight",   FC_WEIGHT_REGULAR, },
+    { (FcChar8 *) "medium",        "weight",   FC_WEIGHT_MEDIUM, },
+    { (FcChar8 *) "demibold",      "weight",   FC_WEIGHT_DEMIBOLD, },
+    { (FcChar8 *) "semibold",      "weight",   FC_WEIGHT_DEMIBOLD, },
+    { (FcChar8 *) "bold",          "weight",   FC_WEIGHT_BOLD, },
+    { (FcChar8 *) "extrabold",     "weight",   FC_WEIGHT_EXTRABOLD, },
+    { (FcChar8 *) "ultrabold",     "weight",   FC_WEIGHT_EXTRABOLD, },
+    { (FcChar8 *) "black",         "weight",   FC_WEIGHT_BLACK, },
+
+    { (FcChar8 *) "roman",         "slant",    FC_SLANT_ROMAN, },
+    { (FcChar8 *) "italic",        "slant",    FC_SLANT_ITALIC, },
+    { (FcChar8 *) "oblique",       "slant",    FC_SLANT_OBLIQUE, },
+
+    { (FcChar8 *) "ultracondensed", "width",   FC_WIDTH_ULTRACONDENSED },
+    { (FcChar8 *) "extracondensed", "width",   FC_WIDTH_EXTRACONDENSED },
+    { (FcChar8 *) "condensed",     "width",    FC_WIDTH_CONDENSED },
+    { (FcChar8 *) "semicondensed", "width",    FC_WIDTH_SEMICONDENSED },
+    { (FcChar8 *) "normal",        "width",    FC_WIDTH_NORMAL },
+    { (FcChar8 *) "semiexpanded",   "width",   FC_WIDTH_SEMIEXPANDED },
+    { (FcChar8 *) "expanded",      "width",    FC_WIDTH_EXPANDED },
+    { (FcChar8 *) "extraexpanded",  "width",   FC_WIDTH_EXTRAEXPANDED },
+    { (FcChar8 *) "ultraexpanded",  "width",   FC_WIDTH_ULTRAEXPANDED },
+    
+    { (FcChar8 *) "proportional",   "spacing",  FC_PROPORTIONAL, },
+    { (FcChar8 *) "dual",          "spacing",  FC_DUAL, },
+    { (FcChar8 *) "mono",          "spacing",  FC_MONO, },
+    { (FcChar8 *) "charcell",      "spacing",  FC_CHARCELL, },
+
+    { (FcChar8 *) "unknown",       "rgba",         FC_RGBA_UNKNOWN },
+    { (FcChar8 *) "rgb",           "rgba",         FC_RGBA_RGB, },
+    { (FcChar8 *) "bgr",           "rgba",         FC_RGBA_BGR, },
+    { (FcChar8 *) "vrgb",          "rgba",         FC_RGBA_VRGB },
+    { (FcChar8 *) "vbgr",          "rgba",         FC_RGBA_VBGR },
+    { (FcChar8 *) "none",          "rgba",         FC_RGBA_NONE },
+
+    { (FcChar8 *) "hintnone",      "hintstyle",   FC_HINT_NONE },
+    { (FcChar8 *) "hintslight",            "hintstyle",   FC_HINT_SLIGHT },
+    { (FcChar8 *) "hintmedium",            "hintstyle",   FC_HINT_MEDIUM },
+    { (FcChar8 *) "hintfull",      "hintstyle",   FC_HINT_FULL },
 };
 
 #define NUM_FC_CONSTANTS   (sizeof _FcBaseConstants/sizeof _FcBaseConstants[0])
@@ -174,6 +286,7 @@ FcNameRegisterConstants (const FcConstant *consts, int nconsts)
     l = (FcConstantList *) malloc (sizeof (FcConstantList));
     if (!l)
        return FcFalse;
+    FcMemAlloc (FC_MEM_CONSTANT, sizeof (FcConstantList));
     l->consts = consts;
     l->nconsts = nconsts;
     l->next = _FcConstants;
@@ -193,6 +306,7 @@ FcNameUnregisterConstants (const FcConstant *consts, int nconsts)
        if (l->consts == consts && l->nconsts == nconsts)
        {
            *prev = l->next;
+           FcMemFree (FC_MEM_CONSTANT, sizeof (FcConstantList));
            free ((void *) l);
            return FcTrue;
        }
@@ -201,11 +315,11 @@ FcNameUnregisterConstants (const FcConstant *consts, int nconsts)
 }
 
 const FcConstant *
-FcNameGetConstant (char *string)
+FcNameGetConstant (FcChar8 *string)
 {
     const FcConstantList    *l;
     int                            i;
-    
+
     for (l = _FcConstants; l; l = l->next)
     {
        for (i = 0; i < l->nconsts; i++)
@@ -216,7 +330,7 @@ FcNameGetConstant (char *string)
 }
 
 FcBool
-FcNameConstant (char *string, int *result)
+FcNameConstant (FcChar8 *string, int *result)
 {
     const FcConstant   *c;
 
@@ -229,13 +343,12 @@ FcNameConstant (char *string, int *result)
 }
 
 FcBool
-FcNameBool (char *v, FcBool *result)
+FcNameBool (const FcChar8 *v, FcBool *result)
 {
     char    c0, c1;
 
     c0 = *v;
-    if (isupper (c0))
-       c0 = tolower (c0);
+    c0 = FcToLower (c0);
     if (c0 == 't' || c0 == 'y' || c0 == '1')
     {
        *result = FcTrue;
@@ -249,8 +362,7 @@ FcNameBool (char *v, FcBool *result)
     if (c0 == 'o')
     {
        c1 = v[1];
-       if (isupper (c1))
-           c1 = tolower (c1);
+       c1 = FcToLower (c1);
        if (c1 == 'n')
        {
            *result = FcTrue;
@@ -266,7 +378,7 @@ FcNameBool (char *v, FcBool *result)
 }
 
 static FcValue
-FcNameConvert (FcType type, char *string, FcMatrix *m)
+FcNameConvert (FcType type, FcChar8 *string, FcMatrix *m)
 {
     FcValue    v;
 
@@ -274,35 +386,38 @@ FcNameConvert (FcType type, char *string, FcMatrix *m)
     switch (v.type) {
     case FcTypeInteger:
        if (!FcNameConstant (string, &v.u.i))
-           v.u.i = atoi (string);
+           v.u.i = atoi ((char *) string);
        break;
     case FcTypeString:
-       v.u.s = string;
+       v.u.s = FcObjectStaticName(string);
        break;
     case FcTypeBool:
        if (!FcNameBool (string, &v.u.b))
            v.u.b = FcFalse;
        break;
     case FcTypeDouble:
-       v.u.d = strtod (string, 0);
+       v.u.d = strtod ((char *) string, 0);
        break;
     case FcTypeMatrix:
        v.u.m = m;
-       sscanf (string, "%lg %lg %lg %lg", &m->xx, &m->xy, &m->yx, &m->yy);
+       sscanf ((char *) string, "%lg %lg %lg %lg", &m->xx, &m->xy, &m->yx, &m->yy);
        break;
     case FcTypeCharSet:
        v.u.c = FcNameParseCharSet (string);
        break;
+    case FcTypeLangSet:
+       v.u.l = FcNameParseLangSet (string);
+       break;
     default:
        break;
     }
     return v;
 }
 
-static const char *
-FcNameFindNext (const char *cur, const char *delim, char *save, char *last)
+static const FcChar8 *
+FcNameFindNext (const FcChar8 *cur, const char *delim, FcChar8 *save, FcChar8 *last)
 {
-    char    c;
+    FcChar8    c;
     
     while ((c = *cur))
     {
@@ -325,19 +440,20 @@ FcNameFindNext (const char *cur, const char *delim, char *save, char *last)
 }
 
 FcPattern *
-FcNameParse (const char *name)
+FcNameParse (const FcChar8 *name)
 {
-    char               *save;
+    FcChar8            *save;
     FcPattern          *pat;
     double             d;
-    char               *e;
-    char               delim;
+    FcChar8            *e;
+    FcChar8            delim;
     FcValue            v;
     FcMatrix           m;
     const FcObjectType *t;
     const FcConstant   *c;
 
-    save = malloc (strlen (name) + 1);
+    /* freed below */
+    save = malloc (strlen ((char *) name) + 1);
     if (!save)
        goto bail0;
     pat = FcPatternCreate ();
@@ -360,7 +476,7 @@ FcNameParse (const char *name)
        for (;;)
        {
            name = FcNameFindNext (name, "-,:", save, &delim);
-           d = strtod (save, &e);
+           d = strtod ((char *) save, (char **) &e);
            if (e != save)
            {
                if (!FcPatternAddDouble (pat, FC_SIZE, d))
@@ -377,21 +493,37 @@ FcNameParse (const char *name)
        {
            if (delim == '=' || delim == '_')
            {
-               t = FcNameGetObjectType (save);
+               t = FcNameGetObjectType ((char *) save);
                for (;;)
                {
                    name = FcNameFindNext (name, ":,", save, &delim);
-                   if (save[0] && t)
+                   if (t)
                    {
                        v = FcNameConvert (t->type, save, &m);
                        if (!FcPatternAdd (pat, t->object, v, FcTrue))
                        {
-                           if (v.type == FcTypeCharSet)
+                           switch (v.type) {
+                           case FcTypeCharSet:
                                FcCharSetDestroy ((FcCharSet *) v.u.c);
+                               break;
+                           case FcTypeLangSet:
+                               FcLangSetDestroy ((FcLangSet *) v.u.l);
+                               break;
+                           default:
+                               break;
+                           }
                            goto bail2;
                        }
-                       if (v.type == FcTypeCharSet)
+                       switch (v.type) {
+                       case FcTypeCharSet:
                            FcCharSetDestroy ((FcCharSet *) v.u.c);
+                           break;
+                       case FcTypeLangSet:
+                           FcLangSetDestroy ((FcLangSet *) v.u.l);
+                           break;
+                       default:
+                           break;
+                       }
                    }
                    if (delim != ',')
                        break;
@@ -418,86 +550,8 @@ bail1:
 bail0:
     return 0;
 }
-
-static void
-FcNameBufInit (FcNameBuf *buf, FcChar8 *init, int size)
-{
-    buf->buf = init;
-    buf->allocated = FcFalse;
-    buf->failed = FcFalse;
-    buf->len = 0;
-    buf->size = size;
-}
-
-static void
-FcNameBufDestroy (FcNameBuf *buf)
-{
-    if (buf->allocated)
-       free (buf->buf);
-}
-
-static FcChar8 *
-FcNameBufDone (FcNameBuf *buf)
-{
-    FcChar8 *ret;
-
-    ret = malloc (buf->len + 1);
-    if (ret)
-    {
-       memcpy (ret, buf->buf, buf->len);
-       ret[buf->len] = '\0';
-    }
-    FcNameBufDestroy (buf);
-    return ret;
-}
-
-FcBool
-FcNameBufChar (FcNameBuf *buf, FcChar8 c)
-{
-    if (buf->len == buf->size)
-    {
-       FcChar8     *new;
-       int         size;
-
-       if (buf->allocated)
-       {
-           size = buf->size * 2;
-           new = realloc (buf->buf, size);
-       }
-       else
-       {
-           size = buf->size + 1024;
-           new = malloc (size);
-           if (new)
-           {
-               buf->allocated = FcTrue;
-               memcpy (new, buf->buf, buf->len);
-           }
-       }
-       if (!new)
-       {
-           buf->failed = FcTrue;
-           return FcFalse;
-       }
-       buf->size = size;
-       buf->buf = new;
-    }
-    buf->buf[buf->len++] = c;
-    return FcTrue;
-}
-
-FcBool
-FcNameBufString (FcNameBuf *buf, const FcChar8 *s)
-{
-    FcChar8 c;
-    while ((c = *s++))
-       if (!FcNameBufChar (buf, c))
-           return FcFalse;
-    return FcTrue;
-}
-
 static FcBool
-FcNameUnparseString (FcNameBuf     *buf, 
+FcNameUnparseString (FcStrBuf      *buf, 
                     const FcChar8  *string,
                     const FcChar8  *escape)
 {
@@ -506,21 +560,23 @@ FcNameUnparseString (FcNameBuf        *buf,
     {
        if (escape && strchr ((char *) escape, (char) c))
        {
-           if (!FcNameBufChar (buf, escape[0]))
+           if (!FcStrBufChar (buf, escape[0]))
                return FcFalse;
        }
-       if (!FcNameBufChar (buf, c))
+       if (!FcStrBufChar (buf, c))
            return FcFalse;
     }
     return FcTrue;
 }
 
 static FcBool
-FcNameUnparseValue (FcNameBuf  *buf,
-                   FcValue     v,
+FcNameUnparseValue (FcStrBuf   *buf,
+                   int         bank,
+                   FcValue     *v0,
                    FcChar8     *escape)
 {
     FcChar8    temp[1024];
+    FcValue v = FcValueCanonicalize(v0);
     
     switch (v.type) {
     case FcTypeVoid:
@@ -534,28 +590,32 @@ FcNameUnparseValue (FcNameBuf     *buf,
     case FcTypeString:
        return FcNameUnparseString (buf, v.u.s, escape);
     case FcTypeBool:
-       return FcNameUnparseString (buf, v.u.b ? "True" : "False", 0);
+       return FcNameUnparseString (buf, v.u.b ? (FcChar8 *) "True" : (FcChar8 *) "False", 0);
     case FcTypeMatrix:
        sprintf ((char *) temp, "%g %g %g %g", 
                 v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
        return FcNameUnparseString (buf, temp, 0);
     case FcTypeCharSet:
        return FcNameUnparseCharSet (buf, v.u.c);
+    case FcTypeLangSet:
+       return FcNameUnparseLangSet (buf, v.u.l);
+    case FcTypeFTFace:
+       return FcTrue;
     }
     return FcFalse;
 }
 
 static FcBool
-FcNameUnparseValueList (FcNameBuf      *buf,
-                       FcValueList     *v,
-                       char            *escape)
+FcNameUnparseValueList (FcStrBuf       *buf,
+                       FcValueListPtr  v,
+                       FcChar8         *escape)
 {
-    while (v)
+    while (FcValueListPtrU(v))
     {
-       if (!FcNameUnparseValue (buf, v->value, escape))
+       if (!FcNameUnparseValue (buf, v.bank, &FcValueListPtrU(v)->value, escape))
            return FcFalse;
-       if ((v = v->next))
-           if (!FcNameUnparseString (buf, ",", 0))
+       if (FcValueListPtrU(v = FcValueListPtrU(v)->next))
+           if (!FcNameUnparseString (buf, (FcChar8 *) ",", 0))
                return FcFalse;
     }
     return FcTrue;
@@ -567,26 +627,26 @@ FcNameUnparseValueList (FcNameBuf *buf,
 FcChar8 *
 FcNameUnparse (FcPattern *pat)
 {
-    FcNameBuf              buf;
+    FcStrBuf               buf;
     FcChar8                buf_static[8192];
     int                            i;
     FcPatternElt           *e;
     const FcObjectTypeList  *l;
     const FcObjectType     *o;
 
-    FcNameBufInit (&buf, buf_static, sizeof (buf_static));
-    e = FcPatternFind (pat, FC_FAMILY, FcFalse);
+    FcStrBufInit (&buf, buf_static, sizeof (buf_static));
+    e = FcPatternFindElt (pat, FC_FAMILY);
     if (e)
     {
-       if (!FcNameUnparseValueList (&buf, e->values, FC_ESCAPE_FIXED))
+       if (!FcNameUnparseValueList (&buf, e->values, (FcChar8 *) FC_ESCAPE_FIXED))
            goto bail0;
     }
-    e = FcPatternFind (pat, FC_SIZE, FcFalse);
+    e = FcPatternFindElt (pat, FC_SIZE);
     if (e)
     {
-       if (!FcNameUnparseString (&buf, "-", 0))
+       if (!FcNameUnparseString (&buf, (FcChar8 *) "-", 0))
            goto bail0;
-       if (!FcNameUnparseValueList (&buf, e->values, FC_ESCAPE_FIXED))
+       if (!FcNameUnparseValueList (&buf, e->values, (FcChar8 *) FC_ESCAPE_FIXED))
            goto bail0;
     }
     for (l = _FcObjectTypes; l; l = l->next)
@@ -599,23 +659,23 @@ FcNameUnparse (FcPattern *pat)
                !strcmp (o->object, FC_FILE))
                continue;
            
-           e = FcPatternFind (pat, o->object, FcFalse);
+           e = FcPatternFindElt (pat, o->object);
            if (e)
            {
-               if (!FcNameUnparseString (&buf, ":", 0))
+               if (!FcNameUnparseString (&buf, (FcChar8 *) ":", 0))
                    goto bail0;
-               if (!FcNameUnparseString (&buf, o->object, FC_ESCAPE_VARIABLE))
+               if (!FcNameUnparseString (&buf, (FcChar8 *) o->object, (FcChar8 *) FC_ESCAPE_VARIABLE))
                    goto bail0;
-               if (!FcNameUnparseString (&buf, "=", 0))
+               if (!FcNameUnparseString (&buf, (FcChar8 *) "=", 0))
                    goto bail0;
                if (!FcNameUnparseValueList (&buf, e->values, 
-                                            FC_ESCAPE_VARIABLE))
+                                            (FcChar8 *) FC_ESCAPE_VARIABLE))
                    goto bail0;
            }
        }
     }
-    return FcNameBufDone (&buf);
+    return FcStrBufDone (&buf);
 bail0:
-    FcNameBufDestroy (&buf);
+    FcStrBufDestroy (&buf);
     return 0;
 }