* regcomp.c (init_dfa): Don't use wchar_t or wctype_t if RE_ENABLE_I18N
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 13 Apr 2006 22:14:12 +0000 (22:14 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 13 Apr 2006 22:14:12 +0000 (22:14 +0000)
is not defined.  Problem reported by Mark D. Baushke via Derek R. Price.
* regex.h (RE_DUP_MAX): Update comment to match current implementation.

lib/ChangeLog
lib/regcomp.c
lib/regex.h

index cf3476796eb555d0336872ca0de5fa54f136c9b4..a8c3fe069a30cdc924ba638d9f270faeb738f487 100644 (file)
@@ -1,3 +1,9 @@
+2006-04-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * regcomp.c (init_dfa): Don't use wchar_t or wctype_t if RE_ENABLE_I18N
+       is not defined.  Problem reported by Mark D. Baushke via Derek R. Price.
+       * regex.h (RE_DUP_MAX): Update comment to match current implementation.
+
 2006-04-09  Paul Eggert  <eggert@cs.ucla.edu>
 
        Merge regex changes from libc, removing some of our
index 84512d00cfa3a09413e473633e478748fb67258d..6e317f5134c4ab19591579da302d98f62a37f242 100644 (file)
@@ -835,16 +835,18 @@ init_dfa (re_dfa_t *dfa, size_t pat_len)
   __re_size_t table_size;
 #ifndef _LIBC
   char *codeset_name;
+#endif
+#ifdef RE_ENABLE_I18N
+  size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
+#else
+  size_t max_i18n_object_size = 0;
 #endif
   size_t max_object_size =
     MAX (sizeof (struct re_state_table_entry),
         MAX (sizeof (re_token_t),
              MAX (sizeof (re_node_set),
                   MAX (sizeof (regmatch_t),
-                       MAX (sizeof (regoff_t),
-                            MAX (sizeof (wchar_t),
-                                 MAX (sizeof (wctype_t),
-                                      sizeof (Idx))))))));
+                       max_i18n_object_size))));
 
   memset (dfa, '\0', sizeof (re_dfa_t));
 
index b1ae24906c464882cb1b4f0926347b52ad9504a5..51857e55976fcdaa8e2fae087c49c616b56cdac2 100644 (file)
@@ -322,7 +322,14 @@ extern reg_syntax_t re_syntax_options;
 # ifdef RE_DUP_MAX
 #  undef RE_DUP_MAX
 # endif
-/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
+
+/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
+   the counter as a 2-byte signed integer.  This is no longer true, so
+   RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
+   ((SIZE_MAX - 2) / 10 - 1) if _REGEX_LARGE_OFFSETS is defined.
+   However, there would be a huge performance problem if someone
+   actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
+   its historical value.  */
 # define RE_DUP_MAX (0x7fff)
 
 #endif /* defined __USE_GNU_REGEX */