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