+typedef struct {\r
+#ifdef USE_DIRECT_THREADED_CODE\r
+ const void* opaddr;\r
+#else\r
+ enum OpCode opcode;\r
+#endif\r
+ union {\r
+ struct {\r
+ UChar s[16]; /* Now used first 7 bytes only. */\r
+ } exact;\r
+ struct {\r
+ UChar* s;\r
+ LengthType n; /* number of chars */\r
+ } exact_n; /* EXACTN, EXACTN_IC, EXACTMB2N, EXACTMB3N */\r
+ struct {\r
+ UChar* s;\r
+ LengthType n; /* number of chars */\r
+ LengthType len; /* char byte length */\r
+ } exact_len_n; /* EXACTMBN */\r
+ struct {\r
+ BitSetRef bsp;\r
+ } cclass;\r
+ struct {\r
+ void* mb;\r
+ } cclass_mb;\r
+ struct {\r
+ void* mb; /* mb must be same position with cclass_mb for match_at(). */\r
+ BitSetRef bsp;\r
+ } cclass_mix;\r
+ struct {\r
+ UChar c;\r
+ } anychar_star_peek_next;\r
+ struct {\r
+ ModeType mode;\r
+ } word_boundary; /* OP_WORD_BOUNDARY, OP_NO_WORD_BOUNDARY, OP_WORD_BEGIN, OP_WORD_END */\r
+ struct {\r
+ enum TextSegmentBoundaryType type;\r
+ int not;\r
+ } text_segment_boundary;\r
+ struct {\r
+ union {\r
+ MemNumType n1; /* num == 1 */\r
+ MemNumType* ns; /* num > 1 */\r
+ };\r
+ int num;\r
+ int nest_level;\r
+ } backref_general; /* BACKREF_MULTI, BACKREF_MULTI_IC, BACKREF_WITH_LEVEL, BACKREF_CHECK, BACKREF_CHECK_WITH_LEVEL, */\r
+ struct {\r
+ MemNumType n1;\r
+ } backref_n; /* BACKREF_N, BACKREF_N_IC */\r
+ struct {\r
+ MemNumType num;\r
+ } memory_start; /* MEMORY_START, MEMORY_START_PUSH */\r
+ struct {\r
+ MemNumType num;\r
+ } memory_end; /* MEMORY_END, MEMORY_END_REC, MEMORY_END_PUSH, MEMORY_END_PUSH_REC */\r
+ struct {\r
+ RelAddrType addr;\r
+ } jump;\r
+ struct {\r
+ RelAddrType addr;\r
+ } push;\r
+ struct {\r
+ RelAddrType addr;\r
+ UChar c;\r
+ } push_or_jump_exact1;\r
+ struct {\r
+ RelAddrType addr;\r
+ UChar c;\r
+ } push_if_peek_next;\r
+ struct {\r
+ MemNumType id;\r
+ RelAddrType addr;\r
+ } repeat; /* REPEAT, REPEAT_NG */\r
+ struct {\r
+ MemNumType id;\r
+ } repeat_inc; /* REPEAT_INC, REPEAT_INC_SG, REPEAT_INC_NG, REPEAT_INC_NG_SG */\r
+ struct {\r
+ MemNumType mem;\r
+ } empty_check_start;\r
+ struct {\r
+ MemNumType mem;\r
+ } empty_check_end; /* EMPTY_CHECK_END, EMPTY_CHECK_END_MEMST, EMPTY_CHECK_END_MEMST_PUSH */\r
+ struct {\r
+ RelAddrType addr;\r
+ } prec_read_not_start;\r
+ struct {\r
+ LengthType len;\r
+ } look_behind;\r
+ struct {\r
+ LengthType len;\r
+ RelAddrType addr;\r
+ } look_behind_not_start;\r
+ struct {\r
+ AbsAddrType addr;\r
+ } call;\r
+ struct {\r
+ SaveType type;\r
+ MemNumType id;\r
+ } push_save_val;\r
+ struct {\r
+ UpdateVarType type;\r
+ MemNumType id;\r
+ } update_var;\r
+#ifdef USE_CALLOUT\r
+ struct {\r
+ MemNumType num;\r
+ } callout_contents;\r
+ struct {\r
+ MemNumType num;\r
+ MemNumType id;\r
+ } callout_name;\r
+#endif\r
+ };\r
+} Operation;\r
+\r
+typedef struct {\r
+ const UChar* pattern;\r
+ const UChar* pattern_end;\r
+#ifdef USE_CALLOUT\r
+ void* tag_table;\r
+ int callout_num;\r
+ int callout_list_alloc;\r
+ CalloutListEntry* callout_list; /* index: callout num */\r
+#endif\r
+} RegexExt;\r
+\r
+struct re_pattern_buffer {\r
+ /* common members of BBuf(bytes-buffer) */\r
+ Operation* ops;\r
+#ifdef USE_DIRECT_THREADED_CODE\r
+ enum OpCode* ocs;\r
+#endif\r
+ Operation* ops_curr;\r
+ unsigned int ops_used; /* used space for ops */\r
+ unsigned int ops_alloc; /* allocated space for ops */\r
+ unsigned char* string_pool;\r
+ unsigned char* string_pool_end;\r
+\r
+ int num_mem; /* used memory(...) num counted from 1 */\r
+ int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */\r
+ int num_null_check; /* OP_EMPTY_CHECK_START/END id counter */\r
+ int num_call; /* number of subexp call */\r
+ unsigned int capture_history; /* (?@...) flag (1-31) */\r
+ unsigned int bt_mem_start; /* need backtrack flag */\r
+ unsigned int bt_mem_end; /* need backtrack flag */\r
+ int stack_pop_level;\r
+ int repeat_range_alloc;\r
+ OnigRepeatRange* repeat_range;\r
+\r
+ OnigEncoding enc;\r
+ OnigOptionType options;\r
+ OnigSyntaxType* syntax;\r
+ OnigCaseFoldType case_fold_flag;\r
+ void* name_table;\r
+\r
+ /* optimization info (string search, char-map and anchors) */\r
+ int optimize; /* optimize flag */\r
+ int threshold_len; /* search str-length for apply optimize */\r
+ int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */\r
+ OnigLen anchor_dmin; /* (SEMI_)END_BUF anchor distance */\r
+ OnigLen anchor_dmax; /* (SEMI_)END_BUF anchor distance */\r
+ int sub_anchor; /* start-anchor for exact or map */\r
+ unsigned char *exact;\r
+ unsigned char *exact_end;\r
+ unsigned char map[CHAR_MAP_SIZE]; /* used as BMH skip or char-map */\r
+ int map_offset;\r
+ OnigLen dmin; /* min-distance of exact or map */\r
+ OnigLen dmax; /* max-distance of exact or map */\r
+ RegexExt* extp;\r
+};\r
+\r
+#define COP(reg) ((reg)->ops_curr)\r
+#define COP_CURR_OFFSET(reg) ((reg)->ops_used - 1)\r
+#define COP_CURR_OFFSET_BYTES(reg, p) \\r
+ ((int )((char* )(&((reg)->ops_curr->p)) - (char* )((reg)->ops)))\r
+\r
+\r
+extern void onig_add_end_call(void (*func)(void));\r