Tcl regex lib
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22024 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		
							
								
								
									
										3651
									
								
								src/regex/regcomp.c
									
									
									
									
									
								
							
							
						
						
									
										3651
									
								
								src/regex/regcomp.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										92
									
								
								src/regex/regcustom.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/regex/regcustom.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 1998, 1999 Henry Spencer.	All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Development of this software was funded, in part, by Cray Research Inc.,
 | 
			
		||||
 * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
 | 
			
		||||
 * Corporation, none of whom are responsible for the results.  The author
 | 
			
		||||
 * thanks all of them.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms -- with or without
 | 
			
		||||
 * modification -- are permitted for any purpose, provided that
 | 
			
		||||
 * redistributions in source form retain this entire copyright notice and
 | 
			
		||||
 * indicate the origin and nature of any modifications.
 | 
			
		||||
 *
 | 
			
		||||
 * I'd appreciate being given credit for this package in the documentation
 | 
			
		||||
 * of software which uses it, but that is not a requirement.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 | 
			
		||||
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 | 
			
		||||
 * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
			
		||||
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 | 
			
		||||
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | 
			
		||||
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | 
			
		||||
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 | 
			
		||||
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * $Id$
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* headers if any */
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#ifndef wxCHECK_GCC_VERSION
 | 
			
		||||
#define wxCHECK_GCC_VERSION( major, minor ) \
 | 
			
		||||
    ( defined(__GNUC__) && defined(__GNUC_MINOR__) \
 | 
			
		||||
    && ( ( __GNUC__ > (major) ) \
 | 
			
		||||
        || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) )
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef wxUSE_NEW_REGEX
 | 
			
		||||
 | 
			
		||||
    #if !wxUSE_UNICODE
 | 
			
		||||
    #	define wx_wchar char
 | 
			
		||||
    #else // Unicode
 | 
			
		||||
        #if (defined(__GNUC__) && !wxCHECK_GCC_VERSION(2, 96))
 | 
			
		||||
        #		define wx_wchar __WCHAR_TYPE__ 
 | 
			
		||||
        #else // __WCHAR_TYPE__ and gcc < 2.96
 | 
			
		||||
            // standard case
 | 
			
		||||
            #		define wx_wchar wchar_t         
 | 
			
		||||
        #endif // __WCHAR_TYPE__
 | 
			
		||||
    #endif // ASCII/Unicode
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    #define wx_wchar char
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* overrides for regguts.h definitions, if any */
 | 
			
		||||
#define FUNCPTR(name, args) (*name) args
 | 
			
		||||
#define MALLOC(n)		malloc(n)
 | 
			
		||||
#define FREE(p)			free(VS(p))
 | 
			
		||||
#define REALLOC(p,n)		realloc(VS(p),n)
 | 
			
		||||
 | 
			
		||||
/* internal character type and related */
 | 
			
		||||
typedef wx_wchar chr;			/* the type itself */
 | 
			
		||||
typedef unsigned uchr;			/* unsigned type that will hold a chr */
 | 
			
		||||
typedef int celt;				/* type to hold chr, MCCE number, or
 | 
			
		||||
								 * NOCELT */
 | 
			
		||||
 | 
			
		||||
#define NOCELT	(-1)			/* celt value which is not valid chr or
 | 
			
		||||
								 * MCCE */
 | 
			
		||||
#define CHR(c)	((unsigned char) (c))	/* turn char literal into chr
 | 
			
		||||
										 * literal */
 | 
			
		||||
#define DIGITVAL(c) ((c)-'0')	/* turn chr digit into its value */
 | 
			
		||||
#define CHRBITS 32				/* bits in a chr; must not use sizeof */
 | 
			
		||||
#define CHR_MIN 0x00000000		/* smallest and largest chr; the value */
 | 
			
		||||
#define CHR_MAX 0xfffffffe		/* CHR_MAX-CHR_MIN+1 should fit in uchr */
 | 
			
		||||
 | 
			
		||||
/* functions operating on chr */
 | 
			
		||||
#define iscalnum(x) wx_isalnum(x)
 | 
			
		||||
#define iscalpha(x) wx_isalpha(x)
 | 
			
		||||
