1 #ifndef REGINT_H 2 #define REGINT_H 3 /********************************************************************** 4 regint.h - Oniguruma (regular expression library) 5 **********************************************************************/ 6 /*- 7 * Copyright (c) 2002-2019 K.Kosako 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 /* for debug */ 33 /* #define ONIG_DEBUG_PARSE */ 34 /* #define ONIG_DEBUG_COMPILE */ 35 /* #define ONIG_DEBUG_SEARCH */ 36 /* #define ONIG_DEBUG_MATCH */ 37 /* #define ONIG_DONT_OPTIMIZE */ 38 39 /* for byte-code statistical data. */ 40 /* #define ONIG_DEBUG_STATISTICS */ 41 42 #if defined(ONIG_DEBUG_PARSE) || defined(ONIG_DEBUG_MATCH) || \ 43 defined(ONIG_DEBUG_SEARCH) || defined(ONIG_DEBUG_COMPILE) || \ 44 defined(ONIG_DEBUG_STATISTICS) 45 #ifndef ONIG_DEBUG 46 #define ONIG_DEBUG 47 #endif 48 #endif 49 50 #ifndef ONIG_DISABLE_DIRECT_THREADING 51 #ifdef __GNUC__ 52 #define USE_GOTO_LABELS_AS_VALUES 53 #endif 54 #endif 55 56 /* config */ 57 /* spec. config */ 58 #define USE_CALL 59 #define USE_CALLOUT 60 #define USE_BACKREF_WITH_LEVEL /* \k<name+n>, \k<name-n> */ 61 #define USE_STUBBORN_CHECK_CAPTURES_IN_EMPTY_REPEAT /* /(?:()|())*\2/ */ 62 #define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE /* /\n$/ =~ "\n" */ 63 #define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR 64 #define USE_RETRY_LIMIT_IN_MATCH 65 #ifdef USE_GOTO_LABELS_AS_VALUES 66 #define USE_THREADED_CODE 67 #define USE_DIRECT_THREADED_CODE 68 #endif 69 70 /* internal config */ 71 #define USE_OP_PUSH_OR_JUMP_EXACT 72 #define USE_QUANT_PEEK_NEXT 73 #define USE_ST_LIBRARY 74 75 #define USE_WORD_BEGIN_END /* "\<", "\>" */ 76 #define USE_CAPTURE_HISTORY 77 #define USE_VARIABLE_META_CHARS 78 #define USE_POSIX_API_REGION_OPTION 79 #define USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 80 /* #define USE_REPEAT_AND_EMPTY_CHECK_LOCAL_VAR */ 81 82 83 #include "regenc.h" 84 85 #define INIT_MATCH_STACK_SIZE 160 86 #define DEFAULT_MATCH_STACK_LIMIT_SIZE 0 /* unlimited */ 87 #define DEFAULT_RETRY_LIMIT_IN_MATCH 10000000 88 #define DEFAULT_PARSE_DEPTH_LIMIT 4096 89 90 /* */ 91 /* escape other system UChar definition */ 92 #ifdef ONIG_ESCAPE_UCHAR_COLLISION 93 #undef ONIG_ESCAPE_UCHAR_COLLISION 94 #endif 95 96 #define xmalloc malloc 97 #define xrealloc realloc 98 #define xcalloc calloc 99 #define xfree free 100 101 #define st_init_table onig_st_init_table 102 #define st_init_table_with_size onig_st_init_table_with_size 103 #define st_init_numtable onig_st_init_numtable 104 #define st_init_numtable_with_size onig_st_init_numtable_with_size 105 #define st_init_strtable onig_st_init_strtable 106 #define st_init_strtable_with_size onig_st_init_strtable_with_size 107 #define st_delete onig_st_delete 108 #define st_delete_safe onig_st_delete_safe 109 #define st_insert onig_st_insert 110 #define st_lookup onig_st_lookup 111 #define st_foreach onig_st_foreach 112 #define st_add_direct onig_st_add_direct 113 #define st_free_table onig_st_free_table 114 #define st_cleanup_safe onig_st_cleanup_safe 115 #define st_copy onig_st_copy 116 #define st_nothing_key_clone onig_st_nothing_key_clone 117 #define st_nothing_key_free onig_st_nothing_key_free 118 /* */ 119 #define onig_st_is_member st_is_member 120 121 #define xmemset memset 122 #define xmemcpy memcpy 123 #define xmemmove memmove 124 125 #if defined(_WIN32) && !defined(__GNUC__) 126 #define xalloca _alloca 127 #define xvsnprintf(buf,size,fmt,args) _vsnprintf_s(buf,size,_TRUNCATE,fmt,args) 128 #define xsnprintf sprintf_s 129 #define xstrcat(dest,src,size) strcat_s(dest,size,src) 130 #else 131 #define xalloca alloca 132 #define xvsnprintf vsnprintf 133 #define xsnprintf snprintf 134 #define xstrcat(dest,src,size) strcat(dest,src) 135 #endif 136 137 138 #include <stddef.h> 139 #include <limits.h> 140 #include <stdlib.h> 141 142 #ifdef HAVE_STDINT_H 143 #include <stdint.h> 144 #endif 145 146 #if defined(HAVE_ALLOCA_H) && !defined(__GNUC__) 147 #include <alloca.h> 148 #endif 149 150 #include <string.h> 151 152 #include <ctype.h> 153 #ifdef HAVE_SYS_TYPES_H 154 #ifndef __BORLANDC__ 155 #include <sys/types.h> 156 #endif 157 #endif 158 159 #ifdef HAVE_INTTYPES_H 160 #include <inttypes.h> 161 #endif 162 163 #ifdef __BORLANDC__ 164 #include <malloc.h> 165 #endif 166 167 #ifdef ONIG_DEBUG 168 # include <stdio.h> 169 #endif 170 171 #ifdef _WIN32 172 #if defined(_MSC_VER) && (_MSC_VER < 1300) 173 typedef int intptr_t; 174 typedef unsigned int uintptr_t; 175 #endif 176 #endif 177 178 #ifdef MIN 179 #undef MIN 180 #endif 181 #ifdef MAX 182 #undef MAX 183 #endif 184 185 #define MIN(a,b) (((a)>(b))?(b):(a)) 186 #define MAX(a,b) (((a)<(b))?(b):(a)) 187 188 #define IS_NULL(p) (((void*)(p)) == (void*)0) 189 #define IS_NOT_NULL(p) (((void*)(p)) != (void*)0) 190 #define CHECK_NULL_RETURN(p) if (IS_NULL(p)) return NULL 191 #define CHECK_NULL_RETURN_MEMERR(p) if (IS_NULL(p)) return ONIGERR_MEMORY 192 #define NULL_UCHARP ((UChar* )0) 193 194 #define CHAR_MAP_SIZE 256 195 #define INFINITE_LEN ONIG_INFINITE_DISTANCE 196 197 198 #ifdef USE_CALLOUT 199 200 typedef struct { 201 int flag; 202 OnigCalloutOf of; 203 int in; 204 int name_id; 205 const UChar* tag_start; 206 const UChar* tag_end; 207 OnigCalloutType type; 208 OnigCalloutFunc start_func; 209 OnigCalloutFunc end_func; 210 union { 211 struct { 212 const UChar* start; 213 const UChar* end; 214 } content; 215 struct { 216 int num; 217 int passed_num; 218 OnigType types[ONIG_CALLOUT_MAX_ARGS_NUM]; 219 OnigValue vals[ONIG_CALLOUT_MAX_ARGS_NUM]; 220 } arg; 221 } u; 222 } CalloutListEntry; 223 224 #endif 225 226 /* stack pop level */ 227 enum StackPopLevel { 228 STACK_POP_LEVEL_FREE = 0, 229 STACK_POP_LEVEL_MEM_START = 1, 230 STACK_POP_LEVEL_ALL = 2 231 }; 232 233 /* optimize flags */ 234 enum OptimizeType { 235 OPTIMIZE_NONE = 0, 236 OPTIMIZE_STR, /* Slow Search */ 237 OPTIMIZE_STR_FAST, /* Sunday quick search / BMH */ 238 OPTIMIZE_STR_FAST_STEP_FORWARD, /* Sunday quick search / BMH */ 239 OPTIMIZE_STR_CASE_FOLD, /* Slow Search (ignore case) */ 240 OPTIMIZE_MAP /* char map */ 241 }; 242 243 /* bit status */ 244 typedef unsigned int MemStatusType; 245 246 #define MEM_STATUS_BITS_NUM (sizeof(MemStatusType) * 8) 247 #define MEM_STATUS_CLEAR(stats) (stats) = 0 248 #define MEM_STATUS_ON_ALL(stats) (stats) = ~((MemStatusType )0) 249 #define MEM_STATUS_AT(stats,n) \ 250 ((n) < (int )MEM_STATUS_BITS_NUM ? ((stats) & ((MemStatusType )1 << n)) : ((stats) & 1)) 251 #define MEM_STATUS_AT0(stats,n) \ 252 ((n) > 0 && (n) < (int )MEM_STATUS_BITS_NUM ? ((stats) & ((MemStatusType )1 << n)) : ((stats) & 1)) 253 254 #define MEM_STATUS_IS_ALL_ON(stats) (((stats) & 1) != 0) 255 256 #define MEM_STATUS_ON(stats,n) do {\ 257 if ((n) < (int )MEM_STATUS_BITS_NUM) {\ 258 if ((n) != 0)\ 259 (stats) |= ((MemStatusType )1 << (n));\ 260 }\ 261 else\ 262 (stats) |= 1;\ 263 } while (0) 264 265 #define MEM_STATUS_ON_SIMPLE(stats,n) do {\ 266 if ((n) < (int )MEM_STATUS_BITS_NUM)\ 267 (stats) |= ((MemStatusType )1 << (n));\ 268 } while (0) 269 270 #define MEM_STATUS_LIMIT_AT(stats,n) \ 271 ((n) < (int )MEM_STATUS_BITS_NUM ? ((stats) & ((MemStatusType )1 << n)) : 0) 272 #define MEM_STATUS_LIMIT_ON(stats,n) do {\ 273 if ((n) < (int )MEM_STATUS_BITS_NUM && (n) != 0) {\ 274 (stats) |= ((MemStatusType )1 << (n));\ 275 }\ 276 } while (0) 277 278 279 #define IS_CODE_WORD_ASCII(enc,code) \ 280 (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_WORD(enc,code)) 281 #define IS_CODE_DIGIT_ASCII(enc, code) \ 282 (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_DIGIT(enc,code)) 283 #define IS_CODE_XDIGIT_ASCII(enc, code) \ 284 (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_XDIGIT(enc,code)) 285 286 #define DIGITVAL(code) ((code) - '0') 287 #define ODIGITVAL(code) DIGITVAL(code) 288 #define XDIGITVAL(enc,code) \ 289 (IS_CODE_DIGIT_ASCII(enc,code) ? DIGITVAL(code) \ 290 : (ONIGENC_IS_CODE_UPPER(enc,code) ? (code) - 'A' + 10 : (code) - 'a' + 10)) 291 292 #define IS_SINGLELINE(option) ((option) & ONIG_OPTION_SINGLELINE) 293 #define IS_MULTILINE(option) ((option) & ONIG_OPTION_MULTILINE) 294 #define IS_IGNORECASE(option) ((option) & ONIG_OPTION_IGNORECASE) 295 #define IS_EXTEND(option) ((option) & ONIG_OPTION_EXTEND) 296 #define IS_FIND_LONGEST(option) ((option) & ONIG_OPTION_FIND_LONGEST) 297 #define IS_FIND_NOT_EMPTY(option) ((option) & ONIG_OPTION_FIND_NOT_EMPTY) 298 #define IS_FIND_CONDITION(option) ((option) & \ 299 (ONIG_OPTION_FIND_LONGEST | ONIG_OPTION_FIND_NOT_EMPTY)) 300 #define IS_NOTBOL(option) ((option) & ONIG_OPTION_NOTBOL) 301 #define IS_NOTEOL(option) ((option) & ONIG_OPTION_NOTEOL) 302 #define IS_POSIX_REGION(option) ((option) & ONIG_OPTION_POSIX_REGION) 303 304 #define IS_WORD_ASCII(option) \ 305 ((option) & (ONIG_OPTION_WORD_IS_ASCII | ONIG_OPTION_POSIX_IS_ASCII)) 306 #define IS_DIGIT_ASCII(option) \ 307 ((option) & (ONIG_OPTION_DIGIT_IS_ASCII | ONIG_OPTION_POSIX_IS_ASCII)) 308 #define IS_SPACE_ASCII(option) \ 309 ((option) & (ONIG_OPTION_SPACE_IS_ASCII | ONIG_OPTION_POSIX_IS_ASCII)) 310 #define IS_POSIX_ASCII(option) ((option) & ONIG_OPTION_POSIX_IS_ASCII) 311 312 #define IS_ASCII_MODE_CTYPE_OPTION(ctype, options) \ 313 ((ctype) >= 0 && \ 314 (((ctype) < ONIGENC_CTYPE_ASCII && IS_POSIX_ASCII(options)) ||\ 315 ((ctype) == ONIGENC_CTYPE_WORD && IS_WORD_ASCII(options)) ||\ 316 ((ctype) == ONIGENC_CTYPE_DIGIT && IS_DIGIT_ASCII(options)) ||\ 317 ((ctype) == ONIGENC_CTYPE_SPACE && IS_SPACE_ASCII(options)))) 318 319 #define DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag) \ 320 ((case_fold_flag) & ~INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) 321 322 #define INFINITE_REPEAT -1 323 #define IS_INFINITE_REPEAT(n) ((n) == INFINITE_REPEAT) 324 325 /* bitset */ 326 #define BITS_PER_BYTE 8 327 #define SINGLE_BYTE_SIZE (1 << BITS_PER_BYTE) 328 #define BITS_IN_ROOM 32 /* 4 * BITS_PER_BYTE */ 329 #define BITSET_SIZE (SINGLE_BYTE_SIZE / BITS_IN_ROOM) 330 331 typedef uint32_t Bits; 332 typedef Bits BitSet[BITSET_SIZE]; 333 typedef Bits* BitSetRef; 334 335 #define SIZE_BITSET sizeof(BitSet) 336 337 #define BITSET_CLEAR(bs) do {\ 338 int i;\ 339 for (i = 0; i < (int )BITSET_SIZE; i++) { (bs)[i] = 0; } \ 340 } while (0) 341 342 #define BS_ROOM(bs,pos) (bs)[(unsigned int )(pos) >> 5] 343 #define BS_BIT(pos) (1u << ((unsigned int )(pos) & 0x1f)) 344 345 #define BITSET_AT(bs, pos) (BS_ROOM(bs,pos) & BS_BIT(pos)) 346 #define BITSET_SET_BIT(bs, pos) BS_ROOM(bs,pos) |= BS_BIT(pos) 347 #define BITSET_CLEAR_BIT(bs, pos) BS_ROOM(bs,pos) &= ~(BS_BIT(pos)) 348 #define BITSET_INVERT_BIT(bs, pos) BS_ROOM(bs,pos) ^= BS_BIT(pos) 349 350 /* bytes buffer */ 351 typedef struct _BBuf { 352 UChar* p; 353 unsigned int used; 354 unsigned int alloc; 355 } BBuf; 356 357 #define BB_INIT(buf,size) bbuf_init((BBuf* )(buf), (size)) 358 359 /* 360 #define BB_SIZE_INC(buf,inc) do{\ 361 (buf)->alloc += (inc);\ 362 (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\ 363 if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\ 364 } while (0) 365 */ 366 367 #define BB_EXPAND(buf,low) do{\ 368 do { (buf)->alloc *= 2; } while ((buf)->alloc < (unsigned int )low);\ 369 (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\ 370 if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\ 371 } while (0) 372 373 #define BB_ENSURE_SIZE(buf,size) do{\ 374 unsigned int new_alloc = (buf)->alloc;\ 375 while (new_alloc < (unsigned int )(size)) { new_alloc *= 2; }\ 376 if ((buf)->alloc != new_alloc) {\ 377 (buf)->p = (UChar* )xrealloc((buf)->p, new_alloc);\ 378 if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\ 379 (buf)->alloc = new_alloc;\ 380 }\ 381 } while (0) 382 383 #define BB_WRITE(buf,pos,bytes,n) do{\ 384 int used = (pos) + (n);\ 385 if ((buf)->alloc < (unsigned int )used) BB_EXPAND((buf),used);\ 386 xmemcpy((buf)->p + (pos), (bytes), (n));\ 387 if ((buf)->used < (unsigned int )used) (buf)->used = used;\ 388 } while (0) 389 390 #define BB_WRITE1(buf,pos,byte) do{\ 391 int used = (pos) + 1;\ 392 if ((buf)->alloc < (unsigned int )used) BB_EXPAND((buf),used);\ 393 (buf)->p[(pos)] = (byte);\ 394 if ((buf)->used < (unsigned int )used) (buf)->used = used;\ 395 } while (0) 396 397 #define BB_ADD(buf,bytes,n) BB_WRITE((buf),(buf)->used,(bytes),(n)) 398 #define BB_ADD1(buf,byte) BB_WRITE1((buf),(buf)->used,(byte)) 399 #define BB_GET_ADD_ADDRESS(buf) ((buf)->p + (buf)->used) 400 #define BB_GET_OFFSET_POS(buf) ((buf)->used) 401 402 /* from < to */ 403 #define BB_MOVE_RIGHT(buf,from,to,n) do {\ 404 if ((unsigned int )((to)+(n)) > (buf)->alloc) BB_EXPAND((buf),(to) + (n));\ 405 xmemmove((buf)->p + (to), (buf)->p + (from), (n));\ 406 if ((unsigned int )((to)+(n)) > (buf)->used) (buf)->used = (to) + (n);\ 407 } while (0) 408 409 /* from > to */ 410 #define BB_MOVE_LEFT(buf,from,to,n) do {\ 411 xmemmove((buf)->p + (to), (buf)->p + (from), (n));\ 412 } while (0) 413 414 /* from > to */ 415 #define BB_MOVE_LEFT_REDUCE(buf,from,to) do {\ 416 xmemmove((buf)->p + (to), (buf)->p + (from), (buf)->used - (from));\ 417 (buf)->used -= (from - to);\ 418 } while (0) 419 420 #define BB_INSERT(buf,pos,bytes,n) do {\ 421 if (pos >= (buf)->used) {\ 422 BB_WRITE(buf,pos,bytes,n);\ 423 }\ 424 else {\ 425 BB_MOVE_RIGHT((buf),(pos),(pos) + (n),((buf)->used - (pos)));\ 426 xmemcpy((buf)->p + (pos), (bytes), (n));\ 427 }\ 428 } while (0) 429 430 #define BB_GET_BYTE(buf, pos) (buf)->p[(pos)] 431 432 433 /* has body */ 434 #define ANCR_PREC_READ (1<<0) 435 #define ANCR_PREC_READ_NOT (1<<1) 436 #define ANCR_LOOK_BEHIND (1<<2) 437 #define ANCR_LOOK_BEHIND_NOT (1<<3) 438 /* no body */ 439 #define ANCR_BEGIN_BUF (1<<4) 440 #define ANCR_BEGIN_LINE (1<<5) 441 #define ANCR_BEGIN_POSITION (1<<6) 442 #define ANCR_END_BUF (1<<7) 443 #define ANCR_SEMI_END_BUF (1<<8) 444 #define ANCR_END_LINE (1<<9) 445 #define ANCR_WORD_BOUNDARY (1<<10) 446 #define ANCR_NO_WORD_BOUNDARY (1<<11) 447 #define ANCR_WORD_BEGIN (1<<12) 448 #define ANCR_WORD_END (1<<13) 449 #define ANCR_ANYCHAR_INF (1<<14) 450 #define ANCR_ANYCHAR_INF_ML (1<<15) 451 #define ANCR_TEXT_SEGMENT_BOUNDARY (1<<16) 452 #define ANCR_NO_TEXT_SEGMENT_BOUNDARY (1<<17) 453 454 455 #define ANCHOR_HAS_BODY(a) ((a)->type < ANCR_BEGIN_BUF) 456 457 #define IS_WORD_ANCHOR_TYPE(type) \ 458 ((type) == ANCR_WORD_BOUNDARY || (type) == ANCR_NO_WORD_BOUNDARY || \ 459 (type) == ANCR_WORD_BEGIN || (type) == ANCR_WORD_END) 460 461 /* operation code */ 462 enum OpCode { 463 OP_FINISH = 0, /* matching process terminator (no more alternative) */ 464 OP_END = 1, /* pattern code terminator (success end) */ 465 OP_STR_1 = 2, /* single byte, N = 1 */ 466 OP_STR_2, /* single byte, N = 2 */ 467 OP_STR_3, /* single byte, N = 3 */ 468 OP_STR_4, /* single byte, N = 4 */ 469 OP_STR_5, /* single byte, N = 5 */ 470 OP_STR_N, /* single byte */ 471 OP_STR_MB2N1, /* mb-length = 2 N = 1 */ 472 OP_STR_MB2N2, /* mb-length = 2 N = 2 */ 473 OP_STR_MB2N3, /* mb-length = 2 N = 3 */ 474 OP_STR_MB2N, /* mb-length = 2 */ 475 OP_STR_MB3N, /* mb-length = 3 */ 476 OP_STR_MBN, /* other length */ 477 OP_STR_1_IC, /* single byte, N = 1, ignore case */ 478 OP_STR_N_IC, /* single byte, ignore case */ 479 OP_CCLASS, 480 OP_CCLASS_MB, 481 OP_CCLASS_MIX, 482 OP_CCLASS_NOT, 483 OP_CCLASS_MB_NOT, 484 OP_CCLASS_MIX_NOT, 485 OP_ANYCHAR, /* "." */ 486 OP_ANYCHAR_ML, /* "." multi-line */ 487 OP_ANYCHAR_STAR, /* ".*" */ 488 OP_ANYCHAR_ML_STAR, /* ".*" multi-line */ 489 OP_ANYCHAR_STAR_PEEK_NEXT, 490 OP_ANYCHAR_ML_STAR_PEEK_NEXT, 491 OP_WORD, 492 OP_WORD_ASCII, 493 OP_NO_WORD, 494 OP_NO_WORD_ASCII, 495 OP_WORD_BOUNDARY, 496 OP_NO_WORD_BOUNDARY, 497 OP_WORD_BEGIN, 498 OP_WORD_END, 499 OP_TEXT_SEGMENT_BOUNDARY, 500 OP_BEGIN_BUF, 501 OP_END_BUF, 502 OP_BEGIN_LINE, 503 OP_END_LINE, 504 OP_SEMI_END_BUF, 505 OP_BEGIN_POSITION, 506 OP_BACKREF1, 507 OP_BACKREF2, 508 OP_BACKREF_N, 509 OP_BACKREF_N_IC, 510 OP_BACKREF_MULTI, 511 OP_BACKREF_MULTI_IC, 512 OP_BACKREF_WITH_LEVEL, /* \k<xxx+n>, \k<xxx-n> */ 513 OP_BACKREF_WITH_LEVEL_IC, /* \k<xxx+n>, \k<xxx-n> */ 514 OP_BACKREF_CHECK, /* (?(n)), (?('name')) */ 515 OP_BACKREF_CHECK_WITH_LEVEL, /* (?(n-level)), (?('name-level')) */ 516 OP_MEM_START, 517 OP_MEM_START_PUSH, /* push back-tracker to stack */ 518 OP_MEM_END_PUSH, /* push back-tracker to stack */ 519 #ifdef USE_CALL 520 OP_MEM_END_PUSH_REC, /* push back-tracker to stack */ 521 #endif 522 OP_MEM_END, 523 #ifdef USE_CALL 524 OP_MEM_END_REC, /* push marker to stack */ 525 #endif 526 OP_FAIL, /* pop stack and move */ 527 OP_JUMP, 528 OP_PUSH, 529 OP_PUSH_SUPER, 530 OP_POP_OUT, 531 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 532 OP_PUSH_OR_JUMP_EXACT1, /* if match exact then push, else jump. */ 533 #endif 534 OP_PUSH_IF_PEEK_NEXT, /* if match exact then push, else none. */ 535 OP_REPEAT, /* {n,m} */ 536 OP_REPEAT_NG, /* {n,m}? (non greedy) */ 537 OP_REPEAT_INC, 538 OP_REPEAT_INC_NG, /* non greedy */ 539 OP_EMPTY_CHECK_START, /* null loop checker start */ 540 OP_EMPTY_CHECK_END, /* null loop checker end */ 541 OP_EMPTY_CHECK_END_MEMST, /* null loop checker end (with capture status) */ 542 #ifdef USE_CALL 543 OP_EMPTY_CHECK_END_MEMST_PUSH, /* with capture status and push check-end */ 544 #endif 545 OP_PREC_READ_START, /* (?=...) start */ 546 OP_PREC_READ_END, /* (?=...) end */ 547 OP_PREC_READ_NOT_START, /* (?!...) start */ 548 OP_PREC_READ_NOT_END, /* (?!...) end */ 549 OP_ATOMIC_START, /* (?>...) start */ 550 OP_ATOMIC_END, /* (?>...) end */ 551 OP_LOOK_BEHIND, /* (?<=...) start (no needs end opcode) */ 552 OP_LOOK_BEHIND_NOT_START, /* (?<!...) start */ 553 OP_LOOK_BEHIND_NOT_END, /* (?<!...) end */ 554 OP_PUSH_SAVE_VAL, 555 OP_UPDATE_VAR, 556 #ifdef USE_CALL 557 OP_CALL, /* \g<name> */ 558 OP_RETURN, 559 #endif 560 #ifdef USE_CALLOUT 561 OP_CALLOUT_CONTENTS, /* (?{...}) (?{{...}}) */ 562 OP_CALLOUT_NAME, /* (*name) (*name[tag](args...)) */ 563 #endif 564 }; 565 566 enum SaveType { 567 SAVE_KEEP = 0, /* SAVE S */ 568 SAVE_S = 1, 569 SAVE_RIGHT_RANGE = 2, 570 }; 571 572 enum UpdateVarType { 573 UPDATE_VAR_KEEP_FROM_STACK_LAST = 0, 574 UPDATE_VAR_S_FROM_STACK = 1, 575 UPDATE_VAR_RIGHT_RANGE_FROM_STACK = 2, 576 UPDATE_VAR_RIGHT_RANGE_FROM_S_STACK = 3, 577 UPDATE_VAR_RIGHT_RANGE_INIT = 4, 578 }; 579 580 enum TextSegmentBoundaryType { 581 EXTENDED_GRAPHEME_CLUSTER_BOUNDARY = 0, 582 WORD_BOUNDARY = 1, 583 }; 584 585 typedef int RelAddrType; 586 typedef int AbsAddrType; 587 typedef int LengthType; 588 typedef int RepeatNumType; 589 typedef int MemNumType; 590 typedef void* PointerType; 591 typedef int SaveType; 592 typedef int UpdateVarType; 593 typedef int ModeType; 594 595 #define SIZE_OPCODE 1 596 #define SIZE_RELADDR sizeof(RelAddrType) 597 #define SIZE_ABSADDR sizeof(AbsAddrType) 598 #define SIZE_LENGTH sizeof(LengthType) 599 #define SIZE_MEMNUM sizeof(MemNumType) 600 #define SIZE_REPEATNUM sizeof(RepeatNumType) 601 #define SIZE_OPTION sizeof(OnigOptionType) 602 #define SIZE_CODE_POINT sizeof(OnigCodePoint) 603 #define SIZE_POINTER sizeof(PointerType) 604 #define SIZE_SAVE_TYPE sizeof(SaveType) 605 #define SIZE_UPDATE_VAR_TYPE sizeof(UpdateVarType) 606 #define SIZE_MODE sizeof(ModeType) 607 608 /* code point's address must be aligned address. */ 609 #define GET_CODE_POINT(code,p) code = *((OnigCodePoint* )(p)) 610 611 612 /* op-code + arg size */ 613 614 /* for relative address increment to go next op. */ 615 #define SIZE_INC 1 616 617 #define OPSIZE_ANYCHAR_STAR 1 618 #define OPSIZE_ANYCHAR_STAR_PEEK_NEXT 1 619 #define OPSIZE_JUMP 1 620 #define OPSIZE_PUSH 1 621 #define OPSIZE_PUSH_SUPER 1 622 #define OPSIZE_POP_OUT 1 623 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 624 #define OPSIZE_PUSH_OR_JUMP_EXACT1 1 625 #endif 626 #define OPSIZE_PUSH_IF_PEEK_NEXT 1 627 #define OPSIZE_REPEAT 1 628 #define OPSIZE_REPEAT_INC 1 629 #define OPSIZE_REPEAT_INC_NG 1 630 #define OPSIZE_WORD_BOUNDARY 1 631 #define OPSIZE_PREC_READ_START 1 632 #define OPSIZE_PREC_READ_NOT_START 1 633 #define OPSIZE_PREC_READ_END 1 634 #define OPSIZE_PREC_READ_NOT_END 1 635 #define OPSIZE_BACKREF 1 636 #define OPSIZE_FAIL 1 637 #define OPSIZE_MEM_START 1 638 #define OPSIZE_MEM_START_PUSH 1 639 #define OPSIZE_MEM_END_PUSH 1 640 #define OPSIZE_MEM_END_PUSH_REC 1 641 #define OPSIZE_MEM_END 1 642 #define OPSIZE_MEM_END_REC 1 643 #define OPSIZE_ATOMIC_START 1 644 #define OPSIZE_ATOMIC_END 1 645 #define OPSIZE_EMPTY_CHECK_START 1 646 #define OPSIZE_EMPTY_CHECK_END 1 647 #define OPSIZE_LOOK_BEHIND 1 648 #define OPSIZE_LOOK_BEHIND_NOT_START 1 649 #define OPSIZE_LOOK_BEHIND_NOT_END 1 650 #define OPSIZE_CALL 1 651 #define OPSIZE_RETURN 1 652 #define OPSIZE_PUSH_SAVE_VAL 1 653 #define OPSIZE_UPDATE_VAR 1 654 655 #ifdef USE_CALLOUT 656 #define OPSIZE_CALLOUT_CONTENTS 1 657 #define OPSIZE_CALLOUT_NAME 1 658 #endif 659 660 661 #define MC_ESC(syn) (syn)->meta_char_table.esc 662 #define MC_ANYCHAR(syn) (syn)->meta_char_table.anychar 663 #define MC_ANYTIME(syn) (syn)->meta_char_table.anytime 664 #define MC_ZERO_OR_ONE_TIME(syn) (syn)->meta_char_table.zero_or_one_time 665 #define MC_ONE_OR_MORE_TIME(syn) (syn)->meta_char_table.one_or_more_time 666 #define MC_ANYCHAR_ANYTIME(syn) (syn)->meta_char_table.anychar_anytime 667 668 #define IS_MC_ESC_CODE(code, syn) \ 669 ((code) == MC_ESC(syn) && \ 670 !IS_SYNTAX_OP2((syn), ONIG_SYN_OP2_INEFFECTIVE_ESCAPE)) 671 672 673 #define SYN_POSIX_COMMON_OP \ 674 ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_POSIX_BRACKET | \ 675 ONIG_SYN_OP_DECIMAL_BACKREF | \ 676 ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_ASTERISK_ZERO_INF | \ 677 ONIG_SYN_OP_LINE_ANCHOR | \ 678 ONIG_SYN_OP_ESC_CONTROL_CHARS ) 679 680 #define SYN_GNU_REGEX_OP \ 681 ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | \ 682 ONIG_SYN_OP_POSIX_BRACKET | ONIG_SYN_OP_DECIMAL_BACKREF | \ 683 ONIG_SYN_OP_BRACE_INTERVAL | ONIG_SYN_OP_LPAREN_SUBEXP | \ 684 ONIG_SYN_OP_VBAR_ALT | \ 685 ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF | \ 686 ONIG_SYN_OP_QMARK_ZERO_ONE | \ 687 ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR | ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR | \ 688 ONIG_SYN_OP_ESC_W_WORD | \ 689 ONIG_SYN_OP_ESC_B_WORD_BOUND | ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | \ 690 ONIG_SYN_OP_ESC_S_WHITE_SPACE | ONIG_SYN_OP_ESC_D_DIGIT | \ 691 ONIG_SYN_OP_LINE_ANCHOR ) 692 693 #define SYN_GNU_REGEX_BV \ 694 ( ONIG_SYN_CONTEXT_INDEP_ANCHORS | ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | \ 695 ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS | ONIG_SYN_ALLOW_INVALID_INTERVAL | \ 696 ONIG_SYN_BACKSLASH_ESCAPE_IN_CC | ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC ) 697 698 699 #define NCCLASS_FLAGS(cc) ((cc)->flags) 700 #define NCCLASS_FLAG_SET(cc,flag) (NCCLASS_FLAGS(cc) |= (flag)) 701 #define NCCLASS_FLAG_CLEAR(cc,flag) (NCCLASS_FLAGS(cc) &= ~(flag)) 702 #define IS_NCCLASS_FLAG_ON(cc,flag) ((NCCLASS_FLAGS(cc) & (flag)) != 0) 703 704 /* cclass node */ 705 #define FLAG_NCCLASS_NOT (1<<0) 706 #define FLAG_NCCLASS_SHARE (1<<1) 707 708 #define NCCLASS_SET_NOT(nd) NCCLASS_FLAG_SET(nd, FLAG_NCCLASS_NOT) 709 #define NCCLASS_CLEAR_NOT(nd) NCCLASS_FLAG_CLEAR(nd, FLAG_NCCLASS_NOT) 710 #define IS_NCCLASS_NOT(nd) IS_NCCLASS_FLAG_ON(nd, FLAG_NCCLASS_NOT) 711 712 713 typedef struct { 714 #ifdef USE_DIRECT_THREADED_CODE 715 const void* opaddr; 716 #else 717 enum OpCode opcode; 718 #endif 719 union { 720 struct { 721 UChar s[16]; /* Now used first 7 bytes only. */ 722 } exact; 723 struct { 724 UChar* s; 725 LengthType n; /* number of chars */ 726 } exact_n; /* EXACTN, EXACTN_IC, EXACTMB2N, EXACTMB3N */ 727 struct { 728 UChar* s; 729 LengthType n; /* number of chars */ 730 LengthType len; /* char byte length */ 731 } exact_len_n; /* EXACTMBN */ 732 struct { 733 BitSetRef bsp; 734 } cclass; 735 struct { 736 void* mb; 737 } cclass_mb; 738 struct { 739 void* mb; /* mb must be same position with cclass_mb for match_at(). */ 740 BitSetRef bsp; 741 } cclass_mix; 742 struct { 743 UChar c; 744 } anychar_star_peek_next; 745 struct { 746 ModeType mode; 747 } word_boundary; /* OP_WORD_BOUNDARY, OP_NO_WORD_BOUNDARY, OP_WORD_BEGIN, OP_WORD_END */ 748 struct { 749 enum TextSegmentBoundaryType type; 750 int not; 751 } text_segment_boundary; 752 struct { 753 union { 754 MemNumType n1; /* num == 1 */ 755 MemNumType* ns; /* num > 1 */ 756 }; 757 int num; 758 int nest_level; 759 } backref_general; /* BACKREF_MULTI, BACKREF_MULTI_IC, BACKREF_WITH_LEVEL, BACKREF_CHECK, BACKREF_CHECK_WITH_LEVEL, */ 760 struct { 761 MemNumType n1; 762 } backref_n; /* BACKREF_N, BACKREF_N_IC */ 763 struct { 764 MemNumType num; 765 } memory_start; /* MEMORY_START, MEMORY_START_PUSH */ 766 struct { 767 MemNumType num; 768 } memory_end; /* MEMORY_END, MEMORY_END_REC, MEMORY_END_PUSH, MEMORY_END_PUSH_REC */ 769 struct { 770 RelAddrType addr; 771 } jump; 772 struct { 773 RelAddrType addr; 774 } push; 775 struct { 776 RelAddrType addr; 777 UChar c; 778 } push_or_jump_exact1; 779 struct { 780 RelAddrType addr; 781 UChar c; 782 } push_if_peek_next; 783 struct { 784 MemNumType id; 785 RelAddrType addr; 786 } repeat; /* REPEAT, REPEAT_NG */ 787 struct { 788 MemNumType id; 789 } repeat_inc; /* REPEAT_INC, REPEAT_INC_NG */ 790 struct { 791 MemNumType mem; 792 } empty_check_start; 793 struct { 794 MemNumType mem; 795 } empty_check_end; /* EMPTY_CHECK_END, EMPTY_CHECK_END_MEMST, EMPTY_CHECK_END_MEMST_PUSH */ 796 struct { 797 RelAddrType addr; 798 } prec_read_not_start; 799 struct { 800 LengthType len; 801 } look_behind; 802 struct { 803 LengthType len; 804 RelAddrType addr; 805 } look_behind_not_start; 806 struct { 807 AbsAddrType addr; 808 } call; 809 struct { 810 SaveType type; 811 MemNumType id; 812 } push_save_val; 813 struct { 814 UpdateVarType type; 815 MemNumType id; 816 } update_var; 817 #ifdef USE_CALLOUT 818 struct { 819 MemNumType num; 820 } callout_contents; 821 struct { 822 MemNumType num; 823 MemNumType id; 824 } callout_name; 825 #endif 826 }; 827 } Operation; 828 829 typedef struct { 830 const UChar* pattern; 831 const UChar* pattern_end; 832 #ifdef USE_CALLOUT 833 void* tag_table; 834 int callout_num; 835 int callout_list_alloc; 836 CalloutListEntry* callout_list; /* index: callout num */ 837 #endif 838 } RegexExt; 839 840 typedef struct { 841 int lower; 842 int upper; 843 union { 844 Operation* pcode; /* address of repeated body */ 845 int offset; 846 } u; 847 } RepeatRange; 848 849 struct re_pattern_buffer { 850 /* common members of BBuf(bytes-buffer) */ 851 Operation* ops; 852 #ifdef USE_DIRECT_THREADED_CODE 853 enum OpCode* ocs; 854 #endif 855 Operation* ops_curr; 856 unsigned int ops_used; /* used space for ops */ 857 unsigned int ops_alloc; /* allocated space for ops */ 858 unsigned char* string_pool; 859 unsigned char* string_pool_end; 860 861 int num_mem; /* used memory(...) num counted from 1 */ 862 int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */ 863 int num_empty_check; /* OP_EMPTY_CHECK_START/END id counter */ 864 int num_call; /* number of subexp call */ 865 MemStatusType capture_history; /* (?@...) flag (1-31) */ 866 MemStatusType push_mem_start; /* need backtrack flag */ 867 MemStatusType push_mem_end; /* need backtrack flag */ 868 MemStatusType empty_status_mem; 869 int stack_pop_level; 870 int repeat_range_alloc; 871 RepeatRange* repeat_range; 872 873 OnigEncoding enc; 874 OnigOptionType options; 875 OnigSyntaxType* syntax; 876 OnigCaseFoldType case_fold_flag; 877 void* name_table; 878 879 /* optimization info (string search, char-map and anchors) */ 880 int optimize; /* optimize flag */ 881 int threshold_len; /* search str-length for apply optimize */ 882 int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */ 883 OnigLen anc_dist_min; /* (SEMI_)END_BUF anchor distance */ 884 OnigLen anc_dist_max; /* (SEMI_)END_BUF anchor distance */ 885 int sub_anchor; /* start-anchor for exact or map */ 886 unsigned char *exact; 887 unsigned char *exact_end; 888 unsigned char map[CHAR_MAP_SIZE]; /* used as BMH skip or char-map */ 889 int map_offset; 890 OnigLen dist_min; /* min-distance of exact or map */ 891 OnigLen dist_max; /* max-distance of exact or map */ 892 RegexExt* extp; 893 }; 894 895 #define COP(reg) ((reg)->ops_curr) 896 #define COP_CURR_OFFSET(reg) ((reg)->ops_used - 1) 897 #define COP_CURR_OFFSET_BYTES(reg, p) \ 898 ((int )((char* )(&((reg)->ops_curr->p)) - (char* )((reg)->ops))) 899 900 901 extern void onig_add_end_call(void (*func)(void)); 902 903 #ifdef ONIG_DEBUG 904 905 #ifdef ONIG_DEBUG_COMPILE 906 extern void onig_print_compiled_byte_code_list(FILE* f, regex_t* reg); 907 #endif 908 909 #ifdef ONIG_DEBUG_STATISTICS 910 extern void onig_statistics_init P_((void)); 911 extern int onig_print_statistics P_((FILE* f)); 912 #endif 913 #endif 914 915 extern void onig_warning(const char* s); 916 extern UChar* onig_error_code_to_format P_((int code)); 917 extern void onig_snprintf_with_pattern PV_((UChar buf[], int bufsize, OnigEncoding enc, UChar* pat, UChar* pat_end, const UChar *fmt, ...)); 918 extern int onig_compile P_((regex_t* reg, const UChar* pattern, const UChar* pattern_end, OnigErrorInfo* einfo)); 919 extern int onig_is_code_in_cc_len P_((int enclen, OnigCodePoint code, void* /* CClassNode* */ cc)); 920 extern RegexExt* onig_get_regex_ext(regex_t* reg); 921 extern int onig_ext_set_pattern(regex_t* reg, const UChar* pattern, const UChar* pattern_end); 922 extern int onig_positive_int_multiply(int x, int y); 923 924 #ifdef USE_CALLOUT 925 926 extern OnigCalloutType onig_get_callout_type_by_name_id(int name_id); 927 extern OnigCalloutFunc onig_get_callout_start_func_by_name_id(int id); 928 extern OnigCalloutFunc onig_get_callout_end_func_by_name_id(int id); 929 extern int onig_callout_tag_table_free(void* table); 930 extern void onig_free_reg_callout_list(int n, CalloutListEntry* list); 931 extern CalloutListEntry* onig_reg_callout_list_at(regex_t* reg, int num); 932 extern OnigCalloutFunc onig_get_callout_start_func(regex_t* reg, int callout_num); 933 934 /* for definition of builtin callout */ 935 #define BC0_P(name, func) do {\ 936 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 937 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 938 (UChar* )(name), (UChar* )((name) + len),\ 939 ONIG_CALLOUT_IN_PROGRESS,\ 940 onig_builtin_ ## func, 0, 0, 0, 0, 0);\ 941 if (id < 0) return id;\ 942 } while(0) 943 944 #define BC0_R(name, func) do {\ 945 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 946 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 947 (UChar* )(name), (UChar* )((name) + len),\ 948 ONIG_CALLOUT_IN_RETRACTION,\ 949 onig_builtin_ ## func, 0, 0, 0, 0, 0);\ 950 if (id < 0) return id;\ 951 } while(0) 952 953 #define BC0_B(name, func) do {\ 954 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 955 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 956 (UChar* )(name), (UChar* )((name) + len),\ 957 ONIG_CALLOUT_IN_BOTH,\ 958 onig_builtin_ ## func, 0, 0, 0, 0, 0);\ 959 if (id < 0) return id;\ 960 } while(0) 961 962 #define BC_P(name, func, na, ts) do {\ 963 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 964 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 965 (UChar* )(name), (UChar* )((name) + len),\ 966 ONIG_CALLOUT_IN_PROGRESS,\ 967 onig_builtin_ ## func, 0, (na), (ts), 0, 0); \ 968 if (id < 0) return id;\ 969 } while(0) 970 971 #define BC_P_O(name, func, nts, ts, nopts, opts) do {\ 972 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 973 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 974 (UChar* )(name), (UChar* )((name) + len),\ 975 ONIG_CALLOUT_IN_PROGRESS,\ 976 onig_builtin_ ## func, 0, (nts), (ts), (nopts), (opts));\ 977 if (id < 0) return id;\ 978 } while(0) 979 980 #define BC_B(name, func, na, ts) do {\ 981 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 982 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 983 (UChar* )(name), (UChar* )((name) + len),\ 984 ONIG_CALLOUT_IN_BOTH,\ 985 onig_builtin_ ## func, 0, (na), (ts), 0, 0);\ 986 if (id < 0) return id;\ 987 } while(0) 988 989 #define BC_B_O(name, func, nts, ts, nopts, opts) do {\ 990 int len = onigenc_str_bytelen_null(enc, (UChar* )name);\ 991 id = onig_set_callout_of_name(enc, ONIG_CALLOUT_TYPE_SINGLE,\ 992 (UChar* )(name), (UChar* )((name) + len),\ 993 ONIG_CALLOUT_IN_BOTH,\ 994 onig_builtin_ ## func, 0, (nts), (ts), (nopts), (opts));\ 995 if (id < 0) return id;\ 996 } while(0) 997 998 #endif /* USE_CALLOUT */ 999 1000 1001 /* strend hash */ 1002 typedef void hash_table_type; 1003 1004 #ifdef _WIN32 1005 # include <windows.h> 1006 typedef ULONG_PTR hash_data_type; 1007 #else 1008 typedef unsigned long hash_data_type; 1009 #endif 1010 1011 extern hash_table_type* onig_st_init_strend_table_with_size P_((int size)); 1012 extern int onig_st_lookup_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type *value)); 1013 extern int onig_st_insert_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type value)); 1014 1015 typedef int (*ONIGENC_INIT_PROPERTY_LIST_FUNC_TYPE)(void); 1016 1017 #endif /* REGINT_H */ 1018