regguts.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:12k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Internal interface definitions, etc., for the reg package
  3.  *
  4.  * Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
  5.  * 
  6.  * Development of this software was funded, in part, by Cray Research Inc.,
  7.  * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
  8.  * Corporation, none of whom are responsible for the results.  The author
  9.  * thanks all of them. 
  10.  * 
  11.  * Redistribution and use in source and binary forms -- with or without
  12.  * modification -- are permitted for any purpose, provided that
  13.  * redistributions in source form retain this entire copyright notice and
  14.  * indicate the origin and nature of any modifications.
  15.  * 
  16.  * I'd appreciate being given credit for this package in the documentation
  17.  * of software which uses it, but that is not a requirement.
  18.  * 
  19.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
  20.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  21.  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
  22.  * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  23.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  24.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  25.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  26.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  27.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  28.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30. /*
  31.  * Environmental customization.  It should not (I hope) be necessary to
  32.  * alter the file you are now reading -- regcustom.h should handle it all,
  33.  * given care here and elsewhere.
  34.  */
  35. #include "regcustom.h"
  36. /*
  37.  * Things that regcustom.h might override.
  38.  */
  39. /* standard header files (NULL is a reasonable indicator for them) */
  40. #ifndef NULL
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <ctype.h>
  44. #include <limits.h>
  45. #include <string.h>
  46. #endif
  47. /* assertions */
  48. #ifndef assert
  49. # ifndef REG_DEBUG
  50. # ifndef NDEBUG
  51. # define NDEBUG /* no assertions */
  52. # endif
  53. # endif
  54. #include <assert.h>
  55. #endif
  56. /* voids */
  57. #ifndef VOID
  58. #define VOID void /* for function return values */
  59. #endif
  60. #ifndef DISCARD
  61. #define DISCARD VOID /* for throwing values away */
  62. #endif
  63. #ifndef PVOID
  64. #define PVOID VOID * /* generic pointer */
  65. #endif
  66. #ifndef VS
  67. #define VS(x) ((PVOID)(x)) /* cast something to generic ptr */
  68. #endif
  69. #ifndef NOPARMS
  70. #define NOPARMS VOID /* for empty parm lists */
  71. #endif
  72. /* const */
  73. #ifndef CONST
  74. #define CONST const /* for old compilers, might be empty */
  75. #endif
  76. /* function-pointer declarator */
  77. #ifndef FUNCPTR
  78. #if __STDC__ >= 1
  79. #define FUNCPTR(name, args) (*name)args
  80. #else
  81. #define FUNCPTR(name, args) (*name)()
  82. #endif
  83. #endif
  84. /* memory allocation */
  85. #ifndef MALLOC
  86. #define MALLOC(n) malloc(n)
  87. #endif
  88. #ifndef REALLOC
  89. #define REALLOC(p, n) realloc(VS(p), n)
  90. #endif
  91. #ifndef FREE
  92. #define FREE(p) free(VS(p))
  93. #endif
  94. /* want size of a char in bits, and max value in bounded quantifiers */
  95. #ifndef CHAR_BIT
  96. #include <limits.h>
  97. #endif
  98. #ifndef _POSIX2_RE_DUP_MAX
  99. #define _POSIX2_RE_DUP_MAX 255 /* normally from <limits.h> */
  100. #endif
  101. /*
  102.  * misc
  103.  */
  104. #define NOTREACHED 0
  105. #define xxx 1
  106. #define DUPMAX _POSIX2_RE_DUP_MAX
  107. #define INFINITY (DUPMAX+1)
  108. #define REMAGIC 0xfed7 /* magic number for main struct */
  109. /*
  110.  * debugging facilities
  111.  */
  112. #ifdef REG_DEBUG
  113. /* FDEBUG does finite-state tracing */
  114. #define FDEBUG(arglist) { if (v->eflags&REG_FTRACE) printf arglist; }
  115. /* MDEBUG does higher-level tracing */
  116. #define MDEBUG(arglist) { if (v->eflags&REG_MTRACE) printf arglist; }
  117. #else
  118. #define FDEBUG(arglist) {}
  119. #define MDEBUG(arglist) {}
  120. #endif
  121. /*
  122.  * bitmap manipulation
  123.  */
  124. #define UBITS (CHAR_BIT * sizeof(unsigned))
  125. #define BSET(uv, sn) ((uv)[(sn)/UBITS] |= (unsigned)1 << ((sn)%UBITS))
  126. #define ISBSET(uv, sn) ((uv)[(sn)/UBITS] & ((unsigned)1 << ((sn)%UBITS)))
  127. /*
  128.  * We dissect a chr into byts for colormap table indexing.  Here we define
  129.  * a byt, which will be the same as a byte on most machines...  The exact
  130.  * size of a byt is not critical, but about 8 bits is good, and extraction
  131.  * of 8-bit chunks is sometimes especially fast.
  132.  */
  133. #ifndef BYTBITS
  134. #define BYTBITS 8 /* bits in a byt */
  135. #endif
  136. #define BYTTAB (1<<BYTBITS) /* size of table with one entry per byt value */
  137. #define BYTMASK (BYTTAB-1) /* bit mask for byt */
  138. #define NBYTS ((CHRBITS+BYTBITS-1)/BYTBITS)
  139. /* the definition of GETCOLOR(), below, assumes NBYTS <= 4 */
  140. /*
  141.  * As soon as possible, we map chrs into equivalence classes -- "colors" --
  142.  * which are of much more manageable number.
  143.  */
  144. typedef short color; /* colors of characters */
  145. typedef int pcolor; /* what color promotes to */
  146. #define COLORLESS (-1) /* impossible color */
  147. #define WHITE 0 /* default color, parent of all others */
  148. /*
  149.  * A colormap is a tree -- more precisely, a DAG -- indexed at each level
  150.  * by a byt of the chr, to map the chr to a color efficiently.  Because
  151.  * lower sections of the tree can be shared, it can exploit the usual
  152.  * sparseness of such a mapping table.  The tree is always NBYTS levels
  153.  * deep (in the past it was shallower during construction but was "filled"
  154.  * to full depth at the end of that); areas that are unaltered as yet point
  155.  * to "fill blocks" which are entirely WHITE in color.
  156.  */
  157. /* the tree itself */
  158. struct colors {
  159. color ccolor[BYTTAB];
  160. };
  161. struct ptrs {
  162. union tree *pptr[BYTTAB];
  163. };
  164. union tree {
  165. struct colors colors;
  166. struct ptrs ptrs;
  167. };
  168. #define tcolor colors.ccolor
  169. #define tptr ptrs.pptr
  170. /* internal per-color structure for the color machinery */
  171. struct colordesc {
  172. uchr nchrs; /* number of chars of this color */
  173. color sub; /* open subcolor (if any); free chain ptr */
  174. # define NOSUB COLORLESS
  175. struct arc *arcs; /* color chain */
  176. int flags;
  177. # define FREECOL 01 /* currently free */
  178. # define PSEUDO 02 /* pseudocolor, no real chars */
  179. # define UNUSEDCOLOR(cd) ((cd)->flags&FREECOL)
  180. union tree *block; /* block of solid color, if any */
  181. };
  182. /* the color map itself */
  183. struct colormap {
  184. int magic;
  185. # define CMMAGIC 0x876
  186. struct vars *v; /* for compile error reporting */
  187. size_t ncds; /* number of colordescs */
  188. size_t max; /* highest in use */
  189. color free; /* beginning of free chain (if non-0) */
  190. struct colordesc *cd;
  191. # define CDEND(cm) (&(cm)->cd[(cm)->max + 1])
  192. # define NINLINECDS ((size_t)10)
  193. struct colordesc cdspace[NINLINECDS];
  194. union tree tree[NBYTS]; /* tree top, plus fill blocks */
  195. };
  196. /* optimization magic to do fast chr->color mapping */
  197. #define B0(c) ((c) & BYTMASK)
  198. #define B1(c) (((c)>>BYTBITS) & BYTMASK)
  199. #define B2(c) (((c)>>(2*BYTBITS)) & BYTMASK)
  200. #define B3(c) (((c)>>(3*BYTBITS)) & BYTMASK)
  201. #if NBYTS == 1
  202. #define GETCOLOR(cm, c) ((cm)->tree->tcolor[B0(c)])
  203. #endif
  204. /* beware, for NBYTS>1, GETCOLOR() is unsafe -- 2nd arg used repeatedly */
  205. #if NBYTS == 2
  206. #define GETCOLOR(cm, c) ((cm)->tree->tptr[B1(c)]->tcolor[B0(c)])
  207. #endif
  208. #if NBYTS == 4
  209. #define GETCOLOR(cm, c) ((cm)->tree->tptr[B3(c)]->tptr[B2(c)]->tptr[B1(c)]->tcolor[B0(c)])
  210. #endif
  211. /*
  212.  * Interface definitions for locale-interface functions in locale.c.
  213.  * Multi-character collating elements (MCCEs) cause most of the trouble.
  214.  */
  215. struct cvec {
  216. int nchrs; /* number of chrs */
  217. int chrspace; /* number of chrs possible */
  218. chr *chrs; /* pointer to vector of chrs */
  219. int nranges; /* number of ranges (chr pairs) */
  220. int rangespace; /* number of chrs possible */
  221. chr *ranges; /* pointer to vector of chr pairs */
  222. int nmcces; /* number of MCCEs */
  223. int mccespace; /* number of MCCEs possible */
  224. int nmccechrs; /* number of chrs used for MCCEs */
  225. chr *mcces[1]; /* pointers to 0-terminated MCCEs */
  226. /* and both batches of chrs are on the end */
  227. };
  228. /* caution:  this value cannot be changed easily */
  229. #define MAXMCCE 2 /* length of longest MCCE */
  230. /*
  231.  * definitions for NFA internal representation
  232.  *
  233.  * Having a "from" pointer within each arc may seem redundant, but it
  234.  * saves a lot of hassle.
  235.  */
  236. struct state;
  237. struct arc {
  238. int type;
  239. # define ARCFREE ''
  240. color co;
  241. struct state *from; /* where it's from (and contained within) */
  242. struct state *to; /* where it's to */
  243. struct arc *outchain; /* *from's outs chain or free chain */
  244. # define freechain outchain
  245. struct arc *inchain; /* *to's ins chain */
  246. struct arc *colorchain; /* color's arc chain */
  247. struct arc *colorchain_rev; /* back-link in color's arc chain */
  248. };
  249. struct arcbatch { /* for bulk allocation of arcs */
  250. struct arcbatch *next;
  251. # define ABSIZE 10
  252. struct arc a[ABSIZE];
  253. };
  254. struct state {
  255. int no;
  256. # define FREESTATE (-1)
  257. char flag; /* marks special states */
  258. int nins; /* number of inarcs */
  259. struct arc *ins; /* chain of inarcs */
  260. int nouts; /* number of outarcs */
  261. struct arc *outs; /* chain of outarcs */
  262. struct arc *free; /* chain of free arcs */
  263. struct state *tmp; /* temporary for traversal algorithms */
  264. struct state *next; /* chain for traversing all */
  265. struct state *prev; /* back chain */
  266. struct arcbatch oas; /* first arcbatch, avoid malloc in easy case */
  267. int noas; /* number of arcs used in first arcbatch */
  268. };
  269. struct nfa {
  270. struct state *pre; /* pre-initial state */
  271. struct state *init; /* initial state */
  272. struct state *final; /* final state */
  273. struct state *post; /* post-final state */
  274. int nstates; /* for numbering states */
  275. struct state *states; /* state-chain header */
  276. struct state *slast; /* tail of the chain */
  277. struct state *free; /* free list */
  278. struct colormap *cm; /* the color map */
  279. color bos[2]; /* colors, if any, assigned to BOS and BOL */
  280. color eos[2]; /* colors, if any, assigned to EOS and EOL */
  281. size_t size; /* current NFA size; differs from nstates as
  282.  * it will be incremented by its children */
  283. struct vars *v; /* simplifies compile error reporting */
  284. struct nfa *parent; /* parent NFA, if any */
  285. };
  286. /*
  287.  * definitions for compacted NFA
  288.  */
  289. struct carc {
  290. color co; /* COLORLESS is list terminator */
  291. int to; /* state number */
  292. };
  293. struct cnfa {
  294. int nstates; /* number of states */
  295. int ncolors; /* number of colors */
  296. int flags;
  297. # define HASLACONS 01 /* uses lookahead constraints */
  298. int pre; /* setup state number */
  299. int post; /* teardown state number */
  300. color bos[2]; /* colors, if any, assigned to BOS and BOL */
  301. color eos[2]; /* colors, if any, assigned to EOS and EOL */
  302. struct carc **states; /* vector of pointers to outarc lists */
  303. struct carc *arcs; /* the area for the lists */
  304. };
  305. #define ZAPCNFA(cnfa) ((cnfa).nstates = 0)
  306. #define NULLCNFA(cnfa) ((cnfa).nstates == 0)
  307. /* Used to limit the maximum NFA size */
  308. #ifndef REG_MAX_STATES
  309. #define REG_MAX_STATES 100000
  310. #endif
  311. /*
  312.  * subexpression tree
  313.  */
  314. struct subre {
  315. char op; /* '|', '.' (concat), 'b' (backref), '(', '=' */
  316. char flags;
  317. # define LONGER 01 /* prefers longer match */
  318. # define SHORTER 02 /* prefers shorter match */
  319. # define MIXED 04 /* mixed preference below */
  320. # define CAP 010 /* capturing parens below */
  321. # define BACKR 020 /* back reference below */
  322. # define INUSE 0100 /* in use in final tree */
  323. # define LOCAL 03 /* bits which may not propagate up */
  324. # define LMIX(f) ((f)<<2) /* LONGER -> MIXED */
  325. # define SMIX(f) ((f)<<1) /* SHORTER -> MIXED */
  326. # define UP(f) (((f)&~LOCAL) | (LMIX(f) & SMIX(f) & MIXED))
  327. # define MESSY(f) ((f)&(MIXED|CAP|BACKR))
  328. # define PREF(f) ((f)&LOCAL)
  329. # define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2))
  330. # define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2))
  331. short retry; /* index into retry memory */
  332. int subno; /* subexpression number (for 'b' and '(') */
  333. short min; /* min repetitions, for backref only */
  334. short max; /* max repetitions, for backref only */
  335. struct subre *left; /* left child, if any (also freelist chain) */
  336. struct subre *right; /* right child, if any */
  337. struct state *begin; /* outarcs from here... */
  338. struct state *end; /* ...ending in inarcs here */
  339. struct cnfa cnfa; /* compacted NFA, if any */
  340. struct subre *chain; /* for bookkeeping and error cleanup */
  341. };
  342. /*
  343.  * table of function pointers for generic manipulation functions
  344.  * A regex_t's re_fns points to one of these.
  345.  */
  346. struct fns {
  347. VOID FUNCPTR(free, (regex_t *));
  348. };
  349. /*
  350.  * the insides of a regex_t, hidden behind a void *
  351.  */
  352. struct guts {
  353. int magic;
  354. # define GUTSMAGIC 0xfed9
  355. int cflags; /* copy of compile flags */
  356. long info; /* copy of re_info */
  357. size_t nsub; /* copy of re_nsub */
  358. struct subre *tree;
  359. struct cnfa search; /* for fast preliminary search */
  360. int ntree;
  361. struct colormap cmap;
  362. int FUNCPTR(compare, (CONST chr *, CONST chr *, size_t));
  363. struct subre *lacons; /* lookahead-constraint vector */
  364. int nlacons; /* size of lacons */
  365. };