5132a510f982e83b97f87577e70edf48312f43b5
[platform/upstream/fontconfig.git] / src / fcblanks.c
1 /*
2  * fontconfig/src/fcblanks.c
3  *
4  * Copyright © 2002 Keith Packard
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of the author(s) not be used in
11  * advertising or publicity pertaining to distribution of the software without
12  * specific, written prior permission.  The authors make no
13  * representations about the suitability of this software for any purpose.  It
14  * is provided "as is" without express or implied warranty.
15  *
16  * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22  * PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #include "fcint.h"
26
27 FcBlanks *
28 FcBlanksCreate (void)
29 {
30     FcBlanks    *b;
31
32     b = malloc (sizeof (FcBlanks));
33     if (!b)
34         return 0;
35     b->nblank = 0;
36     b->sblank = 0;
37     b->blanks = 0;
38     return b;
39 }
40
41 void
42 FcBlanksDestroy (FcBlanks *b)
43 {
44     if (b->sblank == -1)
45         return;
46     if (b->blanks)
47         free (b->blanks);
48     free (b);
49 }
50
51 FcBool
52 FcBlanksAdd (FcBlanks *b, FcChar32 ucs4)
53 {
54     FcChar32    *c;
55     int         sblank;
56
57     for (sblank = 0; sblank < b->nblank; sblank++)
58         if (b->blanks[sblank] == ucs4)
59             return FcTrue;
60
61     if (b->sblank == -1)
62     {
63         fprintf (stderr, "Unable to update the static FcBlanks: 0x%04x\n", ucs4);
64         return FcTrue;
65     }
66     if (b->nblank == b->sblank)
67     {
68         sblank = b->sblank + 32;
69         if (b->blanks)
70             c = (FcChar32 *) realloc (b->blanks, sblank * sizeof (FcChar32));
71         else
72             c = (FcChar32 *) malloc (sblank * sizeof (FcChar32));
73         if (!c)
74             return FcFalse;
75         b->sblank = sblank;
76         b->blanks = c;
77     }
78     b->blanks[b->nblank++] = ucs4;
79     return FcTrue;
80 }
81
82 FcBool
83 FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4)
84 {
85     int lower = 0, higher = b->nblank, middle;
86
87     if (b->nblank == 0 ||
88         b->blanks[0] > ucs4 ||
89         b->blanks[b->nblank - 1] < ucs4)
90         return FcFalse;
91     while (1)
92     {
93         middle = (lower + higher) / 2;
94         if (b->blanks[middle] == ucs4)
95             return FcTrue;
96         if (lower >= higher)
97             break;
98         if (b->blanks[middle] < ucs4)
99             lower = middle + 1;
100         else
101             higher = middle - 1;
102     }
103
104     return FcFalse;
105 }
106 #define __fcblanks__
107 #include "fcaliastail.h"
108 #undef __fcblanks__