summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/amd64/include/ast/regexp.h
blob: ea2df629b5de7b535fa120cefa7d19d0ac71685b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

/* : : generated by proto : : */
/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                    by AT&T Intellectual Property                     *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                 Glenn Fowler <gsf@research.att.com>                  *
*                  David Korn <dgk@research.att.com>                   *
*                   Phong Vo <kpv@research.att.com>                    *
*                                                                      *
***********************************************************************/
                  
/*
 * regexp interface and partial implementation
 * what a novel approach
 * don't do it again
 *
 * OBSOLETE: use <regex.h>
 */

#ifndef _REGEXP_H
#if !defined(__PROTO__)
#include <prototyped.h>
#endif
#if !defined(__LINKAGE__)
#define __LINKAGE__		/* 2004-08-11 transition */
#endif

#define _REGEXP_H

#define NBRA		9

typedef struct
{
	char*		re_braslist[NBRA];
	char*		re_braelist[NBRA];
	char*		re_loc1;
	char*		re_loc2;
	char*		re_locs;
	int		re_circf;
	int		re_nbra;
	int		re_nodelim;
	int		re_sed;
} regexp_t;

#define braslist	_re_info.re_braslist
#define braelist	_re_info.re_braelist
#define circf		_re_info.re_circf
#define loc1		_re_info.re_loc1
#define loc2		_re_info.re_loc2
#define locs		_re_info.re_locs
#define nbra		_re_info.re_nbra
#define nodelim		_re_info.re_nodelim
#define sed		_re_info.re_sed

#define advance(a,b)		_re_exec(&_re_info,a,b,1)
#define compile(a,b,c,d)	_re_read(&_re_info,a,b,c,d)
#define step(a,b)		_re_exec(&_re_info,a,b,0)

#if _BLD_ast && defined(__EXPORT__)
#undef __MANGLE__
#define __MANGLE__ __LINKAGE__		__EXPORT__
#endif

extern __MANGLE__ int	_re_comp __PROTO__((regexp_t*, const char*, char*, unsigned int));
extern __MANGLE__ int	_re_exec __PROTO__((regexp_t*, const char*, const char*, int));
extern __MANGLE__ char*	_re_putc __PROTO__((int));
extern __MANGLE__ char*	_re_read __PROTO__((regexp_t*, const char*, char*, const char*, int));

#undef __MANGLE__
#define __MANGLE__ __LINKAGE__

#ifndef _REGEXP_DECLARE

regexp_t	_re_info;

char*
_re_read __PARAM__((register regexp_t* re, const char* instring, char* ep, const char* endbuf, int seof), (re, instring, ep, endbuf, seof)) __OTORP__(register regexp_t* re; const char* instring; char* ep; const char* endbuf; int seof;){
	register int		c;

	static const char*	prev;

#ifdef INIT
	INIT;
#endif

	re->re_nodelim = 0;
	if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
	{
		if (c != seof)
		{
			UNGETC(c);
			re->re_nodelim = 1;
		}
		if (!re->re_sed && !prev)
			{ ERROR(41); }
		RETURN((char*)endbuf);
	}
	UNGETC(c);
	prev = 0;
	for (;;)
	{
		if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
		{
			if (re->re_sed)
				{ ERROR(36); }
			UNGETC(c);
			re->re_nodelim = 1;
			break;
		}
		if (c == '\\')
		{
			_re_putc(c);
			if ((c = GETC()) == seof || c == '\n' || c == -1 || c == 0)
				{ ERROR(36); }
		}
		_re_putc(c);
	}
	if (c = _re_comp(re, _re_putc(0), ep, (char*)endbuf - ep))
		{ ERROR(c); }
	prev = endbuf;
	RETURN((char*)prev);
}

#endif

#endif