1 2 /******************************************** 3 rexp.h 4 copyright 1991, Michael D. Brennan 5 6 This is a source file for mawk, an implementation of 7 the AWK programming language. 8 9 Mawk is distributed without warranty under the terms of 10 the GNU General Public License, version 2, 1991. 11 ********************************************/ 12 13 /*$Log: rexp.h,v $ 14 * Revision 3.6 1992/01/21 17:31:45 brennan 15 * moved ison() macro out of rexp[23].c 16 * 17 * Revision 3.5 91/10/29 10:53:55 brennan 18 * SIZE_T 19 * 20 * Revision 3.4 91/08/13 09:10:02 brennan 21 * VERSION .9994 22 * 23 * Revision 3.3 91/06/15 09:40:25 brennan 24 * gcc defines __STDC__ but might not have stdlib.h 25 * 26 * Revision 3.2 91/06/10 16:18:19 brennan 27 * changes for V7 28 * 29 * Revision 3.1 91/06/07 10:33:18 brennan 30 * VERSION 0.995 31 * 32 * Revision 1.3 91/06/05 08:57:57 brennan 33 * removed RE_xmalloc() 34 * 35 * Revision 1.2 91/06/03 07:23:26 brennan 36 * changed type of RE_error_trap 37 * 38 * Revision 1.1 91/06/03 07:05:41 brennan 39 * Initial revision 40 * 41 */ 42 43 #ifndef REXP_H 44 #define REXP_H 45 46 #ifdef THINK_C 47 #define MAWK /* THINK C doesn't allow compile-time definitions */ 48 #define SIZE_T(x) (size_t)(x) 49 #endif 50 51 #ifndef SIZE_T 52 #define SIZE_T(x) (x) 53 #endif 54 55 #include <stdio.h> 56 #include <setjmp.h> 57 58 char *strchr() ; 59 60 #ifndef PROTO 61 #ifdef __STDC__ 62 #define PROTO(name, args) name args 63 #else 64 #define PROTO(name, args) name() 65 #endif 66 #endif 67 68 #ifdef __STDC__ 69 #define VOID void 70 #else 71 #define VOID char 72 #endif 73 74 VOID *malloc(), *realloc() ; 75 void free() ; 76 77 78 VOID *PROTO( RE_malloc, (unsigned) ) ; 79 VOID *PROTO( RE_realloc, (void *,unsigned) ) ; 80 81 82 /* finite machine state types */ 83 84 #define M_STR 0 85 #define M_CLASS 1 86 #define M_ANY 2 87 #define M_START 3 88 #define M_END 4 89 #define M_U 5 90 #define M_1J 6 91 #define M_2JA 7 92 #define M_2JB 8 93 #define M_ACCEPT 9 94 #define U_ON 10 95 96 #define U_OFF 0 97 #define END_OFF 0 98 #define END_ON (2*U_ON) 99 100 101 typedef unsigned char BV[32] ; /* bit vector */ 102 103 typedef struct 104 { char type ; 105 unsigned char len ; /* used for M_STR */ 106 union 107 { 108 char *str ; /* string */ 109 BV *bvp ; /* class */ 110 int jump ; 111 } data ; 112 } STATE ; 113 114 #define STATESZ (sizeof(STATE)) 115 116 typedef struct 117 { STATE *start, *stop ; } MACHINE ; 118 119 120 /* tokens */ 121 #define T_OR 1 /* | */ 122 #define T_CAT 2 123 #define T_STAR 3 /* * */ 124 #define T_PLUS 4 /* + */ 125 #define T_Q 5 /* ? */ 126 #define T_LP 6 /* ( */ 127 #define T_RP 7 /* ) */ 128 #define T_START 8 /* ^ */ 129 #define T_END 9 /* $ */ 130 #define T_ANY 10 /* . */ 131 #define T_CLASS 11 /* starts with [ */ 132 #define T_SLASH 12 /* \ */ 133 #define T_CHAR 13 /* all the rest */ 134 #define T_STR 14 135 #define T_U 15 136 137 /* precedences and error codes */ 138 #define L 0 139 #define EQ 1 140 #define G 2 141 #define E1 (-1) 142 #define E2 (-2) 143 #define E3 (-3) 144 #define E4 (-4) 145 #define E5 (-5) 146 #define E6 (-6) 147 #define E7 (-7) 148 149 #define MEMORY_FAILURE 5 150 151 #define ison(b,x) ((b)[((unsigned char)(x))>>3] & (1<<((x)&7))) 152 153 /* struct for the run time stack */ 154 typedef struct { 155 STATE *m ; /* save the machine ptr */ 156 int u ; /* save the u_flag */ 157 char *s ; /* save the active string ptr */ 158 char *ss ; /* save the match start -- only used by REmatch */ 159 } RT_STATE ; /* run time state */ 160 161 /* error trap */ 162 extern int REerrno ; 163 void PROTO(RE_error_trap, (int) ) ; 164 165 166 MACHINE PROTO( RE_u, (void) ) ; 167 MACHINE PROTO( RE_start, (void) ) ; 168 MACHINE PROTO( RE_end, (void) ) ; 169 MACHINE PROTO( RE_any, (void) ) ; 170 MACHINE PROTO( RE_str, (char *, unsigned) ) ; 171 MACHINE PROTO( RE_class, (BV *) ) ; 172 void PROTO( RE_cat, (MACHINE *, MACHINE *) ) ; 173 void PROTO( RE_or, (MACHINE *, MACHINE *) ) ; 174 void PROTO( RE_close, (MACHINE *) ) ; 175 void PROTO( RE_poscl, (MACHINE *) ) ; 176 void PROTO( RE_01, (MACHINE *) ) ; 177 void PROTO( RE_panic, (char *) ) ; 178 char *PROTO( str_str, (char *, char *, unsigned) ) ; 179 180 void PROTO( RE_lex_init , (char *) ) ; 181 int PROTO( RE_lex , (MACHINE *) ) ; 182 void PROTO( RE_run_stack_init, (void) ) ; 183 RT_STATE *PROTO( RE_new_run_stack, (void) ) ; 184 185 #endif /* REXP_H */ 186