/************************************************************************
 *	bregex -- The `Better/BuGless/Berg' Regular Expression library	*
 *									*
 *	This package contains a regular expression library based on	*
 *	the POSIX interface.  It has been written in ANSI and K&R	*
 *	conforming C.							*
 *	The library is fully POSIX compliant except for the following:	*
 *		- regexec() can not be called concurrently on the same	*
 *		  compiled regex_t struct (use regcopy() instead).	*
 *		- Bracket expressions currently do not support:		*
 *			Collating symbols [. .]				*
 *			Equivalence class expressions [= =]		*
 *		- Basic regular expressions do not allow backreference	*
 *		  expressions in the search pattern.			*
 *									*
 *	Copyright (c) 1991-1993, by S.R. van den Berg, The Netherlands	*
 *									*
 *	You are allowed to use this library or any work derived		*
 *	thereof in any non-commercial package as long as you give	*
 *	me credit somewhere within this package.  When in doubt,	*
 *	contact me for an agreement.					*
 *									*
 *	I can be reached on Internet under the following addresses:	*
 *			<berg@pool.informatik.rwth-aachen.de>		*
 *			<berg@physik.tu-muenchen.de>			*
 ************************************************************************/
#ifndef BREGEX_H_
#define BREGEX_H_
/*$Id*/
/*
 * The following defines can be uncommented in any combination you see fit.
 * The default configuration (none of them defined) will be POSIX conforming
 * (exceptions noted above).  Uncommenting one or the other will cause the
 * regular expression library to change in compiled code size and speed.
 *
 * The following legenda applies:
 *	+	noticable increase
 *	-	noticable decrease
 *	.	no noticable change
 *	?	change will depend on C-compiler/C-library
 *
 * The columns correspond to the following characteristics:
 *	bregex.o size, regcomp() speed, heap+stack size, regexec() speed.
 */

/*#define RE_pNOSUB		-+-+		      /* permanent REG_NOSUB */
/*#define RE_pNEWLINE		-.-.		    /* permanent REG_NEWLINE */
/*#define RE_nNEWLINE		-.-+	       /* permanently no REG_NEWLINE */
/*#define RE_pEXTENDED		-...		   /* permanent REG_EXTENDED */
/*#define RE_nEXTENDED		-...	      /* permanently no REG_EXTENDED */
/*#define RE_HEX_CHAR		+...	/* \x41 \x0a etc. will be recognised */
/*#define RE_OCT_CHAR		+...	  /* \11 \12 etc. will be recognised */
/*#define RE_SPEC_CHAR		+...	    /* \n \t etc. will be recognised */
/*#define RE_EXEC_ERROR		+..-	/* erroneous regexps can be executed */
/*#define RE_COMMON_SUBXP	?.??  /* your C-optimiser had better be good */
/*#define RE_COPY		+...	      /* regcopy() will be available */
/*#define RE_STRLEN		-..+	/* you supply the strlen of the text */
	      /* advantages: embedded \0 characters allowed, increased speed */
/*#define RE_MEMCHR		...?	       /* use memchr(), not relevant */
						/* when RE_STRLEN is defined */
/*#define RE_nCTYPE		?...	  /* do not use the <ctype.h> macros */
/*#define RE_nCHAR_CLASS	-...  /* character classes are not supported */
/*#define RE_nCASE_TABLE	-..-	       /* do not use two case tables */
/*#define RE_nJUMP_TABLE	-+--		/* do not create a jumptable */
/*#define RE_SMALL_JUMP_TABLE	?.-?		  /* use a smaller jumptable */
/*#define RE_NSUBMAX		...+		 /* support REG_NSUBMAX flag */
/*#define RE_SUBSTR_PTR		-..+	 /* regmatch_t will contain pointers */
/*#define RE_nBRACES		-+..	/* e.g. a{3,5} will not be supported */
/*#define RE_nERROR_DETECT	-+..   /* regexp errors are silently `fixed' */
/*#define RE_nERROR_REPORT	-...	 /* regerror() will not be available */
/*#define RE_nCONCUR_COMPILE	-+-.	  /* regcomp() will be non-reentrant */
/*#define RE_nREUSABLE		-..+   /* only one execution/compiled regexp */
/*#define RE_EMPTY_OR		+... /* empty or branches behave as expected */
/*#define RE_SURE_MINIMAL	-+..  /* regexps are expected to be in their */
			 /* minimal form, if they aren't, hangups can result */
/*#define RE_DUMB_ANCHOR	-+..  /* unquoted ^ and $ are always special */
				  /* crashes might result if used improperly */
/*
 * You can define RE_ABORT_EXPR to some expression that will be evaluated
 * in the main search loop of regexec() (once for every character in the input
 * stream).  As soon as it evaluates to true, regexec() will abort the search.
 *	Optimisations:		+..-
 */

/*#define P(args) args		  /* you can uncomment this if your compiler */
						       /* understands ANSI C */
#ifdef RE_CONF			  /* define RE_CONF to make bregex.h include */
#include "bregex.conf"			 /* your personal configuration file */
#endif

/**************************************************
 * All configurable options are *above* this line *
 **************************************************/

#ifndef P
#define P(args) ()
#define RE_P
#ifndef const
#define const
#define RE_const
#endif
#endif

#define C_BACKREF       'g'               /* extend number for backreference */

#define REG_EXTENDED	1		 /* use extended regular expressions */
#define REG_ICASE	2			     /* ignore case in match */
#define REG_NOSUB	4	/* equivalent to REG_NSUBMAX with re_nsub==0 */
#define REG_NEWLINE	8	      /* a dot and a class will not match \n */
#define REG_NOTBOL	16		 /* do not match ^ at the very start */
#define REG_NOTEOL	32		   /* do not match $ at the very end */

#define REG_LOWMEM	64	 /* regexec() will save memory and be slower */
#define REG_NSUBMAX	128		     /* regcomp() will check re_nsub */
#define REG_NOOFFSET	256	   /* regerror() will not display the offset */

#define REG_SIMPLE	512				  /* used internally */
#define REG_ERROR	1024				  /* used internally */
#define REG_OUTOFMEM	2048				  /* used internally */

#define REG_NOMATCH	1				  /* Failed to match */
#define REG_BADPAT	2		       /* Invalid regular expression */
#define REG_ECOLLATE	3			/* Invalid collating element */
#define REG_ECTYPE	4		     /* Invalid character class type */
#define REG_EESCAPE	5				       /* Trailing \ */
#define REG_ESUBREG	6			 /* Number in \digit invalid */
#define REG_EBRACK	7				    /* [ ] imbalance */
#define REG_EPAREN	8				    /* ( ) imbalance */
#define REG_EBRACE	9				    /* { } imbalance */
#define REG_BADBR	10			   /* Content of { } invalid */
#define REG_ERANGE	11	     /* Invalid endpoint in range expression */
#define REG_ESPACE	12				    /* Out of memory */
#define REG_BADRPT	13	     /* Inappropriate use of magic character */

#define REG_ABORT	14				   /* Search aborted */

#ifndef RE_SUBSTR_PTR
typedef int regoff_t;
typedef struct
{ union
   { regoff_t	rm_o;
     char*	rm_p;
   }		rm_ss,rm_es;
} regmatch_t;

#define rm_so	rm_ss.rm_o
#define rm_eo	rm_es.rm_o
#define rm_sp	rm_ss.rm_p
#define rm_ep	rm_es.rm_p
#else

typedef char*regptr_t;
typedef struct
{ char		*rm_sp,*rm_ep;
} regmatch_t;
#endif /* RE_SUBSTR_PTR */

typedef struct
{ size_t	re_nsub;
  unsigned	re_flags;
#ifndef RE_nJUMP_TABLE
  unsigned	re_maxjump;
#endif
  void*		re_compiled;
  void*		re_finpoint;
  union
   { size_t	re_error;
     void*	re_stack;
   }		re_es;
} regex_t;

#define re_erroffset	re_es.re_error		 /* can be used to determine */
				   /* the offset at which the error occurred */
#define regcomp		bregcomp	   /* use defines to prevent clashes */
#define regexec		bregexec		 /* with an existing library */
#define regfree		bregfree
#define regerror	bregerror

int
 regcomp P((regex_t*const preg,const char*const pattern,int cflags)),
#ifdef RE_STRLEN
 regexec P((/*const*/regex_t*preg,const char*const string,size_t length,
  size_t nmatch,regmatch_t pmatch[],int eflags));
#else
 regexec P((/*const*/regex_t*preg,const char*const string,size_t nmatch,
  regmatch_t pmatch[],int eflags));
#endif
#ifdef RE_COPY
int
 regcopy P((regex_t*const dest,const regex_t*const src));
#endif
#ifndef RE_nERROR_REPORT
size_t
 regerror P((const errcode,const regex_t*const preg,char*const errbuf,
  size_t errbuf_size));
#endif
void
 regfree P((regex_t*rg));

#ifndef reg_malloc
extern void
 *(*reg_malloc)P((size_t size)),
 *(*reg_realloc)P((void*ptr,size_t size)),
 (*reg_free)P((void*ptr));
#endif

#ifndef BREGEX_C_
#ifdef RE_P
#undef P
#endif
#ifdef RE_const
#undef const
#endif
#endif /* BREGEX_C_ */

#endif /* BREGEX_H_ */
/*{{{}}}*/
