⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regparse.c

📁 PHP v6.0 For Linux 运行环境:Win9X/ WinME/ WinNT/ Win2K/ WinXP
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -