1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1985-2007 AT&T Knowledge Ventures            *
5*4887Schin *                      and is licensed under the                       *
6*4887Schin *                  Common Public License, Version 1.0                  *
7*4887Schin *                      by AT&T Knowledge Ventures                      *
8*4887Schin *                                                                      *
9*4887Schin *                A copy of the License is available at                 *
10*4887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*4887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*4887Schin *                                                                      *
13*4887Schin *              Information and Software Systems Research               *
14*4887Schin *                            AT&T Research                             *
15*4887Schin *                           Florham Park NJ                            *
16*4887Schin *                                                                      *
17*4887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
18*4887Schin *                  David Korn <dgk@research.att.com>                   *
19*4887Schin *                   Phong Vo <kpv@research.att.com>                    *
20*4887Schin *                                                                      *
21*4887Schin ***********************************************************************/
22*4887Schin #pragma prototyped
23*4887Schin /*
24*4887Schin  * regexp interface and partial implementation
25*4887Schin  * what a novel approach
26*4887Schin  * don't do it again
27*4887Schin  *
28*4887Schin  * OBSOLETE: use <regex.h>
29*4887Schin  */
30*4887Schin 
31*4887Schin #ifndef _REGEXP_H
32*4887Schin #define _REGEXP_H
33*4887Schin 
34*4887Schin #define NBRA		9
35*4887Schin 
36*4887Schin typedef struct
37*4887Schin {
38*4887Schin 	char*		re_braslist[NBRA];
39*4887Schin 	char*		re_braelist[NBRA];
40*4887Schin 	char*		re_loc1;
41*4887Schin 	char*		re_loc2;
42*4887Schin 	char*		re_locs;
43*4887Schin 	int		re_circf;
44*4887Schin 	int		re_nbra;
45*4887Schin 	int		re_nodelim;
46*4887Schin 	int		re_sed;
47*4887Schin } regexp_t;
48*4887Schin 
49*4887Schin #define braslist	_re_info.re_braslist
50*4887Schin #define braelist	_re_info.re_braelist
51*4887Schin #define circf		_re_info.re_circf
52*4887Schin #define loc1		_re_info.re_loc1
53*4887Schin #define loc2		_re_info.re_loc2
54*4887Schin #define locs		_re_info.re_locs
55*4887Schin #define nbra		_re_info.re_nbra
56*4887Schin #define nodelim		_re_info.re_nodelim
57*4887Schin #define sed		_re_info.re_sed
58*4887Schin 
59*4887Schin #define advance(a,b)		_re_exec(&_re_info,a,b,1)
60*4887Schin #define compile(a,b,c,d)	_re_read(&_re_info,a,b,c,d)
61*4887Schin #define step(a,b)		_re_exec(&_re_info,a,b,0)
62*4887Schin 
63*4887Schin #if _BLD_ast && defined(__EXPORT__)
64*4887Schin #define extern		__EXPORT__
65*4887Schin #endif
66*4887Schin 
67*4887Schin extern int	_re_comp(regexp_t*, const char*, char*, unsigned int);
68*4887Schin extern int	_re_exec(regexp_t*, const char*, const char*, int);
69*4887Schin extern char*	_re_putc(int);
70*4887Schin extern char*	_re_read(regexp_t*, const char*, char*, const char*, int);
71*4887Schin 
72*4887Schin #undef	extern
73*4887Schin 
74*4887Schin #ifndef _REGEXP_DECLARE
75*4887Schin 
76*4887Schin regexp_t	_re_info;
77*4887Schin 
78*4887Schin char*
79*4887Schin _re_read(register regexp_t* re, const char* instring, char* ep, const char* endbuf, int seof)
80*4887Schin {
81*4887Schin 	register int		c;
82*4887Schin 
83*4887Schin 	static const char*	prev;
84*4887Schin 
85*4887Schin #ifdef INIT
86*4887Schin 	INIT;
87*4887Schin #endif
88*4887Schin 
89*4887Schin 	re->re_nodelim = 0;
90*4887Schin 	if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
91*4887Schin 	{
92*4887Schin 		if (c != seof)
93*4887Schin 		{
94*4887Schin 			UNGETC(c);
95*4887Schin 			re->re_nodelim = 1;
96*4887Schin 		}
97*4887Schin 		if (!re->re_sed && !prev)
98*4887Schin 			{ ERROR(41); }
99*4887Schin 		RETURN((char*)endbuf);
100*4887Schin 	}
101*4887Schin 	UNGETC(c);
102*4887Schin 	prev = 0;
103*4887Schin 	for (;;)
104*4887Schin 	{
105*4887Schin 		if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
106*4887Schin 		{
107*4887Schin 			if (re->re_sed)
108*4887Schin 				{ ERROR(36); }
109*4887Schin 			UNGETC(c);
110*4887Schin 			re->re_nodelim = 1;
111*4887Schin 			break;
112*4887Schin 		}
113*4887Schin 		if (c == '\\')
114*4887Schin 		{
115*4887Schin 			_re_putc(c);
116*4887Schin 			if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
117*4887Schin 				{ ERROR(36); }
118*4887Schin 		}
119*4887Schin 		_re_putc(c);
120*4887Schin 	}
121*4887Schin 	if (c = _re_comp(re, _re_putc(0), ep, (char*)endbuf - ep))
122*4887Schin 		{ ERROR(c); }
123*4887Schin 	prev = endbuf;
124*4887Schin 	RETURN((char*)prev);
125*4887Schin }
126*4887Schin 
127*4887Schin #endif
128*4887Schin 
129*4887Schin #endif
130