1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman * *
3*b30d1939SAndy Fiddaman * This software is part of the ast package *
4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property *
5*b30d1939SAndy Fiddaman * and is licensed under the *
6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 *
7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property *
8*b30d1939SAndy Fiddaman * *
9*b30d1939SAndy Fiddaman * A copy of the License is available at *
10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html *
11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12*b30d1939SAndy Fiddaman * *
13*b30d1939SAndy Fiddaman * Information and Software Systems Research *
14*b30d1939SAndy Fiddaman * AT&T Research *
15*b30d1939SAndy Fiddaman * Florham Park NJ *
16*b30d1939SAndy Fiddaman * *
17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> *
18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> *
19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> *
20*b30d1939SAndy Fiddaman * *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman /*
24*b30d1939SAndy Fiddaman * Glenn Fowler
25*b30d1939SAndy Fiddaman * AT&T Research
26*b30d1939SAndy Fiddaman */
27*b30d1939SAndy Fiddaman
28*b30d1939SAndy Fiddaman #include <ast.h>
29*b30d1939SAndy Fiddaman #include <ccode.h>
30*b30d1939SAndy Fiddaman #include <ctype.h>
31*b30d1939SAndy Fiddaman
32*b30d1939SAndy Fiddaman #if CC_NATIVE == CC_ASCII
33*b30d1939SAndy Fiddaman #define MAP(m,c) (c)
34*b30d1939SAndy Fiddaman #else
35*b30d1939SAndy Fiddaman #define MAP(m,c) m[c]
36*b30d1939SAndy Fiddaman #endif
37*b30d1939SAndy Fiddaman
38*b30d1939SAndy Fiddaman /*
39*b30d1939SAndy Fiddaman * return a pointer to the isalpha() identifier matching
40*b30d1939SAndy Fiddaman * name in the CC_ASCII sorted tab of num elements of
41*b30d1939SAndy Fiddaman * size siz where the first member of each
42*b30d1939SAndy Fiddaman * element is a char*
43*b30d1939SAndy Fiddaman *
44*b30d1939SAndy Fiddaman * [xxx] brackets optional identifier characters
45*b30d1939SAndy Fiddaman * * starts optional identifier characters
46*b30d1939SAndy Fiddaman *
47*b30d1939SAndy Fiddaman * 0 returned if name not found
48*b30d1939SAndy Fiddaman * otherwise if next!=0 then it points to the next
49*b30d1939SAndy Fiddaman * unmatched char in name
50*b30d1939SAndy Fiddaman */
51*b30d1939SAndy Fiddaman
52*b30d1939SAndy Fiddaman void*
strpsearch(const void * tab,size_t num,size_t siz,const char * name,char ** next)53*b30d1939SAndy Fiddaman strpsearch(const void* tab, size_t num, size_t siz, const char* name, char** next)
54*b30d1939SAndy Fiddaman {
55*b30d1939SAndy Fiddaman register char* lo = (char*)tab;
56*b30d1939SAndy Fiddaman register char* hi = lo + (num - 1) * siz;
57*b30d1939SAndy Fiddaman register char* mid;
58*b30d1939SAndy Fiddaman #if CC_NATIVE != CC_ASCII
59*b30d1939SAndy Fiddaman register unsigned char* m;
60*b30d1939SAndy Fiddaman #endif
61*b30d1939SAndy Fiddaman register unsigned char* s;
62*b30d1939SAndy Fiddaman register unsigned char* t;
63*b30d1939SAndy Fiddaman register int c;
64*b30d1939SAndy Fiddaman register int v;
65*b30d1939SAndy Fiddaman int sequential = 0;
66*b30d1939SAndy Fiddaman
67*b30d1939SAndy Fiddaman #if CC_NATIVE != CC_ASCII
68*b30d1939SAndy Fiddaman m = ccmap(CC_NATIVE, CC_ASCII);
69*b30d1939SAndy Fiddaman #endif
70*b30d1939SAndy Fiddaman c = MAP(m, *((unsigned char*)name));
71*b30d1939SAndy Fiddaman while (lo <= hi)
72*b30d1939SAndy Fiddaman {
73*b30d1939SAndy Fiddaman mid = lo + (sequential ? 0 : (((hi - lo) / siz) / 2) * siz);
74*b30d1939SAndy Fiddaman if (!(v = c - MAP(m, *(s = *((unsigned char**)mid)))) || *s == '[' && !(v = c - MAP(m, *++s)) && (v = 1))
75*b30d1939SAndy Fiddaman {
76*b30d1939SAndy Fiddaman t = (unsigned char*)name;
77*b30d1939SAndy Fiddaman for (;;)
78*b30d1939SAndy Fiddaman {
79*b30d1939SAndy Fiddaman if (!v && (*s == '[' || *s == '*'))
80*b30d1939SAndy Fiddaman {
81*b30d1939SAndy Fiddaman v = 1;
82*b30d1939SAndy Fiddaman s++;
83*b30d1939SAndy Fiddaman }
84*b30d1939SAndy Fiddaman else if (v && *s == ']')
85*b30d1939SAndy Fiddaman {
86*b30d1939SAndy Fiddaman v = 0;
87*b30d1939SAndy Fiddaman s++;
88*b30d1939SAndy Fiddaman }
89*b30d1939SAndy Fiddaman else if (!isalpha(*t))
90*b30d1939SAndy Fiddaman {
91*b30d1939SAndy Fiddaman if (v || !*s)
92*b30d1939SAndy Fiddaman {
93*b30d1939SAndy Fiddaman if (next)
94*b30d1939SAndy Fiddaman *next = (char*)t;
95*b30d1939SAndy Fiddaman return (void*)mid;
96*b30d1939SAndy Fiddaman }
97*b30d1939SAndy Fiddaman if (!sequential)
98*b30d1939SAndy Fiddaman {
99*b30d1939SAndy Fiddaman while ((mid -= siz) >= lo && (s = *((unsigned char**)mid)) && ((c == MAP(m, *s)) || *s == '[' && c == MAP(m, *(s + 1))));
100*b30d1939SAndy Fiddaman sequential = 1;
101*b30d1939SAndy Fiddaman }
102*b30d1939SAndy Fiddaman v = 1;
103*b30d1939SAndy Fiddaman break;
104*b30d1939SAndy Fiddaman }
105*b30d1939SAndy Fiddaman else if (*t != *s)
106*b30d1939SAndy Fiddaman {
107*b30d1939SAndy Fiddaman v = MAP(m, *t) - MAP(m, *s);
108*b30d1939SAndy Fiddaman break;
109*b30d1939SAndy Fiddaman }
110*b30d1939SAndy Fiddaman else
111*b30d1939SAndy Fiddaman {
112*b30d1939SAndy Fiddaman t++;
113*b30d1939SAndy Fiddaman s++;
114*b30d1939SAndy Fiddaman }
115*b30d1939SAndy Fiddaman }
116*b30d1939SAndy Fiddaman }
117*b30d1939SAndy Fiddaman else if (sequential)
118*b30d1939SAndy Fiddaman break;
119*b30d1939SAndy Fiddaman if (v > 0)
120*b30d1939SAndy Fiddaman lo = mid + siz;
121*b30d1939SAndy Fiddaman else
122*b30d1939SAndy Fiddaman hi = mid - siz;
123*b30d1939SAndy Fiddaman }
124*b30d1939SAndy Fiddaman return 0;
125*b30d1939SAndy Fiddaman }
126