diff --git a/ChangeLog b/ChangeLog index 2984b0f..d3d9a81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2005-07-15 Carl Worth + + * src/fcint.h: + * src/fcinit.c: (FcFini): + * src/fcpat.c: (FcPatternFini): Rename FcPatternThawAll to + FcPatternFini. + + * src/fcpat.c: (FcObjectStaticName), (FcObjectStaticNameFini): + Pull the FcObjectStateName hash table out to file scope, and add + FcObjectStaticNameFini so that FcFini will cleanup this hash table + as well. + + * src/fcxml.c: (FcConfigParseAndLoad): Clear FILE* to NULL after + fclose. + 2005-06-16 Patrick Lam reviewed by: keithp diff --git a/src/fcinit.c b/src/fcinit.c index c3f497b..8a9bdbd 100644 --- a/src/fcinit.c +++ b/src/fcinit.c @@ -116,7 +116,7 @@ FcFini (void) if (_fcConfig) FcConfigDestroy (_fcConfig); - FcPatternThawAll (); + FcPatternFini (); FcCharSetThawAll (); } diff --git a/src/fcint.h b/src/fcint.h index 24bf246..3611df9 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -710,7 +710,7 @@ FcPattern * FcPatternFreeze (FcPattern *p); void -FcPatternThawAll (void); +FcPatternFini (void); FcBool FcPatternAppend (FcPattern *p, FcPattern *s); diff --git a/src/fcpat.c b/src/fcpat.c index c886c92..254faae 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -579,13 +579,6 @@ bail: return n; } -void -FcPatternThawAll (void) -{ - FcPatternBaseThawAll (); - FcValueListThawAll (); -} - static int FcPatternPosition (const FcPattern *p, const char *object) { @@ -1173,20 +1166,21 @@ FcPatternAppend (FcPattern *p, FcPattern *s) return FcTrue; } +#define OBJECT_HASH_SIZE 31 +static struct objectBucket { + struct objectBucket *next; + FcChar32 hash; +} *FcObjectBuckets[OBJECT_HASH_SIZE]; + const char * FcObjectStaticName (const char *name) { -#define OBJECT_HASH_SIZE 31 - static struct objectBucket { - struct objectBucket *next; - FcChar32 hash; - } *buckets[OBJECT_HASH_SIZE]; FcChar32 hash = FcStringHash ((const FcChar8 *) name); struct objectBucket **p; struct objectBucket *b; int size; - for (p = &buckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) if (b->hash == hash && !strcmp (name, (char *) (b + 1))) return (char *) (b + 1); size = sizeof (struct objectBucket) + strlen (name) + 1; @@ -1200,3 +1194,32 @@ FcObjectStaticName (const char *name) *p = b; return (char *) (b + 1); } + +static void +FcObjectStaticNameFini (void) +{ + int i, size; + struct objectBucket *b, *next; + char *name; + + for (i = 0; i < OBJECT_HASH_SIZE; i++) + { + for (b = FcObjectBuckets[i]; b; b = next) + { + next = b->next; + name = (char *) (b + 1); + size = sizeof (struct objectBucket) + strlen (name) + 1; + FcMemFree (FC_MEM_STATICSTR, size); + free (b); + } + FcObjectBuckets[i] = 0; + } +} + +void +FcPatternFini (void) +{ + FcPatternBaseThawAll (); + FcValueListThawAll (); + FcObjectStaticNameFini (); +} diff --git a/src/fcxml.c b/src/fcxml.c index 539e57f..4176c73 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -2375,6 +2375,7 @@ bail2: XML_ParserFree (p); bail1: fclose (f); + f = NULL; bail0: if (error && complain) {