#define iscdigit(x) wx_isdigit(x)
 | 
			
		||||
#define iscspace(x) wx_isspace(x)
 | 
			
		||||
 | 
			
		||||
/* and pick up the standard header */
 | 
			
		||||
#include "regex.h"
 | 
			
		||||
@@ -1,130 +1,126 @@
 | 
			
		||||
#if defined(__MWERKS__) && !defined(__MACH__)
 | 
			
		||||
typedef long off_t ;
 | 
			
		||||
#else
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include "regex.h"
 | 
			
		||||
 | 
			
		||||
#include "utils.h"
 | 
			
		||||
#include "regerror.ih"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 = #define	REG_OKAY	 0
 | 
			
		||||
 = #define	REG_NOMATCH	 1
 | 
			
		||||
 = #define	REG_BADPAT	 2
 | 
			
		||||
 = #define	REG_ECOLLATE	 3
 | 
			
		||||
 = #define	REG_ECTYPE	 4
 | 
			
		||||
 = #define	REG_EESCAPE	 5
 | 
			
		||||
 = #define	REG_ESUBREG	 6
 | 
			
		||||
 = #define	REG_EBRACK	 7
 | 
			
		||||
 = #define	REG_EPAREN	 8
 | 
			
		||||
 = #define	REG_EBRACE	 9
 | 
			
		||||
 = #define	REG_BADBR	10
 | 
			
		||||
 = #define	REG_ERANGE	11
 | 
			
		||||
 = #define	REG_ESPACE	12
 | 
			
		||||
 = #define	REG_BADRPT	13
 | 
			
		||||
 = #define	REG_EMPTY	14
 | 
			
		||||
 = #define	REG_ASSERT	15
 | 
			
		||||
 = #define	REG_INVARG	16
 | 
			
		||||
 = #define	REG_ATOI	255	// convert name to number (!)
 | 
			
		||||
 = #define	REG_ITOA	0400	// convert number to name (!)
 | 
			
		||||
 * regerror - error-code expansion
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 1998, 1999 Henry Spencer.	All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Development of this software was funded, in part, by Cray Research Inc.,
 | 
			
		||||
 * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
 | 
			
		||||
 * Corporation, none of whom are responsible for the results.  The author
 | 
			
		||||
 * thanks all of them.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms -- with or without
 | 
			
		||||
 * modification -- are permitted for any purpose, provided that
 | 
			
		||||
 * redistributions in source form retain this entire copyright notice and
 | 
			
		||||
 * indicate the origin and nature of any modifications.
 | 
			
		||||
 *
 | 
			
		||||
 * I'd appreciate being given credit for this package in the documentation
 | 
			
		||||
 * of software which uses it, but that is not a requirement.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 | 
			
		||||
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 | 
			
		||||
 * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
			
		||||
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 | 
			
		||||
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | 
			
		||||
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | 
			
		||||
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 | 
			
		||||
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * $Header: /projects/cvsroot/pgsql-server/src/backend/regex/regerror.c,v 1.26 2003/08/04 00:43:21 momjian Exp $
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
static struct rerr {
 | 
			
		||||
 | 
			
		||||
#include "regguts.h"
 | 
			
		||||
 | 
			
		||||
/* unknown-error explanation */
 | 
			
		||||
static char unk[] = "*** unknown regex error code 0x%x ***";
 | 
			
		||||
 | 
			
		||||
/* struct to map among codes, code names, and explanations */
 | 
			
		||||
static struct rerr
 | 
			
