📄 regparse.c
字号:
if (r != 0) return r; } } return 0;}extern intonig_number_of_names(regex_t* reg){ NameTable* t = (NameTable* )reg->name_table; if (IS_NOT_NULL(t)) return t->num; else return 0;}#endif /* else USE_ST_HASH_TABLE */static intname_add(regex_t* reg, UChar* name, UChar* name_end, int backref, ScanEnv* env){ int alloc; NameEntry* e; NameTable* t = (NameTable* )reg->name_table; if (name_end - name <= 0) return ONIGERR_EMPTY_GROUP_NAME; e = name_find(reg, name, name_end); if (IS_NULL(e)) {#ifdef USE_ST_HASH_TABLE if (IS_NULL(t)) { t = onig_st_init_strend_table_with_size(5); reg->name_table = (void* )t; } e = (NameEntry* )xmalloc(sizeof(NameEntry)); CHECK_NULL_RETURN_VAL(e, ONIGERR_MEMORY); e->name = strdup_with_null(reg->enc, name, name_end); if (IS_NULL(e->name)) return ONIGERR_MEMORY; onig_st_insert_strend(t, e->name, (e->name + (name_end - name)), (HashDataType )e); e->name_len = name_end - name; e->back_num = 0; e->back_alloc = 0; e->back_refs = (int* )NULL;#else if (IS_NULL(t)) { alloc = INIT_NAMES_ALLOC_NUM; t = (NameTable* )xmalloc(sizeof(NameTable)); CHECK_NULL_RETURN_VAL(t, ONIGERR_MEMORY); t->e = NULL; t->alloc = 0; t->num = 0; t->e = (NameEntry* )xmalloc(sizeof(NameEntry) * alloc); if (IS_NULL(t->e)) { xfree(t); return ONIGERR_MEMORY; } t->alloc = alloc; reg->name_table = t; goto clear; } else if (t->num == t->alloc) { int i; alloc = t->alloc * 2; t->e = (NameEntry* )xrealloc(t->e, sizeof(NameEntry) * alloc); CHECK_NULL_RETURN_VAL(t->e, ONIGERR_MEMORY); t->alloc = alloc; clear: for (i = t->num; i < t->alloc; i++) { t->e[i].name = NULL; t->e[i].name_len = 0; t->e[i].back_num = 0; t->e[i].back_alloc = 0; t->e[i].back_refs = (int* )NULL; } } e = &(t->e[t->num]); t->num++; e->name = strdup_with_null(reg->enc, name, name_end); e->name_len = name_end - name;#endif } if (e->back_num >= 1 && ! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME)) { onig_scan_env_set_error_string(env, ONIGERR_MULTIPLEX_DEFINED_NAME, name, name_end); return ONIGERR_MULTIPLEX_DEFINED_NAME; } e->back_num++; if (e->back_num == 1) { e->back_ref1 = backref; } else { if (e->back_num == 2) { alloc = INIT_NAME_BACKREFS_ALLOC_NUM; e->back_refs = (int* )xmalloc(sizeof(int) * alloc); CHECK_NULL_RETURN_VAL(e->back_refs, ONIGERR_MEMORY); e->back_alloc = alloc; e->back_refs[0] = e->back_ref1; e->back_refs[1] = backref; } else { if (e->back_num > e->back_alloc) { alloc = e->back_alloc * 2; e->back_refs = (int* )xrealloc(e->back_refs, sizeof(int) * alloc); CHECK_NULL_RETURN_VAL(e->back_refs, ONIGERR_MEMORY); e->back_alloc = alloc; } e->back_refs[e->back_num - 1] = backref; } } return 0;}extern intonig_name_to_group_numbers(regex_t* reg, const UChar* name, const UChar* name_end, int** nums){ NameEntry* e; e = name_find(reg, name, name_end); if (IS_NULL(e)) return ONIGERR_UNDEFINED_NAME_REFERENCE; switch (e->back_num) { case 0: break; case 1: *nums = &(e->back_ref1); break; default: *nums = e->back_refs; break; } return e->back_num;}extern intonig_name_to_backref_number(regex_t* reg, const UChar* name, const UChar* name_end, OnigRegion *region){ int i, n, *nums; n = onig_name_to_group_numbers(reg, name, name_end, &nums); if (n < 0) return n; else if (n == 0) return ONIGERR_PARSER_BUG; else if (n == 1) return nums[0]; else { if (IS_NOT_NULL(region)) { for (i = n - 1; i >= 0; i--) { if (region->beg[nums[i]] != ONIG_REGION_NOTPOS) return nums[i]; } } return nums[n - 1]; }}#else /* USE_NAMED_GROUP */extern intonig_name_to_group_numbers(regex_t* reg, const UChar* name, const UChar* name_end, int** nums){ return ONIG_NO_SUPPORT_CONFIG;}extern intonig_name_to_backref_number(regex_t* reg, const UChar* name, const UChar* name_end, OnigRegion* region){ return ONIG_NO_SUPPORT_CONFIG;}extern intonig_foreach_name(regex_t* reg, int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg){ return ONIG_NO_SUPPORT_CONFIG;}extern intonig_number_of_names(regex_t* reg){ return 0;}#endif /* else USE_NAMED_GROUP */#define INIT_SCANENV_MEMNODES_ALLOC_SIZE 16static voidscan_env_clear(ScanEnv* env){ int i; BIT_STATUS_CLEAR(env->capture_history); BIT_STATUS_CLEAR(env->bt_mem_start); BIT_STATUS_CLEAR(env->bt_mem_end); BIT_STATUS_CLEAR(env->backrefed_mem); env->error = (UChar* )NULL; env->error_end = (UChar* )NULL; env->num_call = 0; env->num_mem = 0;#ifdef USE_NAMED_GROUP env->num_named = 0;#endif env->mem_alloc = 0; env->mem_nodes_dynamic = (Node** )NULL; for (i = 0; i < SCANENV_MEMNODES_SIZE; i++) env->mem_nodes_static[i] = NULL_NODE;}static intscan_env_add_mem_entry(ScanEnv* env){ int i, need, alloc; Node** p; need = env->num_mem + 1; if (need >= SCANENV_MEMNODES_SIZE) { if (env->mem_alloc <= need) { if (IS_NULL(env->mem_nodes_dynamic)) { alloc = INIT_SCANENV_MEMNODES_ALLOC_SIZE; p = (Node** )xmalloc(sizeof(Node*) * alloc); xmemcpy(p, env->mem_nodes_static, sizeof(Node*) * SCANENV_MEMNODES_SIZE); } else { alloc = env->mem_alloc * 2; p = (Node** )xrealloc(env->mem_nodes_dynamic, sizeof(Node*) * alloc); } CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY); for (i = env->num_mem + 1; i < alloc; i++) p[i] = NULL_NODE; env->mem_nodes_dynamic = p; env->mem_alloc = alloc; } } env->num_mem++; return env->num_mem;}static intscan_env_set_mem_node(ScanEnv* env, int num, Node* node){ if (env->num_mem >= num) SCANENV_MEM_NODES(env)[num] = node; else return ONIGERR_PARSER_BUG; return 0;}#ifdef USE_RECYCLE_NODEtypedef struct _FreeNode { struct _FreeNode* next;} FreeNode;static FreeNode* FreeNodeList = (FreeNode* )NULL;#endifextern voidonig_node_free(Node* node){ start: if (IS_NULL(node)) return ; switch (NTYPE(node)) { case N_STRING: if (IS_NOT_NULL(NSTRING(node).s) && NSTRING(node).s != NSTRING(node).buf) { xfree(NSTRING(node).s); } break; case N_LIST: case N_ALT: onig_node_free(NCONS(node).left); /* onig_node_free(NCONS(node).right); */ { Node* next_node = NCONS(node).right;#ifdef USE_RECYCLE_NODE { FreeNode* n = (FreeNode* )node; THREAD_ATOMIC_START; n->next = FreeNodeList; FreeNodeList = n; THREAD_ATOMIC_END; }#else xfree(node);#endif node = next_node; goto start; } break; case N_CCLASS: { CClassNode* cc = &(NCCLASS(node)); if (IS_CCLASS_SHARE(cc)) return ; if (cc->mbuf) bbuf_free(cc->mbuf); } break; case N_QUALIFIER: if (NQUALIFIER(node).target) onig_node_free(NQUALIFIER(node).target); break; case N_EFFECT: if (NEFFECT(node).target) onig_node_free(NEFFECT(node).target); break; case N_BACKREF: if (IS_NOT_NULL(NBACKREF(node).back_dynamic)) xfree(NBACKREF(node).back_dynamic); break; case N_ANCHOR: if (NANCHOR(node).target) onig_node_free(NANCHOR(node).target); break; }#ifdef USE_RECYCLE_NODE { FreeNode* n = (FreeNode* )node; THREAD_ATOMIC_START; n->next = FreeNodeList; FreeNodeList = n; THREAD_ATOMIC_END; }#else xfree(node);#endif}#ifdef USE_RECYCLE_NODEextern intonig_free_node_list(){ FreeNode* n; THREAD_ATOMIC_START; while (FreeNodeList) { n = FreeNodeList; FreeNodeList = FreeNodeList->next; xfree(n); } THREAD_ATOMIC_END; return 0;}#endifstatic Node*node_new(){ Node* node;#ifdef USE_RECYCLE_NODE if (IS_NOT_NULL(FreeNodeList)) { THREAD_ATOMIC_START; node = (Node* )FreeNodeList; FreeNodeList = FreeNodeList->next; THREAD_ATOMIC_END; return node; }#endif node = (Node* )xmalloc(sizeof(Node)); return node;}static voidinitialize_cclass(CClassNode* cc){ BITSET_CLEAR(cc->bs); cc->flags = 0; cc->mbuf = NULL;}static Node*node_new_cclass(){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_CCLASS; initialize_cclass(&(NCCLASS(node))); return node;}extern Node*node_new_cclass_by_codepoint_range(int not, OnigCodePoint sbr[], OnigCodePoint mbr[]){ CClassNode* cc; int n, i, j; Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_CCLASS; cc = &(NCCLASS(node)); cc->flags = 0; if (not != 0) CCLASS_SET_NOT(cc); BITSET_CLEAR(cc->bs); if (IS_NOT_NULL(sbr)) { n = ONIGENC_CODE_RANGE_NUM(sbr); for (i = 0; i < n; i++) { for (j = ONIGENC_CODE_RANGE_FROM(sbr, i); j <= (int )ONIGENC_CODE_RANGE_TO(sbr, i); j++) { BITSET_SET_BIT(cc->bs, j); } } } if (IS_NULL(mbr)) { is_null: cc->mbuf = NULL; } else { BBuf* bbuf; n = ONIGENC_CODE_RANGE_NUM(mbr); if (n == 0) goto is_null; bbuf = (BBuf* )xmalloc(sizeof(BBuf)); CHECK_NULL_RETURN_VAL(bbuf, NULL); bbuf->alloc = n + 1; bbuf->used = n + 1; bbuf->p = (UChar* )((void* )mbr); cc->mbuf = bbuf; } return node;}static Node*node_new_ctype(int type){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_CTYPE; NCTYPE(node).type = type; return node;}static Node*node_new_anychar(){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_ANYCHAR; return node;}static Node*node_new_list(Node* left, Node* right){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_LIST; NCONS(node).left = left; NCONS(node).right = right; return node;}extern Node*onig_node_new_list(Node* left, Node* right){ return node_new_list(left, right);}static Node*node_new_alt(Node* left, Node* right){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_ALT; NCONS(node).left = left; NCONS(node).right = right; return node;}extern Node*onig_node_new_anchor(int type){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_ANCHOR; NANCHOR(node).type = type; NANCHOR(node).target = NULL; NANCHOR(node).char_len = -1; return node;}static Node*node_new_backref(int back_num, int* backrefs, int by_name, ScanEnv* env){ int i; Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_BACKREF; NBACKREF(node).state = 0; NBACKREF(node).back_num = back_num; NBACKREF(node).back_dynamic = (int* )NULL; if (by_name != 0) NBACKREF(node).state |= NST_NAME_REF; for (i = 0; i < back_num; i++) { if (backrefs[i] <= env->num_mem && IS_NULL(SCANENV_MEM_NODES(env)[backrefs[i]])) { NBACKREF(node).state |= NST_RECURSION; /* /...(\1).../ */ break; } } if (back_num <= NODE_BACKREFS_SIZE) { for (i = 0; i < back_num; i++) NBACKREF(node).back_static[i] = backrefs[i]; } else { int* p = (int* )xmalloc(sizeof(int) * back_num); if (IS_NULL(p)) { onig_node_free(node); return NULL; } NBACKREF(node).back_dynamic = p; for (i = 0; i < back_num; i++) p[i] = backrefs[i]; } return node;}#ifdef USE_SUBEXP_CALLstatic Node*node_new_call(UChar* name, UChar* name_end){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_CALL; NCALL(node).state = 0; NCALL(node).ref_num = CALLNODE_REFNUM_UNDEF; NCALL(node).target = NULL_NODE; NCALL(node).name = name; NCALL(node).name_end = name_end; return node;}#endifstatic Node*node_new_qualifier(int lower, int upper, int by_number){ Node* node = node_new(); CHECK_NULL_RETURN(node); node->type = N_QUALIFIER; NQUALIFIER(node).state = 0; NQUALIFIER(node).target = NULL; NQUALIFIER(node).lower = lower; NQUALIFIER(node).upper = upper; NQUALIFIER(node).greedy = 1; NQUALIFIER(node).by_number = by_number; NQUALIFIER(node).target_empty_info = NQ_TARGET_ISNOT_EMPTY; NQUALIFIER(node).head_exact = NULL_NODE; NQUALIFIER(node).next_head_exact = NULL_NODE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -