X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcpat.c;h=68ded728c068eb406fd7b995cebce3dd04773fc5;hb=e9be9cd10a24b75480a26be834041d312d8217b4;hp=2ed2eca102465e4afd12644405c35ad6914510eb;hpb=88c747e20612ffcae326313f8d624b36c1235993;p=fontconfig.git diff --git a/src/fcpat.c b/src/fcpat.c index 2ed2eca..68ded72 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/fontconfig/src/fcpat.c,v 1.5 2002/05/29 22:07:33 keithp Exp $ + * $XFree86: xc/lib/fontconfig/src/fcpat.c,v 1.6 2002/05/31 23:21:25 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -183,84 +183,91 @@ FcPatternDestroy (FcPattern *p) free (p); } -FcPatternElt * -FcPatternFind (FcPattern *p, const char *object, FcBool insert) +static int +FcPatternPosition (const FcPattern *p, const char *object) { - int i; - int s; - FcPatternElt *e; - - int low, high; + int low, high, mid, c; - /* match existing */ low = 0; - high = p->num; - - while (low + 1 < high) + high = p->num - 1; + c = 1; + mid = 0; + while (low <= high) { - i = (low + high) >> 1; - s = strcmp (object, p->elts[i].object); - if (s == 0) - return &p->elts[i]; - if (s > 0) - low = i; + mid = (low + high) >> 1; + c = strcmp (p->elts[mid].object, object); + if (c == 0) + return mid; + if (c < 0) + low = mid + 1; else - high = i; - } - - i = low; - while (i < high) - { - s = strcmp (object, p->elts[i].object); - if (s == 0) - return &p->elts[i]; - if (s < 0) - break; - i++; + high = mid - 1; } + if (c < 0) + mid++; + return -(mid + 1); +} - if (!insert) +FcPatternElt * +FcPatternFindElt (const FcPattern *p, const char *object) +{ + int i = FcPatternPosition (p, object); + if (i < 0) return 0; + return &p->elts[i]; +} - /* grow array */ - if (p->num + 1 >= p->size) +FcPatternElt * +FcPatternInsertElt (FcPattern *p, const char *object) +{ + int i; + FcPatternElt *e; + + i = FcPatternPosition (p, object); + if (i < 0) { - s = p->size + 16; - if (p->elts) - e = (FcPatternElt *) realloc (p->elts, s * sizeof (FcPatternElt)); - else - e = (FcPatternElt *) malloc (s * sizeof (FcPatternElt)); - if (!e) - return FcFalse; - p->elts = e; - if (p->size) - FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt)); - FcMemAlloc (FC_MEM_PATELT, s * sizeof (FcPatternElt)); - while (p->size < s) + i = -i - 1; + + /* grow array */ + if (p->num + 1 >= p->size) { - p->elts[p->size].object = 0; - p->elts[p->size].values = 0; - p->size++; + int s = p->size + 16; + if (p->elts) + e = (FcPatternElt *) realloc (p->elts, s * sizeof (FcPatternElt)); + else + e = (FcPatternElt *) malloc (s * sizeof (FcPatternElt)); + if (!e) + return FcFalse; + p->elts = e; + if (p->size) + FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt)); + FcMemAlloc (FC_MEM_PATELT, s * sizeof (FcPatternElt)); + while (p->size < s) + { + p->elts[p->size].object = 0; + p->elts[p->size].values = 0; + p->size++; + } } + + /* move elts up */ + memmove (p->elts + i + 1, + p->elts + i, + sizeof (FcPatternElt) * + (p->num - i)); + + /* bump count */ + p->num++; + + p->elts[i].object = object; + p->elts[i].values = 0; } - /* move elts up */ - memmove (p->elts + i + 1, - p->elts + i, - sizeof (FcPatternElt) * - (p->num - i)); - - /* bump count */ - p->num++; - - p->elts[i].object = object; - p->elts[i].values = 0; - return &p->elts[i]; } FcBool -FcPatternEqual (FcPattern *pa, FcPattern *pb) +FcPatternEqual (const FcPattern *pa, const FcPattern *pb) { int i; @@ -276,6 +283,32 @@ FcPatternEqual (FcPattern *pa, FcPattern *pb) return FcTrue; } +FcBool +FcPatternEqualSubset (const FcPattern *pa, const FcPattern *pb, const FcObjectSet *os) +{ + FcPatternElt *ea, *eb; + int i; + + for (i = 0; i < os->nobject; i++) + { + ea = FcPatternFindElt (pa, os->objects[i]); + eb = FcPatternFindElt (pb, os->objects[i]); + if (ea) + { + if (!eb) + return FcFalse; + if (!FcValueListEqual (ea->values, eb->values)) + return FcFalse; + } + else + { + if (eb) + return FcFalse; + } + } + return FcTrue; +} + FcBool FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append) { @@ -295,7 +328,7 @@ FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append) new->value = value; new->next = 0; - e = FcPatternFind (p, object, FcTrue); + e = FcPatternInsertElt (p, object); if (!e) goto bail2; @@ -339,7 +372,7 @@ FcPatternDel (FcPattern *p, const char *object) FcPatternElt *e; int i; - e = FcPatternFind (p, object, FcFalse); + e = FcPatternFindElt (p, object); if (!e) return FcFalse; @@ -434,7 +467,7 @@ FcPatternGet (FcPattern *p, const char *object, int id, FcValue *v) FcPatternElt *e; FcValueList *l; - e = FcPatternFind (p, object, FcFalse); + e = FcPatternFindElt (p, object); if (!e) return FcResultNoMatch; for (l = e->values; l; l = l->next)