		||||
{
 | 
			
		||||
	int code;
 | 
			
		||||
	char *name;
 | 
			
		||||
	char *explain;
 | 
			
		||||
} rerrs[] = {
 | 
			
		||||
	{ REG_OKAY,	"REG_OKAY",	"no errors detected" },
 | 
			
		||||
	{ REG_NOMATCH,	"REG_NOMATCH",	"regexec() failed to match" },
 | 
			
		||||
	{ REG_BADPAT,	"REG_BADPAT",	"invalid regular expression" },
 | 
			
		||||
	{ REG_ECOLLATE,	"REG_ECOLLATE",	"invalid collating element" },
 | 
			
		||||
	{ REG_ECTYPE,	"REG_ECTYPE",	"invalid character class" },
 | 
			
		||||
	{ REG_EESCAPE,	"REG_EESCAPE",	"trailing backslash (\\)" },
 | 
			
		||||
	{ REG_ESUBREG,	"REG_ESUBREG",	"invalid backreference number" },
 | 
			
		||||
	{ REG_EBRACK,	"REG_EBRACK",	"brackets ([ ]) not balanced" },
 | 
			
		||||
	{ REG_EPAREN,	"REG_EPAREN",	"parentheses not balanced" },
 | 
			
		||||
	{ REG_EBRACE,	"REG_EBRACE",	"braces not balanced" },
 | 
			
		||||
	{ REG_BADBR,	"REG_BADBR",	"invalid repetition count(s)" },
 | 
			
		||||
	{ REG_ERANGE,	"REG_ERANGE",	"invalid character range" },
 | 
			
		||||
	{ REG_ESPACE,	"REG_ESPACE",	"out of memory" },
 | 
			
		||||
	{ REG_BADRPT,	"REG_BADRPT",	"repetition-operator operand invalid" },
 | 
			
		||||
	{ REG_EMPTY,	"REG_EMPTY",	"empty (sub)expression" },
 | 
			
		||||
	{ REG_ASSERT,	"REG_ASSERT",	"\"can't happen\" -- you found a bug" },
 | 
			
		||||
	{ REG_INVARG,	"REG_INVARG",	"invalid argument to regex routine" },
 | 
			
		||||
	{ -1,		"",		"*** unknown regexp error code ***" },
 | 
			
		||||
}	rerrs[] =
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
	/* the actual table is built from regex.h */
 | 
			
		||||
#include "regerrs.h"
 | 
			
		||||
	{
 | 
			
		||||
		-1, "", "oops"
 | 
			
		||||
	},							/* explanation special-cased in code */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
regerror(int errcode,		/* error code, or REG_ATOI or REG_ITOA */
 | 
			
		||||
			const regex_t *preg,	/* associated regex_t (unused at present) */
 | 
			
		||||
			char *errbuf,		/* result buffer (unless errbuf_size==0) */
 | 
			
		||||
			size_t errbuf_size) /* available space in errbuf, can be 0 */
 | 
			
		||||
            { return regerror(errcode, preg, errbuf, errbuf_size); }
 | 
			
		||||
/*
 | 
			
		||||
 - regerror - the interface to error numbers
 | 
			
		||||
 = extern size_t regerror(int, const regex_t *, char *, size_t);
 | 
			
		||||
 * pg_regerror - the interface to error numbers
 | 
			
		||||
 */
 | 
			
		||||
/* ARGSUSED */
 | 
			
		||||
size_t
 | 
			
		||||
regerror(errcode, preg, errbuf, errbuf_size)
 | 
			
		||||
int errcode;
 | 
			
		||||
const regex_t *preg;
 | 
			
		||||
char *errbuf;
 | 
			
		||||
size_t errbuf_size;
 | 
			
		||||
size_t							/* actual space needed (including NUL) */
 | 
			
		||||
wx_regerror(int errcode,		/* error code, or REG_ATOI or REG_ITOA */
 | 
			
		||||
			const regex_t *preg,	/* associated regex_t (unused at present) */
 | 
			
		||||
			char *errbuf,		/* result buffer (unless errbuf_size==0) */
 | 
			
		||||
			size_t errbuf_size) /* available space in errbuf, can be 0 */
 | 
			
