1/*
2 * Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
3 *
4 * Development of this software was funded, in part, by Cray Research Inc.,
5 * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
6 * Corporation, none of whom are responsible for the results. The author
7 * thanks all of them.
8 *
9 * Redistribution and use in source and binary forms - with or without
10 * modification - are permitted for any purpose, provided that redistributions
11 * in source form retain this entire copyright notice and indicate the origin
12 * and nature of any modifications.
13 *
14 * I'd appreciate being given credit for this package in the documentation of
15 * software which uses it, but that is not a requirement.
16 *
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/*
30 * Headers if any.
31 */
32
33#include "tclInt.h"
34
35/*
36 * Overrides for regguts.h definitions, if any.
37 */
38
39#define	FUNCPTR(name, args)	(*name)args
40#define	MALLOC(n)		ckalloc(n)
41#define	FREE(p)			ckfree(VS(p))
42#define	REALLOC(p,n)		ckrealloc(VS(p),n)
43
44/*
45 * Do not insert extras between the "begin" and "end" lines - this chunk is
46 * automatically extracted to be fitted into regex.h.
47 */
48
49/* --- begin --- */
50/* Ensure certain things don't sneak in from system headers. */
51#ifdef __REG_WIDE_T
52#undef __REG_WIDE_T
53#endif
54#ifdef __REG_WIDE_COMPILE
55#undef __REG_WIDE_COMPILE
56#endif
57#ifdef __REG_WIDE_EXEC
58#undef __REG_WIDE_EXEC
59#endif
60#ifdef __REG_REGOFF_T
61#undef __REG_REGOFF_T
62#endif
63#ifdef __REG_VOID_T
64#undef __REG_VOID_T
65#endif
66#ifdef __REG_CONST
67#undef __REG_CONST
68#endif
69#ifdef __REG_NOFRONT
70#undef __REG_NOFRONT
71#endif
72#ifdef __REG_NOCHAR
73#undef __REG_NOCHAR
74#endif
75/* Interface types */
76#define	__REG_WIDE_T	Tcl_UniChar
77#define	__REG_REGOFF_T	long	/* Not really right, but good enough... */
78#define	__REG_VOID_T	void
79#define	__REG_CONST	const
80/* Names and declarations */
81#define	__REG_WIDE_COMPILE	TclReComp
82#define	__REG_WIDE_EXEC		TclReExec
83#define	__REG_NOFRONT		/* Don't want regcomp() and regexec() */
84#define	__REG_NOCHAR		/* Or the char versions */
85#define	regfree		TclReFree
86#define	regerror	TclReError
87/* --- end --- */
88
89/*
90 * Internal character type and related.
91 */
92
93typedef Tcl_UniChar chr;	/* The type itself. */
94typedef int pchr;		/* What it promotes to. */
95typedef unsigned uchr;		/* Unsigned type that will hold a chr. */
96typedef int celt;		/* Type to hold chr, or NOCELT */
97#define	NOCELT (-1)		/* Celt value which is not valid chr */
98#define	CHR(c) (UCHAR(c))	/* Turn char literal into chr literal */
99#define	DIGITVAL(c) ((c)-'0')	/* Turn chr digit into its value */
100#if TCL_UTF_MAX > 3
101#define	CHRBITS	32		/* Bits in a chr; must not use sizeof */
102#define	CHR_MIN	0x00000000	/* Smallest and largest chr; the value */
103#define	CHR_MAX	0xffffffff	/* CHR_MAX-CHR_MIN+1 should fit in uchr */
104#else
105#define	CHRBITS	16		/* Bits in a chr; must not use sizeof */
106#define	CHR_MIN	0x0000		/* Smallest and largest chr; the value */
107#define	CHR_MAX	0xffff		/* CHR_MAX-CHR_MIN+1 should fit in uchr */
108#endif
109
110/*
111 * Functions operating on chr.
112 */
113
114#define	iscalnum(x)	Tcl_UniCharIsAlnum(x)
115#define	iscalpha(x)	Tcl_UniCharIsAlpha(x)
116#define	iscdigit(x)	Tcl_UniCharIsDigit(x)
117#define	iscspace(x)	Tcl_UniCharIsSpace(x)
118
119/*
120 * Name the external functions.
121 */
122
123#define	compile		TclReComp
124#define	exec		TclReExec
125
126/*
127& Enable/disable debugging code (by whether REG_DEBUG is defined or not).
128*/
129
130#if 0				/* No debug unless requested by makefile. */
131#define	REG_DEBUG	/* */
132#endif
133
134/*
135 * Method of allocating a local workspace. We used a thread-specific data
136 * space to store this because the regular expression engine is never
137 * reentered from the same thread; it doesn't make any callbacks.
138 */
139
140#if 1
141#define AllocVars(vPtr) \
142    static Tcl_ThreadDataKey varsKey; \
143    register struct vars *vPtr = (struct vars *) \
144	    Tcl_GetThreadData(&varsKey, sizeof(struct vars))
145#else
146/*
147 * This strategy for allocating workspace is "more proper" in some sense, but
148 * quite a bit slower. Using TSD (as above) leads to code that is quite a bit
149 * faster in practice (measured!)
150 */
151#define AllocVars(vPtr) \
152    register struct vars *vPtr = (struct vars *) MALLOC(sizeof(struct vars))
153#define FreeVars(vPtr) \
154    FREE(vPtr)
155#endif
156
157/*
158 * And pick up the standard header.
159 */
160
161#include "regex.h"
162