changeset 6733:1c9a307d93bd

* 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.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 13 Apr 2006 22:14:12 +0000
parents 9d91ed0c4515
children 3e5ad4566013
files lib/ChangeLog lib/regcomp.c lib/regex.h
diffstat 3 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -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
--- a/lib/regcomp.c
+++ b/lib/regcomp.c
@@ -836,15 +836,17 @@
 #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));
 
--- a/lib/regex.h
+++ b/lib/regex.h
@@ -322,7 +322,14 @@
 # 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 */