+#define CHECK_INTERRUPT_IN_MATCH\r
+\r
+#ifdef USE_CALLOUT\r
+typedef struct {\r
+ int last_match_at_call_counter;\r
+ struct {\r
+ OnigType type;\r
+ OnigValue val;\r
+ } slot[ONIG_CALLOUT_DATA_SLOT_NUM];\r
+} CalloutData;\r
+#endif\r
+\r
+struct OnigMatchParamStruct {\r
+ unsigned int match_stack_limit;\r
+ unsigned long retry_limit_in_match;\r
+#ifdef USE_CALLOUT\r
+ OnigCalloutFunc progress_callout_of_contents;\r
+ OnigCalloutFunc retraction_callout_of_contents;\r
+ int match_at_call_counter;\r
+ void* callout_user_data;\r
+ CalloutData* callout_data;\r
+ int callout_data_alloc_num;\r
+#endif\r
+};\r
+\r
+extern int\r
+onig_set_match_stack_limit_size_of_match_param(OnigMatchParam* param,\r
+ unsigned int limit)\r
+{\r
+ param->match_stack_limit = limit;\r
+ return ONIG_NORMAL;\r
+}\r
+\r
+extern int\r
+onig_set_retry_limit_in_match_of_match_param(OnigMatchParam* param,\r
+ unsigned long limit)\r
+{\r
+ param->retry_limit_in_match = limit;\r
+ return ONIG_NORMAL;\r
+}\r
+\r
+extern int\r
+onig_set_progress_callout_of_match_param(OnigMatchParam* param, OnigCalloutFunc f)\r
+{\r
+#ifdef USE_CALLOUT\r
+ param->progress_callout_of_contents = f;\r
+ return ONIG_NORMAL;\r
+#else\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+#endif\r
+}\r
+\r
+extern int\r
+onig_set_retraction_callout_of_match_param(OnigMatchParam* param, OnigCalloutFunc f)\r
+{\r
+#ifdef USE_CALLOUT\r
+ param->retraction_callout_of_contents = f;\r
+ return ONIG_NORMAL;\r
+#else\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+#endif\r
+}\r
+\r
+extern int\r
+onig_set_callout_user_data_of_match_param(OnigMatchParam* param, void* user_data)\r
+{\r
+#ifdef USE_CALLOUT\r
+ param->callout_user_data = user_data;\r
+ return ONIG_NORMAL;\r
+#else\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+#endif\r
+}\r
+\r
+\r
+\r
+typedef struct {\r
+ void* stack_p;\r
+ int stack_n;\r
+ OnigOptionType options;\r
+ OnigRegion* region;\r
+ int ptr_num;\r
+ const UChar* start; /* search start position (for \G: BEGIN_POSITION) */\r
+ unsigned int match_stack_limit;\r
+ unsigned long retry_limit_in_match;\r
+ OnigMatchParam* mp;\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+ int best_len; /* for ONIG_OPTION_FIND_LONGEST */\r
+ UChar* best_s;\r
+#endif\r
+} MatchArg;\r
+\r
+\r
+#ifdef ONIG_DEBUG\r
+\r
+/* arguments type */\r
+typedef enum {\r
+ ARG_SPECIAL = -1,\r
+ ARG_NON = 0,\r
+ ARG_RELADDR = 1,\r
+ ARG_ABSADDR = 2,\r
+ ARG_LENGTH = 3,\r
+ ARG_MEMNUM = 4,\r
+ ARG_OPTION = 5,\r
+ ARG_MODE = 6\r
+} OpArgType;\r
+\r
+typedef struct {\r
+ short int opcode;\r
+ char* name;\r
+ OpArgType arg_type;\r
+} OpInfoType;\r
+\r
+static OpInfoType OpInfo[] = {\r
+ { OP_FINISH, "finish", ARG_NON },\r
+ { OP_END, "end", ARG_NON },\r
+ { OP_EXACT1, "exact1", ARG_SPECIAL },\r
+ { OP_EXACT2, "exact2", ARG_SPECIAL },\r
+ { OP_EXACT3, "exact3", ARG_SPECIAL },\r
+ { OP_EXACT4, "exact4", ARG_SPECIAL },\r
+ { OP_EXACT5, "exact5", ARG_SPECIAL },\r
+ { OP_EXACTN, "exactn", ARG_SPECIAL },\r
+ { OP_EXACTMB2N1, "exactmb2-n1", ARG_SPECIAL },\r
+ { OP_EXACTMB2N2, "exactmb2-n2", ARG_SPECIAL },\r
+ { OP_EXACTMB2N3, "exactmb2-n3", ARG_SPECIAL },\r
+ { OP_EXACTMB2N, "exactmb2-n", ARG_SPECIAL },\r
+ { OP_EXACTMB3N, "exactmb3n" , ARG_SPECIAL },\r
+ { OP_EXACTMBN, "exactmbn", ARG_SPECIAL },\r
+ { OP_EXACT1_IC, "exact1-ic", ARG_SPECIAL },\r
+ { OP_EXACTN_IC, "exactn-ic", ARG_SPECIAL },\r
+ { OP_CCLASS, "cclass", ARG_SPECIAL },\r
+ { OP_CCLASS_MB, "cclass-mb", ARG_SPECIAL },\r
+ { OP_CCLASS_MIX, "cclass-mix", ARG_SPECIAL },\r
+ { OP_CCLASS_NOT, "cclass-not", ARG_SPECIAL },\r
+ { OP_CCLASS_MB_NOT, "cclass-mb-not", ARG_SPECIAL },\r
+ { OP_CCLASS_MIX_NOT, "cclass-mix-not", ARG_SPECIAL },\r
+#ifdef USE_OP_CCLASS_NODE\r
+ { OP_CCLASS_NODE, "cclass-node", ARG_SPECIAL },\r
+#endif\r
+ { OP_ANYCHAR, "anychar", ARG_NON },\r
+ { OP_ANYCHAR_ML, "anychar-ml", ARG_NON },\r
+ { OP_ANYCHAR_STAR, "anychar*", ARG_NON },\r
+ { OP_ANYCHAR_ML_STAR, "anychar-ml*", ARG_NON },\r
+ { OP_ANYCHAR_STAR_PEEK_NEXT, "anychar*-peek-next", ARG_SPECIAL },\r
+ { OP_ANYCHAR_ML_STAR_PEEK_NEXT, "anychar-ml*-peek-next", ARG_SPECIAL },\r
+ { OP_WORD, "word", ARG_NON },\r
+ { OP_WORD_ASCII, "word-ascii", ARG_NON },\r
+ { OP_NO_WORD, "not-word", ARG_NON },\r
+ { OP_NO_WORD_ASCII, "not-word-ascii", ARG_NON },\r
+ { OP_WORD_BOUNDARY, "word-boundary", ARG_MODE },\r
+ { OP_NO_WORD_BOUNDARY, "not-word-boundary", ARG_MODE },\r
+ { OP_WORD_BEGIN, "word-begin", ARG_MODE },\r
+ { OP_WORD_END, "word-end", ARG_MODE },\r
+ { OP_EXTENDED_GRAPHEME_CLUSTER_BOUNDARY, "extended-grapheme-cluster-boundary", ARG_NON },\r
+ { OP_NO_EXTENDED_GRAPHEME_CLUSTER_BOUNDARY, "no-extended-grapheme-cluster-boundary", ARG_NON },\r
+ { OP_BEGIN_BUF, "begin-buf", ARG_NON },\r
+ { OP_END_BUF, "end-buf", ARG_NON },\r
+ { OP_BEGIN_LINE, "begin-line", ARG_NON },\r
+ { OP_END_LINE, "end-line", ARG_NON },\r
+ { OP_SEMI_END_BUF, "semi-end-buf", ARG_NON },\r
+ { OP_BEGIN_POSITION, "begin-position", ARG_NON },\r
+ { OP_BACKREF1, "backref1", ARG_NON },\r
+ { OP_BACKREF2, "backref2", ARG_NON },\r
+ { OP_BACKREF_N, "backref-n", ARG_MEMNUM },\r
+ { OP_BACKREF_N_IC, "backref-n-ic", ARG_SPECIAL },\r
+ { OP_BACKREF_MULTI, "backref_multi", ARG_SPECIAL },\r
+ { OP_BACKREF_MULTI_IC, "backref_multi-ic", ARG_SPECIAL },\r
+ { OP_BACKREF_WITH_LEVEL, "backref_with_level", ARG_SPECIAL },\r
+ { OP_BACKREF_CHECK, "backref_check", ARG_SPECIAL },\r
+ { OP_BACKREF_CHECK_WITH_LEVEL, "backref_check_with_level", ARG_SPECIAL },\r
+ { OP_MEMORY_START_PUSH, "mem-start-push", ARG_MEMNUM },\r
+ { OP_MEMORY_START, "mem-start", ARG_MEMNUM },\r
+ { OP_MEMORY_END_PUSH, "mem-end-push", ARG_MEMNUM },\r
+ { OP_MEMORY_END_PUSH_REC, "mem-end-push-rec", ARG_MEMNUM },\r
+ { OP_MEMORY_END, "mem-end", ARG_MEMNUM },\r
+ { OP_MEMORY_END_REC, "mem-end-rec", ARG_MEMNUM },\r
+ { OP_FAIL, "fail", ARG_NON },\r
+ { OP_JUMP, "jump", ARG_RELADDR },\r
+ { OP_PUSH, "push", ARG_RELADDR },\r
+ { OP_PUSH_SUPER, "push-super", ARG_RELADDR },\r
+ { OP_POP_OUT, "pop-out", ARG_NON },\r
+ { OP_PUSH_OR_JUMP_EXACT1, "push-or-jump-e1", ARG_SPECIAL },\r
+ { OP_PUSH_IF_PEEK_NEXT, "push-if-peek-next", ARG_SPECIAL },\r
+ { OP_REPEAT, "repeat", ARG_SPECIAL },\r
+ { OP_REPEAT_NG, "repeat-ng", ARG_SPECIAL },\r
+ { OP_REPEAT_INC, "repeat-inc", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_NG, "repeat-inc-ng", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_SG, "repeat-inc-sg", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_NG_SG, "repeat-inc-ng-sg", ARG_MEMNUM },\r
+ { OP_EMPTY_CHECK_START, "empty-check-start", ARG_MEMNUM },\r
+ { OP_EMPTY_CHECK_END, "empty-check-end", ARG_MEMNUM },\r
+ { OP_EMPTY_CHECK_END_MEMST,"empty-check-end-memst", ARG_MEMNUM },\r
+ { OP_EMPTY_CHECK_END_MEMST_PUSH,"empty-check-end-memst-push", ARG_MEMNUM },\r
+ { OP_PREC_READ_START, "push-pos", ARG_NON },\r
+ { OP_PREC_READ_END, "pop-pos", ARG_NON },\r
+ { OP_PREC_READ_NOT_START, "prec-read-not-start", ARG_RELADDR },\r
+ { OP_PREC_READ_NOT_END, "prec-read-not-end", ARG_NON },\r
+ { OP_ATOMIC_START, "atomic-start", ARG_NON },\r
+ { OP_ATOMIC_END, "atomic-end", ARG_NON },\r
+ { OP_LOOK_BEHIND, "look-behind", ARG_SPECIAL },\r
+ { OP_LOOK_BEHIND_NOT_START, "look-behind-not-start", ARG_SPECIAL },\r
+ { OP_LOOK_BEHIND_NOT_END, "look-behind-not-end", ARG_NON },\r
+ { OP_CALL, "call", ARG_ABSADDR },\r
+ { OP_RETURN, "return", ARG_NON },\r
+ { OP_PUSH_SAVE_VAL, "push-save-val", ARG_SPECIAL },\r
+ { OP_UPDATE_VAR, "update-var", ARG_SPECIAL },\r
+#ifdef USE_CALLOUT\r
+ { OP_CALLOUT_CONTENTS, "callout-contents", ARG_SPECIAL },\r
+ { OP_CALLOUT_NAME, "callout-name", ARG_SPECIAL },\r
+#endif\r
+ { -1, "", ARG_NON }\r
+};\r
+\r
+static char*\r
+op2name(int opcode)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; OpInfo[i].opcode >= 0; i++) {\r
+ if (opcode == OpInfo[i].opcode)\r
+ return OpInfo[i].name;\r
+ }\r
+ return "";\r
+}\r
+\r
+static int\r
+op2arg_type(int opcode)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; OpInfo[i].opcode >= 0; i++) {\r
+ if (opcode == OpInfo[i].opcode)\r
+ return OpInfo[i].arg_type;\r
+ }\r
+ return ARG_SPECIAL;\r
+}\r
+\r
+static void\r
+p_string(FILE* f, int len, UChar* s)\r
+{\r
+ fputs(":", f);\r
+ while (len-- > 0) { fputc(*s++, f); }\r
+}\r
+\r
+static void\r
+p_len_string(FILE* f, LengthType len, int mb_len, UChar* s)\r
+{\r
+ int x = len * mb_len;\r
+\r
+ fprintf(f, ":%d:", len);\r
+ while (x-- > 0) { fputc(*s++, f); }\r
+}\r
+\r
+static void\r
+p_rel_addr(FILE* f, RelAddrType rel_addr, UChar* p, UChar* start)\r
+{\r
+ RelAddrType curr = (RelAddrType )(p - start);\r
+\r
+ fprintf(f, "{%d/%d}", rel_addr, curr + rel_addr);\r
+}\r
+\r
+static int\r
+bitset_on_num(BitSetRef bs)\r
+{\r
+ int i, n;\r
+\r
+ n = 0;\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (BITSET_AT(bs, i)) n++;\r
+ }\r
+ return n;\r
+}\r
+\r
+extern void\r
+onig_print_compiled_byte_code(FILE* f, UChar* bp, UChar** nextp, UChar* start,\r
+ OnigEncoding enc)\r
+{\r
+ int i, n;\r
+ OpArgType arg_type;\r
+ RelAddrType addr;\r
+ LengthType len;\r
+ MemNumType mem;\r
+ OnigCodePoint code;\r
+ OnigOptionType option;\r
+ ModeType mode;\r
+ UChar *q;\r
+\r
+ fprintf(f, "%s", op2name(*bp));\r
+ arg_type = op2arg_type(*bp);\r
+ if (arg_type != ARG_SPECIAL) {\r
+ bp++;\r
+ switch (arg_type) {\r
+ case ARG_NON:\r
+ break;\r
+ case ARG_RELADDR:\r
+ GET_RELADDR_INC(addr, bp);\r
+ fputc(':', f);\r
+ p_rel_addr(f, addr, bp, start);\r
+ break;\r
+ case ARG_ABSADDR:\r
+ GET_ABSADDR_INC(addr, bp);\r
+ fprintf(f, ":{/%d}", addr);\r
+ break;\r
+ case ARG_LENGTH:\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d", len);\r
+ break;\r
+ case ARG_MEMNUM:\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ fprintf(f, ":%d", mem);\r
+ break;\r
+ case ARG_OPTION:\r
+ {\r
+ OnigOptionType option = *((OnigOptionType* )bp);\r
+ bp += SIZE_OPTION;\r
+ fprintf(f, ":%d", option);\r
+ }\r
+ break;\r
+ case ARG_MODE:\r
+ mode = *((ModeType* )bp);\r
+ bp += SIZE_MODE;\r
+ fprintf(f, ":%d", mode);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ switch (*bp++) {\r
+ case OP_EXACT1:\r
+ case OP_ANYCHAR_STAR_PEEK_NEXT:\r
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:\r
+ p_string(f, 1, bp++); break;\r
+ case OP_EXACT2:\r
+ p_string(f, 2, bp); bp += 2; break;\r
+ case OP_EXACT3:\r
+ p_string(f, 3, bp); bp += 3; break;\r
+ case OP_EXACT4:\r
+ p_string(f, 4, bp); bp += 4; break;\r
+ case OP_EXACT5:\r
+ p_string(f, 5, bp); bp += 5; break;\r
+ case OP_EXACTN:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 1, bp);\r
+ bp += len;\r
+ break;\r
+\r
+ case OP_EXACTMB2N1:\r
+ p_string(f, 2, bp); bp += 2; break;\r
+ case OP_EXACTMB2N2:\r
+ p_string(f, 4, bp); bp += 4; break;\r
+ case OP_EXACTMB2N3:\r
+ p_string(f, 6, bp); bp += 6; break;\r
+ case OP_EXACTMB2N:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 2, bp);\r
+ bp += len * 2;\r
+ break;\r
+ case OP_EXACTMB3N:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 3, bp);\r
+ bp += len * 3;\r
+ break;\r
+ case OP_EXACTMBN:\r
+ {\r
+ int mb_len;\r
+\r
+ GET_LENGTH_INC(mb_len, bp);\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d:%d:", mb_len, len);\r
+ n = len * mb_len;\r
+ while (n-- > 0) { fputc(*bp++, f); }\r
+ }\r
+ break;\r
+\r
+ case OP_EXACT1_IC:\r
+ len = enclen(enc, bp);\r
+ p_string(f, len, bp);\r
+ bp += len;\r
+ break;\r
+ case OP_EXACTN_IC:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 1, bp);\r
+ bp += len;\r
+ break;\r
+\r
+ case OP_CCLASS:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ fprintf(f, ":%d", n);\r
+ break;\r
+\r
+ case OP_CCLASS_NOT:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ fprintf(f, ":%d", n);\r
+ break;\r
+\r
+ case OP_CCLASS_MB:\r
+ case OP_CCLASS_MB_NOT:\r
+ GET_LENGTH_INC(len, bp);\r
+ q = bp;\r
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ ALIGNMENT_RIGHT(q);\r
+#endif\r
+ GET_CODE_POINT(code, q);\r
+ bp += len;\r
+ fprintf(f, ":%d:%d", (int )code, len);\r
+ break;\r
+\r
+ case OP_CCLASS_MIX:\r
+ case OP_CCLASS_MIX_NOT:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ GET_LENGTH_INC(len, bp);\r
+ q = bp;\r
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ ALIGNMENT_RIGHT(q);\r
+#endif\r
+ GET_CODE_POINT(code, q);\r
+ bp += len;\r
+ fprintf(f, ":%d:%d:%d", n, (int )code, len);\r
+ break;\r
+\r
+#ifdef USE_OP_CCLASS_NODE\r
+ case OP_CCLASS_NODE:\r
+ {\r
+ CClassNode *cc;\r
+\r
+ GET_POINTER_INC(cc, bp);\r
+ n = bitset_on_num(cc->bs);\r
+ fprintf(f, ":%p:%d", cc, n);\r
+ }\r
+ break;\r
+#endif\r
+\r
+ case OP_BACKREF_N_IC:\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ fprintf(f, ":%d", mem);\r
+ break;\r
+\r
+ case OP_BACKREF_MULTI_IC:\r
+ case OP_BACKREF_MULTI:\r
+ case OP_BACKREF_CHECK:\r
+ fputs(" ", f);\r
+ GET_LENGTH_INC(len, bp);\r
+ for (i = 0; i < len; i++) {\r
+ GET_MEMNUM_INC(mem, bp);\r
+ if (i > 0) fputs(", ", f);\r
+ fprintf(f, "%d", mem);\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREF_WITH_LEVEL:\r
+ GET_OPTION_INC(option, bp);\r
+ fprintf(f, ":%d", option);\r
+ /* fall */\r
+ case OP_BACKREF_CHECK_WITH_LEVEL:\r
+ {\r
+ LengthType level;\r
+\r
+ GET_LENGTH_INC(level, bp);\r
+ fprintf(f, ":%d", level);\r
+\r
+ fputs(" ", f);\r
+ GET_LENGTH_INC(len, bp);\r
+ for (i = 0; i < len; i++) {\r
+ GET_MEMNUM_INC(mem, bp);\r
+ if (i > 0) fputs(", ", f);\r
+ fprintf(f, "%d", mem);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case OP_REPEAT:\r
+ case OP_REPEAT_NG:\r
+ {\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ addr = *((RelAddrType* )bp);\r
+ bp += SIZE_RELADDR;\r
+ fprintf(f, ":%d:%d", mem, addr);\r
+ }\r
+ break;\r
+\r
+ case OP_PUSH_OR_JUMP_EXACT1:\r
+ case OP_PUSH_IF_PEEK_NEXT:\r
+ addr = *((RelAddrType* )bp);\r
+ bp += SIZE_RELADDR;\r
+ fputc(':', f);\r
+ p_rel_addr(f, addr, bp, start);\r
+ p_string(f, 1, bp);\r
+ bp += 1;\r
+ break;\r
+\r
+ case OP_LOOK_BEHIND:\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d", len);\r
+ break;\r
+\r
+ case OP_LOOK_BEHIND_NOT_START:\r
+ GET_RELADDR_INC(addr, bp);\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d:", len);\r
+ p_rel_addr(f, addr, bp, start);\r
+ break;\r
+\r
+ case OP_PUSH_SAVE_VAL:\r
+ {\r
+ SaveType type;\r
+ GET_SAVE_TYPE_INC(type, bp);\r
+ GET_MEMNUM_INC(mem, bp);\r
+ fprintf(f, ":%d:%d", type, mem);\r
+ }\r
+ break;\r
+\r
+ case OP_UPDATE_VAR:\r
+ {\r
+ UpdateVarType type;\r
+ GET_UPDATE_VAR_TYPE_INC(type, bp);\r
+ GET_MEMNUM_INC(mem, bp);\r
+ fprintf(f, ":%d:%d", type, mem);\r
+ }\r
+ break;\r
+\r
+#ifdef USE_CALLOUT\r
+ case OP_CALLOUT_CONTENTS:\r
+ {\r
+ GET_MEMNUM_INC(mem, bp); /* number */\r
+ fprintf(f, ":%d", mem);\r
+ }\r
+ break;\r
+\r
+ case OP_CALLOUT_NAME:\r
+ {\r
+ int id;\r
+\r
+ GET_MEMNUM_INC(id, bp); /* id */\r
+ GET_MEMNUM_INC(mem, bp); /* number */\r
+\r
+ fprintf(f, ":%d:%d", id, mem);\r
+ }\r
+ break;\r
+#endif\r
+\r
+ default:\r
+ fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n", *--bp);\r
+ }\r
+ }\r
+ if (nextp) *nextp = bp;\r
+}\r
+#endif /* ONIG_DEBUG */\r
+\r
+#ifdef ONIG_DEBUG_COMPILE\r
+extern void\r
+onig_print_compiled_byte_code_list(FILE* f, regex_t* reg)\r
+{\r
+ UChar* bp;\r
+ UChar* start = reg->p;\r
+ UChar* end = reg->p + reg->used;\r
+\r
+ fprintf(f, "bt_mem_start: 0x%x, bt_mem_end: 0x%x\n",\r
+ reg->bt_mem_start, reg->bt_mem_end);\r
+ fprintf(f, "code-length: %d\n", reg->used);\r
+\r
+ bp = start;\r
+ while (bp < end) {\r
+ int pos = bp - start;\r
+\r
+ fprintf(f, "%4d: ", pos);\r
+ onig_print_compiled_byte_code(f, bp, &bp, start, reg->enc);\r
+ fprintf(f, "\n");\r
+ }\r
+ fprintf(f, "\n");\r
+}\r
+#endif\r
+\r
+\r