		||||
{
 | 
			
		||||
	register struct rerr *r;
 | 
			
		||||
	register size_t len;
 | 
			
		||||
	register int target = errcode &~ REG_ITOA;
 | 
			
		||||
	register char *s;
 | 
			
		||||
	char convbuf[50];
 | 
			
		||||
	struct rerr *r;
 | 
			
		||||
	char	   *msg;
 | 
			
		||||
	char		convbuf[sizeof(unk) + 50];		/* 50 = plenty for int */
 | 
			
		||||
	size_t		len;
 | 
			
		||||
	int			icode;
 | 
			
		||||
 | 
			
		||||
	if (errcode == REG_ATOI)
 | 
			
		||||
		s = regatoi(preg, convbuf);
 | 
			
		||||
	else {
 | 
			
		||||
	switch (errcode)
 | 
			
		||||
	{
 | 
			
		||||
		case REG_ATOI:			/* convert name to number */
 | 
			
		||||
		for (r = rerrs; r->code >= 0; r++)
 | 
			
		||||
			if (r->code == target)
 | 
			
		||||
				if (strcmp(r->name, errbuf) == 0)
 | 
			
		||||
				break;
 | 
			
		||||
	
 | 
			
		||||
		if (errcode®_ITOA) {
 | 
			
		||||
			sprintf(convbuf, "%d", r->code);	/* -1 for unknown */
 | 
			
		||||
			msg = convbuf;
 | 
			
		||||
			break;
 | 
			
		||||
		case REG_ITOA:			/* convert number to name */
 | 
			
		||||
			icode = atoi(errbuf);		/* not our problem if this fails */
 | 
			
		||||
			for (r = rerrs; r->code >= 0; r++)
 | 
			
		||||
				if (r->code == icode)
 | 
			
		||||
					break;
 | 
			
		||||
			if (r->code >= 0)
 | 
			
		||||
				(void) strcpy(convbuf, r->name);
 | 
			
		||||
				msg = r->name;
 | 
			
		||||
			else
 | 
			
		||||
				sprintf(convbuf, "REG_0x%x", target);
 | 
			
		||||
			assert(strlen(convbuf) < sizeof(convbuf));
 | 
			
		||||
			s = convbuf;
 | 
			
		||||
		} else
 | 
			
		||||
			s = r->explain;
 | 
			
		||||
			{					/* unknown; tell him the number */
 | 
			
		||||
				sprintf(convbuf, "REG_%u", (unsigned) icode);
 | 
			
		||||
				msg = convbuf;
 | 
			
		||||
	}
 | 
			
		||||
			break;
 | 
			
		||||
		default:				/* a real, normal error code */
 | 
			
		||||
			for (r = rerrs; r->code >= 0; r++)
 | 
			
		||||
				if (r->code == errcode)
 | 
			
		||||
					break;
 | 
			
		||||
			if (r->code >= 0)
 | 
			
		||||
				msg = r->explain;
 | 
			
		||||
			else
 | 
			
		||||
			{					/* unknown; say so */
 | 
			
		||||
				sprintf(convbuf, unk, errcode);
 | 
			
		||||
				msg = convbuf;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	len = strlen(s) + 1;
 | 
			
		||||
	if (errbuf_size > 0) {
 | 
			
		||||
	len = strlen(msg) + 1;		/* space needed, including NUL */
 | 
			
		||||
	if (errbuf_size > 0)
 | 
			
		||||
	{
 | 
			
		||||
		if (errbuf_size > len)
 | 
			
		||||
			(void) strcpy(errbuf, s);
 | 
			
		||||
		else {
 | 
			
		||||
			(void) strncpy(errbuf, s, errbuf_size-1);
 | 
			
		||||
			errbuf[errbuf_size-1] = '\0';
 | 
			
		||||
			strcpy(errbuf, msg);
 | 
			
		||||
		else
 | 
			
		||||
		{						/* truncate to fit */
 | 
			
		||||
			memcpy(errbuf, msg, errbuf_size - 1);  /*RN - was strncpy*/
 | 
			
		||||
			errbuf[errbuf_size - 1] = '\0';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return(len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 - regatoi - internal routine to implement REG_ATOI
 | 
			
		||||
 == static char *regatoi(const regex_t *preg, char *localbuf);
 | 
			
		||||
 */
 | 
			
		||||
static char *
 | 
			
		||||
regatoi(preg, localbuf)
 | 
			
		||||
const regex_t *preg;
 | 
			
		||||
char *localbuf;
 | 
			
		||||
{
 | 
			
		||||
	register struct rerr *r;
 | 
			
		||||
 | 
			
		||||
	for (r = rerrs; r->code >= 0; r++)
 | 
			
		||||
		if (strcmp(r->name, preg->re_endp) == 0)
 | 
			
		||||
			break;
 | 
			
		||||
	if (r->code < 0)
 | 
			
		||||
		return("0");
 | 
			
		||||
 | 
			
		||||
	sprintf(localbuf, "%d", r->code);
 | 
			
		||||
	return(localbuf);
 | 
			
		||||
	return len;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1217
									
								
								src/regex/regexec.c
									
									
									
									
									
								
							
							
						
						
									
										1217
									
								
								src/regex/regexec.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,41 +1,57 @@
 | 
			
		||||
#if defined(__MWERKS__) && !defined(__MACH__)
 | 
			
		||||
typedef long off_t ;
 | 
			
		||||
#else
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include "regex.h"
 | 
			
		||||
/*
 | 
			
		||||
 * regfree - free an RE
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 1998, 1999 Henry Spencer.	All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Development of this software was funded, in part, by Cray Research Inc.,
 | 
			
		||||
 * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
 | 
			
		||||
 * Corporation, none of whom are responsible for the results.  The author
 | 
			
		||||
 * thanks all of them.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms -- with or without
 | 
			
		||||
 * modification -- are permitted for any purpose, provided that
 | 
			
		||||
 * redistributions in source form retain this entire copyright notice and
 | 
			
		||||
 * indicate the origin and nature of any modifications.
 | 
			
		||||
 *
 | 
			
		||||
 * I'd appreciate being given credit for this package in the documentation
 | 
			
		||||
 * of software which uses it, but that is not a requirement.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 | 
			
		||||
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 | 
			
		||||
 * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
			
		||||
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 | 
			
		||||
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 | 
			
		||||
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | 
			
		||||
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 | 
			
		||||
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * $Header: /projects/cvsroot/pgsql-server/src/backend/regex/regfree.c,v 1.17 2003/08/04 00:43:21 momjian Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * You might think that this could be incorporated into regcomp.c, and
 | 
			
		||||
 * that would be a reasonable idea... except that this is a generic
 | 
			
		||||
 * function (with a generic name), applicable to all compiled REs
 | 
			
		||||
 * regardless of the size of their characters, whereas the stuff in
 | 
			
		||||
 * regcomp.c gets compiled once per character size.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "regguts.h"
 | 
			
		||||
 | 
			
		||||
#include "utils.h"
 | 
			
		||||
#include "regex2.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 - regfree - free everything
 | 
			
		||||
 = extern void regfree(regex_t *);
 | 
			
		||||
 * pg_regfree - free an RE (generic function, punts to RE-specific function)
 | 
			
		||||
 *
 | 
			
		||||
 * Ignoring invocation with NULL is a convenience.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
regfree(preg)
 | 
			
		||||
regex_t *preg;
 | 
			
		||||
regfree(regex_t *re)
 | 
			
		||||
{ wx_regfree(re); }
 | 
			
		||||
void
 | 
			
		||||
wx_regfree(regex_t *re)
 | 
			
		||||
{
 | 
			
		||||
	register struct re_guts *g;
 | 
			
		||||
 | 
			
		||||
	if (preg->re_magic != MAGIC1)	/* oops */
 | 
			
		||||
		return;			/* nice to complain, but hard */
 | 
			
		||||
 | 
			
		||||
	g = preg->re_g;
 | 
			
		||||
	if (g == NULL || g->magic != MAGIC2)	/* oops again */
 | 
			
		||||
	if (re == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
	preg->re_magic = 0;		/* mark it invalid */
 | 
			
		||||
	g->magic = 0;			/* mark it invalid */
 | 
			
		||||
 | 
			
		||||
	if (g->strip != NULL)
 | 
			
		||||
		free((char *)g->strip);
 | 
			
		||||
	if (g->sets != NULL)
 | 
			
		||||
		free((char *)g->sets);
 | 
			
		||||
	if (g->setbits != NULL)
 | 
			
		||||
		free((char *)g->setbits);
 | 
			
		||||
	if (g->must != NULL)
 | 
			
		||||
		free(g->must);
 | 
			
		||||
	free((char *)g);
 | 
			
		||||
	(*((struct fns *) re->re_fns)->free) (re);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user