regex2.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * First, the stuff that ends up in the outside-world include file
  3.  = typedef off_t regoff_t;
  4.  = typedef struct {
  5.  =  int re_magic;
  6.  =  size_t re_nsub; // number of parenthesized subexpressions
  7.  =  const char *re_endp; // end pointer for REG_PEND
  8.  =  struct re_guts *re_g; // none of your business :-)
  9.  = } regex_t;
  10.  = typedef struct {
  11.  =  regoff_t rm_so; // start of match
  12.  =  regoff_t rm_eo; // end of match
  13.  = } regmatch_t;
  14.  */
  15. /*
  16.  * internals of regex_t
  17.  */
  18. #ifndef __regex2_h__
  19. #define __regex2_h__
  20. #define MAGIC1 ((('r'^0200)<<8) | 'e')
  21. /*
  22.  * The internal representation is a *strip*, a sequence of
  23.  * operators ending with an endmarker.  (Some terminology etc. is a
  24.  * historical relic of earlier versions which used multiple strips.)
  25.  * Certain oddities in the representation are there to permit running
  26.  * the machinery backwards; in particular, any deviation from sequential
  27.  * flow must be marked at both its source and its destination.  Some
  28.  * fine points:
  29.  *
  30.  * - OPLUS_ and O_PLUS are *inside* the loop they create.
  31.  * - OQUEST_ and O_QUEST are *outside* the bypass they create.
  32.  * - OCH_ and O_CH are *outside* the multi-way branch they create, while
  33.  *   OOR1 and OOR2 are respectively the end and the beginning of one of
  34.  *   the branches.  Note that there is an implicit OOR2 following OCH_
  35.  *   and an implicit OOR1 preceding O_CH.
  36.  *
  37.  * In state representations, an operator's bit is on to signify a state
  38.  * immediately *preceding* "execution" of that operator.
  39.  */
  40. typedef unsigned long sop; /* strip operator */
  41. typedef long sopno;
  42. #define OPRMASK 0xf8000000
  43. #define OPDMASK 0x07ffffff
  44. #define OPSHIFT ((unsigned long)27)
  45. #define OP(n) ((unsigned long) ((n)&OPRMASK))
  46. #define OPND(n) ((unsigned long) ((n)&OPDMASK))
  47. #define SOP(op, opnd) (unsigned long) ((op)|(opnd))
  48. #define OSHIFT(A) ((unsigned long) (A) << OPSHIFT)
  49. /* operators    meaning operand */
  50. /* (back, fwd are offsets) */
  51. #define OEND OSHIFT(1) /* endmarker - */
  52. #define OCHAR OSHIFT(2) /* character unsigned char */
  53. #define OBOL OSHIFT(3) /* left anchor - */
  54. #define OEOL OSHIFT(4) /* right anchor - */
  55. #define OANY OSHIFT(5) /* . - */
  56. #define OANYOF OSHIFT(6) /* [...] set number */
  57. #define OBACK_ OSHIFT(7) /* begin d paren number */
  58. #define O_BACK OSHIFT(8) /* end d paren number */
  59. #define OPLUS_ OSHIFT(9) /* + prefix fwd to suffix */
  60. #define O_PLUS OSHIFT(10) /* + suffix back to prefix */
  61. #define OQUEST_ OSHIFT(11) /* ? prefix fwd to suffix */
  62. #define O_QUEST OSHIFT(12) /* ? suffix back to prefix */
  63. #define OLPAREN OSHIFT(13) /* ( fwd to ) */
  64. #define ORPAREN OSHIFT(14) /* ) back to ( */
  65. #define OCH_ OSHIFT(15) /* begin choice fwd to OOR2 */
  66. #define OOR1 OSHIFT(16) /* | pt. 1 back to OOR1 or OCH_ */
  67. #define OOR2 OSHIFT(17) /* | pt. 2 fwd to OOR2 or O_CH */
  68. #define O_CH OSHIFT(18) /* end choice back to OOR1 */
  69. #define OBOW OSHIFT(19) /* begin word - */
  70. #define OEOW OSHIFT(20) /* end word - */
  71. /*
  72.  * Structure for [] character-set representation.  Character sets are
  73.  * done as bit vectors, grouped 8 to a byte vector for compactness.
  74.  * The individual set therefore has both a pointer to the byte vector
  75.  * and a mask to pick out the relevant bit of each byte.  A hash code
  76.  * simplifies testing whether two sets could be identical.
  77.  *
  78.  * This will get trickier for multicharacter collating elements.  As
  79.  * preliminary hooks for dealing with such things, we also carry along
  80.  * a string of multi-character elements, and decide the size of the
  81.  * vectors at run time.
  82.  */
  83. #ifdef __WIN__
  84. typedef unsigned char uch ;
  85. #endif
  86. typedef struct {
  87. uch *ptr; /* -> uch [csetsize] */
  88. uch mask; /* bit within array */
  89. uch hash; /* hash code */
  90. size_t smultis;
  91. char *multis; /* -> char[smulti]  abcdef */
  92. } cset;
  93. /* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
  94. #define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (uch) (c))
  95. #define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (uch)(c))
  96. #define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask)
  97. #define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */
  98. #define MCsub(p, cs, cp) mcsub(p, cs, cp)
  99. #define MCin(p, cs, cp) mcin(p, cs, cp)
  100. /* stuff for character categories */
  101. typedef unsigned char cat_t;
  102. /*
  103.  * main compiled-expression structure
  104.  */
  105. struct re_guts {
  106. int magic;
  107. # define MAGIC2 ((('R'^0200)<<8)|'E')
  108. sop *strip; /* malloced area for strip */
  109. int csetsize; /* number of bits in a cset vector */
  110. int ncsets; /* number of csets in use */
  111. cset *sets; /* -> cset [ncsets] */
  112. uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
  113. int cflags; /* copy of regcomp() cflags argument */
  114. sopno nstates; /* = number of sops */
  115. sopno firststate; /* the initial OEND (normally 0) */
  116. sopno laststate; /* the final OEND */
  117. int iflags; /* internal flags */
  118. # define USEBOL 01 /* used ^ */
  119. # define USEEOL 02 /* used $ */
  120. # define BAD 04 /* something wrong */
  121. int nbol; /* number of ^ used */
  122. int neol; /* number of $ used */
  123. int ncategories; /* how many character categories */
  124. cat_t *categories; /* ->catspace[-CHAR_MIN] */
  125. char *must; /* match must contain this string */
  126. int mlen; /* length of must */
  127. size_t nsub; /* copy of re_nsub */
  128. int backrefs; /* does it use back references? */
  129. sopno nplus; /* how deep does it nest +s? */
  130. /* catspace must be last */
  131. cat_t catspace[1]; /* actually [NC] */
  132. };
  133. /* misc utilities */
  134. #undef OUT /* May be defined in windows */
  135. #define OUT (CHAR_MAX+1) /* a non-character value */
  136. #define ISWORD(s,c) (my_isalnum(s,c) || (c) == '_')
  137. #endif /* __regex2_h__ */