diff options
author | Patrick Lam <plam@MIT.EDU> | 2005-08-24 06:21:30 +0000 |
---|---|---|
committer | Patrick Lam <plam@MIT.EDU> | 2005-08-24 06:21:30 +0000 |
commit | 4262e0b3853bc2153270eb33d09a063f852f3f90 (patch) | |
tree | ba08c194f10446f4318c72538f9df5e812f1e462 /src/fclist.c | |
parent | 212c9f437e959fbdc5fe344c67b8c1cf8ca63edb (diff) | |
download | fontconfig-4262e0b3853bc2153270eb33d09a063f852f3f90.tar.gz |
Overhaul the serialization system to create one mmapable file per directory
and distribute bytes for each directory from a single malloc for that
directory. Store pointers as differences between the data pointed to
and the pointer's address (s_off = s - v). Don't serialize data
structures that never actually get serialized. Separate strings used
for keys from strings used for values (in FcPatternElt and FcValue,
respectively). Bump FC_CACHE_VERSION to 2.
Diffstat (limited to 'src/fclist.c')
-rw-r--r-- | src/fclist.c | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/fclist.c b/src/fclist.c index b3ecdb8..db63058 100644 --- a/src/fclist.c +++ b/src/fclist.c @@ -23,9 +23,6 @@ */ #include <stdlib.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <unistd.h> #include "fcint.h" FcObjectSet * @@ -47,18 +44,17 @@ FcBool FcObjectSetAdd (FcObjectSet *os, const char *object) { int s; - FcObjectPtr *objects; - FcObjectPtr obj; + const char **objects; int high, low, mid, c; if (os->nobject == os->sobject) { s = os->sobject + 4; if (os->objects) - objects = (FcObjectPtr *) realloc ((void *) os->objects, - s * sizeof (FcObjectPtr)); + objects = (const char **) realloc ((void *) os->objects, + s * sizeof (const char *)); else - objects = (FcObjectPtr *) malloc (s * sizeof (FcObjectPtr)); + objects = (const char **) malloc (s * sizeof (const char *)); if (!objects) return FcFalse; if (os->sobject) @@ -71,11 +67,11 @@ FcObjectSetAdd (FcObjectSet *os, const char *object) low = 0; mid = 0; c = 1; - obj = FcObjectStaticName (object); + object = FcObjectStaticName (object); while (low <= high) { mid = (low + high) >> 1; - c = FcObjectPtrCompare(os->objects[mid], obj); + c = os->objects[mid] - object; if (c == 0) return FcTrue; if (c < 0) @@ -86,8 +82,8 @@ FcObjectSetAdd (FcObjectSet *os, const char *object) if (c < 0) mid++; memmove (os->objects + mid + 1, os->objects + mid, - (os->nobject - mid) * sizeof (FcObjectPtr)); - os->objects[mid] = obj; + (os->nobject - mid) * sizeof (const char *)); + os->objects[mid] = object; os->nobject++; return FcTrue; } @@ -145,9 +141,9 @@ FcListValueListMatchAny (FcValueListPtr patOrig, /* pattern */ * (OpListing is OpContains except for strings * where it requires an exact match) */ - if (FcConfigCompareValue (FcValueListPtrU(fnt)->value, + if (FcConfigCompareValue (&FcValueListPtrU(fnt)->value, FcOpListing, - FcValueListPtrU(pat)->value)) + &FcValueListPtrU(pat)->value)) break; } if (!FcValueListPtrU(fnt)) @@ -167,8 +163,8 @@ FcListValueListEqual (FcValueListPtr v1orig, { for (v2 = v2orig; FcValueListPtrU(v2); v2 = FcValueListPtrU(v2)->next) - if (FcValueEqual (FcValueListPtrU(v1)->value, - FcValueListPtrU(v2)->value)) + if (FcValueEqual (FcValueCanonicalize(&FcValueListPtrU(v1)->value), + FcValueCanonicalize(&FcValueListPtrU(v2)->value))) break; if (!FcValueListPtrU(v2)) return FcFalse; @@ -178,8 +174,8 @@ FcListValueListEqual (FcValueListPtr v1orig, { for (v1 = v1orig; FcValueListPtrU(v1); v1 = FcValueListPtrU(v1)->next) - if (FcValueEqual (FcValueListPtrU(v1)->value, - FcValueListPtrU(v2)->value)) + if (FcValueEqual (FcValueCanonicalize(&FcValueListPtrU(v1)->value), + FcValueCanonicalize(&FcValueListPtrU(v2)->value))) break; if (!FcValueListPtrU(v1)) return FcFalse; @@ -197,8 +193,8 @@ FcListPatternEqual (FcPattern *p1, for (i = 0; i < os->nobject; i++) { - e1 = FcPatternFindElt (p1, FcObjectPtrU(os->objects[i])); - e2 = FcPatternFindElt (p2, FcObjectPtrU(os->objects[i])); + e1 = FcPatternFindElt (p1, os->objects[i]); + e2 = FcPatternFindElt (p2, os->objects[i]); if (!e1 && !e2) continue; if (!e1 || !e2) @@ -245,8 +241,9 @@ FcListMatrixHash (const FcMatrix *m) } static FcChar32 -FcListValueHash (FcValue v) +FcListValueHash (FcValue *value) { + FcValue v = FcValueCanonicalize(value); switch (v.type) { case FcTypeVoid: return 0; @@ -255,17 +252,17 @@ FcListValueHash (FcValue v) case FcTypeDouble: return (FcChar32) (int) v.u.d; case FcTypeString: - return FcStrHashIgnoreCase (FcObjectPtrU(v.u.si)); + return FcStrHashIgnoreCase (v.u.s); case FcTypeBool: return (FcChar32) v.u.b; case FcTypeMatrix: - return FcListMatrixHash (FcMatrixPtrU(v.u.mi)); + return FcListMatrixHash (v.u.m); case FcTypeCharSet: - return FcCharSetCount (FcCharSetPtrU(v.u.ci)); + return FcCharSetCount (v.u.c); case FcTypeFTFace: return (long) v.u.f; case FcTypeLangSet: - return FcLangSetHash (FcLangSetPtrU(v.u.li)); + return FcLangSetHash (v.u.l); } return 0; } @@ -277,7 +274,7 @@ FcListValueListHash (FcValueListPtr list) while (FcValueListPtrU(list)) { - h = h ^ FcListValueHash (FcValueListPtrU(list)->value); + h = h ^ FcListValueHash (&FcValueListPtrU(list)->value); list = FcValueListPtrU(list)->next; } return h; @@ -293,7 +290,7 @@ FcListPatternHash (FcPattern *font, for (n = 0; n < os->nobject; n++) { - e = FcPatternFindElt (font, FcObjectPtrU(os->objects[n])); + e = FcPatternFindElt (font, os->objects[n]); if (e) h = h ^ FcListValueListHash (e->values); } @@ -371,15 +368,15 @@ FcListAppend (FcListHashTable *table, for (o = 0; o < os->nobject; o++) { - e = FcPatternFindElt (font, FcObjectPtrU(os->objects[o])); + e = FcPatternFindElt (font, os->objects[o]); if (e) { for (v = e->values; FcValueListPtrU(v); v = FcValueListPtrU(v)->next) { if (!FcPatternAdd (bucket->pattern, - FcObjectPtrU(os->objects[o]), - FcValueListPtrU(v)->value, FcTrue)) + os->objects[o], + FcValueCanonicalize(&FcValueListPtrU(v)->value), FcTrue)) goto bail2; } } |