]> git.saurik.com Git - apple/libc.git/blobdiff - regex/TRE/lib/tre-compile.c
Libc-997.90.3.tar.gz
[apple/libc.git] / regex / TRE / lib / tre-compile.c
index f9ee7d9801eac464e5d14384d99c48d217462657..46621892996624d06b9dfa76f8e87c328a620620 100644 (file)
@@ -931,7 +931,7 @@ do_addtags_recurse:
 
                    u = tre_mem_calloc(mem, sizeof(tre_last_matched_pre_t) +
                                       sizeof(tre_last_matched_branch_pre_t)
 
                    u = tre_mem_calloc(mem, sizeof(tre_last_matched_pre_t) +
                                       sizeof(tre_last_matched_branch_pre_t)
-                                      + bitstr_size(num_tags));
+                                      + bitstr_size(tnfa->num_tags));
                    if (!u)
                      {
                        status = REG_ESPACE;
                    if (!u)
                      {
                        status = REG_ESPACE;
@@ -1234,7 +1234,7 @@ do_addtags_recurse:
            node = tre_stack_pop_voidptr(stack);
            start_tag = tre_stack_pop_int(stack);
            b = tre_mem_calloc(mem, sizeof(tre_last_matched_branch_pre_t)
            node = tre_stack_pop_voidptr(stack);
            start_tag = tre_stack_pop_int(stack);
            b = tre_mem_calloc(mem, sizeof(tre_last_matched_branch_pre_t)
-                              + bitstr_size(num_tags));
+                              + bitstr_size(tnfa->num_tags));
            if (!b)
              {
                status = REG_ESPACE;
            if (!b)
              {
                status = REG_ESPACE;
@@ -3144,6 +3144,7 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags,
   if (errcode != REG_OK)
     ERROR_EXIT(errcode);
 
   if (errcode != REG_OK)
     ERROR_EXIT(errcode);
 
+#ifdef USE_FIRSTPOS_CHARS /* not defined */
   /* If in eight bit mode, compute a table of characters that can be the
      first character of a match. */
   tnfa->first_char = -1;
   /* If in eight bit mode, compute a table of characters that can be the
      first character of a match. */
   tnfa->first_char = -1;
@@ -3189,7 +3190,38 @@ tre_compile(regex_t *preg, const tre_char_t *regex, size_t n, int cflags,
     }
   else
     tnfa->firstpos_chars = NULL;
     }
   else
     tnfa->firstpos_chars = NULL;
+#else /* !USE_FIRSTPOS_CHARS */
 
 
+  /* Set first_char only if there is only one character that can be the
+     first character of a match */
+  tnfa->first_char = -1;
+  if (!tmp_ast_l->nullable)
+    {
+      int scanning = 1;
+      for (p = tree->firstpos; scanning && p->position >= 0; p++)
+       {
+         tre_tnfa_transition_t *j = transitions + offs[p->position];
+         while (j->state != NULL)
+           {
+             if (j->code_min <= j->code_max)
+               {
+                 if (j->code_max != j->code_min || j->code_min == -1 || tnfa->first_char != -1)
+                   {
+                     tnfa->first_char = -1;
+                     scanning = 0;
+                     break;
+                   }
+                 tnfa->first_char = j->code_min;
+               }
+             j++;
+           }
+       }
+#ifdef TRE_DEBUG
+      if (tnfa->first_char >= 0)
+       DPRINT(("first char must be %d\n", tnfa->first_char));
+#endif /* TRE_DEBUG */
+    }
+#endif /* !USE_FIRSTPOS_CHARS */
 
   p = tree->firstpos;
   i = 0;
 
   p = tree->firstpos;
   i = 0;
@@ -3359,8 +3391,10 @@ tre_free(regex_t *preg)
 
   if (tnfa->tag_directions)
     xfree(tnfa->tag_directions);
 
   if (tnfa->tag_directions)
     xfree(tnfa->tag_directions);
+#ifdef USE_FIRSTPOS_CHARS /* not defined */
   if (tnfa->firstpos_chars)
     xfree(tnfa->firstpos_chars);
   if (tnfa->firstpos_chars)
     xfree(tnfa->firstpos_chars);
+#endif /* USE_FIRSTPOS_CHARS */
   if (tnfa->minimal_tags)
     xfree(tnfa->minimal_tags);
 
   if (tnfa->minimal_tags)
     xfree(tnfa->minimal_tags);