os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/generic/regex.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
#ifndef _REGEX_H_
sl@0
     2
#define	_REGEX_H_	/* never again */
sl@0
     3
/*
sl@0
     4
 * regular expressions
sl@0
     5
 *
sl@0
     6
 * Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
sl@0
     7
 * 
sl@0
     8
 * Development of this software was funded, in part, by Cray Research Inc.,
sl@0
     9
 * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
sl@0
    10
 * Corporation, none of whom are responsible for the results.  The author
sl@0
    11
 * thanks all of them. 
sl@0
    12
 * 
sl@0
    13
 * Redistribution and use in source and binary forms -- with or without
sl@0
    14
 * modification -- are permitted for any purpose, provided that
sl@0
    15
 * redistributions in source form retain this entire copyright notice and
sl@0
    16
 * indicate the origin and nature of any modifications.
sl@0
    17
 *
sl@0
    18
 * I'd appreciate being given credit for this package in the documentation
sl@0
    19
 * of software which uses it, but that is not a requirement.
sl@0
    20
 * 
sl@0
    21
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
sl@0
    22
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
sl@0
    23
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
sl@0
    24
 * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
sl@0
    25
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
sl@0
    26
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
sl@0
    27
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
sl@0
    28
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
sl@0
    29
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
sl@0
    30
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sl@0
    31
 *
sl@0
    32
 *
sl@0
    33
 *
sl@0
    34
 * Prototypes etc. marked with "^" within comments get gathered up (and
sl@0
    35
 * possibly edited) by the regfwd program and inserted near the bottom of
sl@0
    36
 * this file.
sl@0
    37
 *
sl@0
    38
 * We offer the option of declaring one wide-character version of the
sl@0
    39
 * RE functions as well as the char versions.  To do that, define
sl@0
    40
 * __REG_WIDE_T to the type of wide characters (unfortunately, there
sl@0
    41
 * is no consensus that wchar_t is suitable) and __REG_WIDE_COMPILE and
sl@0
    42
 * __REG_WIDE_EXEC to the names to be used for the compile and execute
sl@0
    43
 * functions (suggestion:  re_Xcomp and re_Xexec, where X is a letter
sl@0
    44
 * suggestive of the wide type, e.g. re_ucomp and re_uexec for Unicode).
sl@0
    45
 * For cranky old compilers, it may be necessary to do something like:
sl@0
    46
 * #define	__REG_WIDE_COMPILE(a,b,c,d)	re_Xcomp(a,b,c,d)
sl@0
    47
 * #define	__REG_WIDE_EXEC(a,b,c,d,e,f,g)	re_Xexec(a,b,c,d,e,f,g)
sl@0
    48
 * rather than just #defining the names as parameterless macros.
sl@0
    49
 *
sl@0
    50
 * For some specialized purposes, it may be desirable to suppress the
sl@0
    51
 * declarations of the "front end" functions, regcomp() and regexec(),
sl@0
    52
 * or of the char versions of the compile and execute functions.  To
sl@0
    53
 * suppress the front-end functions, define __REG_NOFRONT.  To suppress
sl@0
    54
 * the char versions, define __REG_NOCHAR.
sl@0
    55
 *
sl@0
    56
 * The right place to do those defines (and some others you may want, see
sl@0
    57
 * below) would be <sys/types.h>.  If you don't have control of that file,
sl@0
    58
 * the right place to add your own defines to this file is marked below.
sl@0
    59
 * This is normally done automatically, by the makefile and regmkhdr, based
sl@0
    60
 * on the contents of regcustom.h.
sl@0
    61
 */
sl@0
    62
sl@0
    63
sl@0
    64
sl@0
    65
/*
sl@0
    66
 * voodoo for C++
sl@0
    67
 */
sl@0
    68
#ifdef __cplusplus
sl@0
    69
extern "C" {
sl@0
    70
#endif
sl@0
    71
sl@0
    72
sl@0
    73
sl@0
    74
/*
sl@0
    75
 * Add your own defines, if needed, here.
sl@0
    76
 */
sl@0
    77
sl@0
    78
sl@0
    79
sl@0
    80
/*
sl@0
    81
 * Location where a chunk of regcustom.h is automatically spliced into
sl@0
    82
 * this file (working from its prototype, regproto.h).
sl@0
    83
 */
sl@0
    84
/* --- begin --- */
sl@0
    85
/* ensure certain things don't sneak in from system headers */
sl@0
    86
#ifdef __REG_WIDE_T
sl@0
    87
#undef __REG_WIDE_T
sl@0
    88
#endif
sl@0
    89
#ifdef __REG_WIDE_COMPILE
sl@0
    90
#undef __REG_WIDE_COMPILE
sl@0
    91
#endif
sl@0
    92
#ifdef __REG_WIDE_EXEC
sl@0
    93
#undef __REG_WIDE_EXEC
sl@0
    94
#endif
sl@0
    95
#ifdef __REG_REGOFF_T
sl@0
    96
#undef __REG_REGOFF_T
sl@0
    97
#endif
sl@0
    98
#ifdef __REG_VOID_T
sl@0
    99
#undef __REG_VOID_T
sl@0
   100
#endif
sl@0
   101
#ifdef __REG_CONST
sl@0
   102
#undef __REG_CONST
sl@0
   103
#endif
sl@0
   104
#ifdef __REG_NOFRONT
sl@0
   105
#undef __REG_NOFRONT
sl@0
   106
#endif
sl@0
   107
#ifdef __REG_NOCHAR
sl@0
   108
#undef __REG_NOCHAR
sl@0
   109
#endif
sl@0
   110
/* interface types */
sl@0
   111
#define	__REG_WIDE_T	Tcl_UniChar
sl@0
   112
#define	__REG_REGOFF_T	long	/* not really right, but good enough... */
sl@0
   113
#define	__REG_VOID_T	VOID
sl@0
   114
#define	__REG_CONST	CONST
sl@0
   115
/* names and declarations */
sl@0
   116
#define	__REG_WIDE_COMPILE	TclReComp
sl@0
   117
#define	__REG_WIDE_EXEC		TclReExec
sl@0
   118
#define	__REG_NOFRONT		/* don't want regcomp() and regexec() */
sl@0
   119
#define	__REG_NOCHAR		/* or the char versions */
sl@0
   120
#define	regfree		TclReFree
sl@0
   121
#define	regerror	TclReError
sl@0
   122
/* --- end --- */
sl@0
   123
sl@0
   124
sl@0
   125
/*
sl@0
   126
 * interface types etc.
sl@0
   127
 */
sl@0
   128
sl@0
   129
/*
sl@0
   130
 * regoff_t has to be large enough to hold either off_t or ssize_t,
sl@0
   131
 * and must be signed; it's only a guess that long is suitable, so we
sl@0
   132
 * offer <sys/types.h> an override.
sl@0
   133
 */
sl@0
   134
#ifdef __REG_REGOFF_T
sl@0
   135
typedef __REG_REGOFF_T regoff_t;
sl@0
   136
#else
sl@0
   137
typedef long regoff_t;
sl@0
   138
#endif
sl@0
   139
sl@0
   140
/*
sl@0
   141
 * For benefit of old compilers, we offer <sys/types.h> the option of
sl@0
   142
 * overriding the `void' type used to declare nonexistent return types.
sl@0
   143
 */
sl@0
   144
#ifdef __REG_VOID_T
sl@0
   145
typedef __REG_VOID_T re_void;
sl@0
   146
#else
sl@0
   147
typedef void re_void;
sl@0
   148
#endif
sl@0
   149
sl@0
   150
/*
sl@0
   151
 * Also for benefit of old compilers, <sys/types.h> can supply a macro
sl@0
   152
 * which expands to a substitute for `const'.
sl@0
   153
 */
sl@0
   154
#ifndef __REG_CONST
sl@0
   155
#define	__REG_CONST	const
sl@0
   156
#endif
sl@0
   157
sl@0
   158
sl@0
   159
sl@0
   160
/*
sl@0
   161
 * other interface types
sl@0
   162
 */
sl@0
   163
sl@0
   164
/* the biggie, a compiled RE (or rather, a front end to same) */
sl@0
   165
typedef struct {
sl@0
   166
	int re_magic;		/* magic number */
sl@0
   167
	size_t re_nsub;		/* number of subexpressions */
sl@0
   168
	long re_info;		/* information about RE */
sl@0
   169
#		define	REG_UBACKREF		000001
sl@0
   170
#		define	REG_ULOOKAHEAD		000002
sl@0
   171
#		define	REG_UBOUNDS		000004
sl@0
   172
#		define	REG_UBRACES		000010
sl@0
   173
#		define	REG_UBSALNUM		000020
sl@0
   174
#		define	REG_UPBOTCH		000040
sl@0
   175
#		define	REG_UBBS		000100
sl@0
   176
#		define	REG_UNONPOSIX		000200
sl@0
   177
#		define	REG_UUNSPEC		000400
sl@0
   178
#		define	REG_UUNPORT		001000
sl@0
   179
#		define	REG_ULOCALE		002000
sl@0
   180
#		define	REG_UEMPTYMATCH		004000
sl@0
   181
#		define	REG_UIMPOSSIBLE		010000
sl@0
   182
#		define	REG_USHORTEST		020000
sl@0
   183
	int re_csize;		/* sizeof(character) */
sl@0
   184
	char *re_endp;		/* backward compatibility kludge */
sl@0
   185
	/* the rest is opaque pointers to hidden innards */
sl@0
   186
	char *re_guts;		/* `char *' is more portable than `void *' */
sl@0
   187
	char *re_fns;
sl@0
   188
} regex_t;
sl@0
   189
sl@0
   190
/* result reporting (may acquire more fields later) */
sl@0
   191
typedef struct {
sl@0
   192
	regoff_t rm_so;		/* start of substring */
sl@0
   193
	regoff_t rm_eo;		/* end of substring */
sl@0
   194
} regmatch_t;
sl@0
   195
sl@0
   196
/* supplementary control and reporting */
sl@0
   197
typedef struct {
sl@0
   198
	regmatch_t rm_extend;	/* see REG_EXPECT */
sl@0
   199
} rm_detail_t;
sl@0
   200
sl@0
   201
sl@0
   202
sl@0
   203
/*
sl@0
   204
 * compilation
sl@0
   205
 ^ #ifndef __REG_NOCHAR
sl@0
   206
 ^ int re_comp(regex_t *, __REG_CONST char *, size_t, int);
sl@0
   207
 ^ #endif
sl@0
   208
 ^ #ifndef __REG_NOFRONT
sl@0
   209
 ^ int regcomp(regex_t *, __REG_CONST char *, int);
sl@0
   210
 ^ #endif
sl@0
   211
 ^ #ifdef __REG_WIDE_T
sl@0
   212
 ^ int __REG_WIDE_COMPILE(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int);
sl@0
   213
 ^ #endif
sl@0
   214
 */
sl@0
   215
#define	REG_BASIC	000000	/* BREs (convenience) */
sl@0
   216
#define	REG_EXTENDED	000001	/* EREs */
sl@0
   217
#define	REG_ADVF	000002	/* advanced features in EREs */
sl@0
   218
#define	REG_ADVANCED	000003	/* AREs (which are also EREs) */
sl@0
   219
#define	REG_QUOTE	000004	/* no special characters, none */
sl@0
   220
#define	REG_NOSPEC	REG_QUOTE	/* historical synonym */
sl@0
   221
#define	REG_ICASE	000010	/* ignore case */
sl@0
   222
#define	REG_NOSUB	000020	/* don't care about subexpressions */
sl@0
   223
#define	REG_EXPANDED	000040	/* expanded format, white space & comments */
sl@0
   224
#define	REG_NLSTOP	000100	/* \n doesn't match . or [^ ] */
sl@0
   225
#define	REG_NLANCH	000200	/* ^ matches after \n, $ before */
sl@0
   226
#define	REG_NEWLINE	000300	/* newlines are line terminators */
sl@0
   227
#define	REG_PEND	000400	/* ugh -- backward-compatibility hack */
sl@0
   228
#define	REG_EXPECT	001000	/* report details on partial/limited matches */
sl@0
   229
#define	REG_BOSONLY	002000	/* temporary kludge for BOS-only matches */
sl@0
   230
#define	REG_DUMP	004000	/* none of your business :-) */
sl@0
   231
#define	REG_FAKE	010000	/* none of your business :-) */
sl@0
   232
#define	REG_PROGRESS	020000	/* none of your business :-) */
sl@0
   233
sl@0
   234
sl@0
   235
sl@0
   236
/*
sl@0
   237
 * execution
sl@0
   238
 ^ #ifndef __REG_NOCHAR
sl@0
   239
 ^ int re_exec(regex_t *, __REG_CONST char *, size_t,
sl@0
   240
 ^				rm_detail_t *, size_t, regmatch_t [], int);
sl@0
   241
 ^ #endif
sl@0
   242
 ^ #ifndef __REG_NOFRONT
sl@0
   243
 ^ int regexec(regex_t *, __REG_CONST char *, size_t, regmatch_t [], int);
sl@0
   244
 ^ #endif
sl@0
   245
 ^ #ifdef __REG_WIDE_T
sl@0
   246
 ^ int __REG_WIDE_EXEC(regex_t *, __REG_CONST __REG_WIDE_T *, size_t,
sl@0
   247
 ^				rm_detail_t *, size_t, regmatch_t [], int);
sl@0
   248
 ^ #endif
sl@0
   249
 */
sl@0
   250
#define	REG_NOTBOL	0001	/* BOS is not BOL */
sl@0
   251
#define	REG_NOTEOL	0002	/* EOS is not EOL */
sl@0
   252
#define	REG_STARTEND	0004	/* backward compatibility kludge */
sl@0
   253
#define	REG_FTRACE	0010	/* none of your business */
sl@0
   254
#define	REG_MTRACE	0020	/* none of your business */
sl@0
   255
#define	REG_SMALL	0040	/* none of your business */
sl@0
   256
sl@0
   257
sl@0
   258
sl@0
   259
/*
sl@0
   260
 * misc generics (may be more functions here eventually)
sl@0
   261
 ^ re_void regfree(regex_t *);
sl@0
   262
 */
sl@0
   263
sl@0
   264
sl@0
   265
sl@0
   266
/*
sl@0
   267
 * error reporting
sl@0
   268
 * Be careful if modifying the list of error codes -- the table used by
sl@0
   269
 * regerror() is generated automatically from this file!
sl@0
   270
 *
sl@0
   271
 * Note that there is no wide-char variant of regerror at this time; what
sl@0
   272
 * kind of character is used for error reports is independent of what kind
sl@0
   273
 * is used in matching.
sl@0
   274
 *
sl@0
   275
 ^ extern size_t regerror(int, __REG_CONST regex_t *, char *, size_t);
sl@0
   276
 */
sl@0
   277
#define	REG_OKAY	 0	/* no errors detected */
sl@0
   278
#define	REG_NOMATCH	 1	/* failed to match */
sl@0
   279
#define	REG_BADPAT	 2	/* invalid regexp */
sl@0
   280
#define	REG_ECOLLATE	 3	/* invalid collating element */
sl@0
   281
#define	REG_ECTYPE	 4	/* invalid character class */
sl@0
   282
#define	REG_EESCAPE	 5	/* invalid escape \ sequence */
sl@0
   283
#define	REG_ESUBREG	 6	/* invalid backreference number */
sl@0
   284
#define	REG_EBRACK	 7	/* brackets [] not balanced */
sl@0
   285
#define	REG_EPAREN	 8	/* parentheses () not balanced */
sl@0
   286
#define	REG_EBRACE	 9	/* braces {} not balanced */
sl@0
   287
#define	REG_BADBR	10	/* invalid repetition count(s) */
sl@0
   288
#define	REG_ERANGE	11	/* invalid character range */
sl@0
   289
#define	REG_ESPACE	12	/* out of memory */
sl@0
   290
#define	REG_BADRPT	13	/* quantifier operand invalid */
sl@0
   291
#define	REG_ASSERT	15	/* "can't happen" -- you found a bug */
sl@0
   292
#define	REG_INVARG	16	/* invalid argument to regex function */
sl@0
   293
#define	REG_MIXED	17	/* character widths of regex and string differ */
sl@0
   294
#define	REG_BADOPT	18	/* invalid embedded option */
sl@0
   295
/* two specials for debugging and testing */
sl@0
   296
#define	REG_ATOI	101	/* convert error-code name to number */
sl@0
   297
#define	REG_ITOA	102	/* convert error-code number to name */
sl@0
   298
sl@0
   299
sl@0
   300
sl@0
   301
/*
sl@0
   302
 * the prototypes, as possibly munched by regfwd
sl@0
   303
 */
sl@0
   304
/* =====^!^===== begin forwards =====^!^===== */
sl@0
   305
/* automatically gathered by fwd; do not hand-edit */
sl@0
   306
/* === regproto.h === */
sl@0
   307
#ifndef __REG_NOCHAR
sl@0
   308
int re_comp _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, int));
sl@0
   309
#endif
sl@0
   310
#ifndef __REG_NOFRONT
sl@0
   311
int regcomp _ANSI_ARGS_((regex_t *, __REG_CONST char *, int));
sl@0
   312
#endif
sl@0
   313
#ifdef __REG_WIDE_T
sl@0
   314
int __REG_WIDE_COMPILE _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int));
sl@0
   315
#endif
sl@0
   316
#ifndef __REG_NOCHAR
sl@0
   317
int re_exec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, rm_detail_t *, size_t, regmatch_t [], int));
sl@0
   318
#endif
sl@0
   319
#ifndef __REG_NOFRONT
sl@0
   320
int regexec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, regmatch_t [], int));
sl@0
   321
#endif
sl@0
   322
#ifdef __REG_WIDE_T
sl@0
   323
int __REG_WIDE_EXEC _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int));
sl@0
   324
#endif
sl@0
   325
re_void regfree _ANSI_ARGS_((regex_t *));
sl@0
   326
extern size_t regerror _ANSI_ARGS_((int, __REG_CONST regex_t *, char *, size_t));
sl@0
   327
/* automatically gathered by fwd; do not hand-edit */
sl@0
   328
/* =====^!^===== end forwards =====^!^===== */
sl@0
   329
sl@0
   330
sl@0
   331
sl@0
   332
/*
sl@0
   333
 * more C++ voodoo
sl@0
   334
 */
sl@0
   335
#ifdef __cplusplus
sl@0
   336
}
sl@0
   337
#endif
sl@0
   338
sl@0
   339
sl@0
   340
sl@0
   341
#endif