xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/string/strpsearch.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
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