/* * fontconfig/src/fcblanks.c * * Copyright © 2002 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 * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of the author(s) not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. The authors make no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #include "fcint.h" FcBlanks * FcBlanksCreate (void) { FcBlanks *b; b = malloc (sizeof (FcBlanks)); if (!b) return 0; b->nblank = 0; b->sblank = 0; b->blanks = 0; return b; } void FcBlanksDestroy (FcBlanks *b) { if (b->sblank == -1) return; if (b->blanks) free (b->blanks); free (b); } FcBool FcBlanksAdd (FcBlanks *b, FcChar32 ucs4) { FcChar32 *c; int sblank; for (sblank = 0; sblank < b->nblank; sblank++) if (b->blanks[sblank] == ucs4) return FcTrue; if (b->sblank == -1) { fprintf (stderr, "Unable to update the static FcBlanks: 0x%04x\n", ucs4); return FcTrue; } if (b->nblank == b->sblank) { sblank = b->sblank + 32; if (b->blanks) c = (FcChar32 *) realloc (b->blanks, sblank * sizeof (FcChar32)); else c = (FcChar32 *) malloc (sblank * sizeof (FcChar32)); if (!c) return FcFalse; b->sblank = sblank; b->blanks = c; } b->blanks[b->nblank++] = ucs4; return FcTrue; } FcBool FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4) { int lower = 0, higher = b->nblank, middle; if (b->nblank == 0 || b->blanks[0] > ucs4 || b->blanks[b->nblank - 1] < ucs4) return FcFalse; while (1) { middle = (lower + higher) / 2; if (b->blanks[middle] == ucs4) return FcTrue; if (lower == higher) break; if (b->blanks[middle] < ucs4) lower = middle + 1; else higher = middle - 1; } return FcFalse; } #define __fcblanks__ #include "fcaliastail.h" #undef __fcblanks__