about summary refs log tree commit diff
path: root/posix
diff options
context:
space:
mode:
Diffstat (limited to 'posix')
-rw-r--r--posix/bug-regex1.c64
-rw-r--r--posix/regex.c80
2 files changed, 115 insertions, 29 deletions
diff --git a/posix/bug-regex1.c b/posix/bug-regex1.c
new file mode 100644
index 0000000000..262a22e971
--- /dev/null
+++ b/posix/bug-regex1.c
@@ -0,0 +1,64 @@
+/* Test case by Jim Meyering <jim@meyering.net>.  */
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+#include <regex.h>
+
+int
+main (void)
+{
+  struct re_pattern_buffer regex;
+  struct re_registers regs;
+  const char *s;
+  int match;
+  int result = 0;
+
+  memset (&regex, '\0', sizeof (regex));
+
+  setlocale (LC_ALL, "de_DE.ISO-8859-1");
+  fwide (stdout, -1);
+
+  re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_DEBUG);
+
+  puts ("in C locale");
+  setlocale (LC_ALL, "C");
+  s = re_compile_pattern ("[anù]*n", 7, &regex);
+  if (s != NULL)
+    {
+      puts ("re_compile_pattern return non-NULL value");
+      result = 1;
+    }
+  else
+    {
+      match = re_match (&regex, "an", 2, 0, &regs);
+      if (match != 2)
+	{
+	  printf ("re_match returned %d, expected 2\n", match);
+	  result = 1;
+	}
+      else
+	puts (" -> OK");
+    }
+
+  puts ("in de_DE.ISO-8859-1 locale");
+  setlocale (LC_ALL, "de_DE.ISO-8859-1");
+  s = re_compile_pattern ("[anù]*n", 7, &regex);
+  if (s != NULL)
+    {
+      puts ("re_compile_pattern return non-NULL value");
+      result = 1;
+    }
+  else
+    {
+      match = re_match (&regex, "an", 2, 0, &regs);
+      if (match != 2)
+	{
+	  printf ("re_match returned %d, expected 2\n", match);
+	  result = 1;
+	}
+      else
+	puts (" -> OK");
+    }
+
+  return result;
+}
diff --git a/posix/regex.c b/posix/regex.c
index b4979d0bc1..a6e6507542 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -62,7 +62,13 @@
 # define US_CHAR_TYPE wchar_t/* unsigned character type */
 # define COMPILED_BUFFER_VAR wc_buffer
 # define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */
-# define PUT_CHAR(c) printf ("%C", c) /* Should we use wide stream??  */
+# define PUT_CHAR(c) \
+  do {									      \
+    if (MC_CUR_MAX == 1)						      \
+      putchar (c);							      \
+    else								      \
+      printf ("%C", (wint_t) c); /* Should we use wide stream??  */	      \
+  } while (0)
 # define TRUE 1
 # define FALSE 0
 #else
@@ -754,7 +760,7 @@ print_partial_compiled_pattern (start, end)
   while (p < pend)
     {
 #ifdef _LIBC
-      printf ("%t:\t", p - start);
+      printf ("%td:\t", p - start);
 #else
       printf ("%ld:\t", (long int) (p - start));
 #endif
@@ -782,7 +788,7 @@ print_partial_compiled_pattern (start, end)
 	  printf ("/exactn_bin/%d", mcnt);
           do
 	    {
-	      printf("/%x", *p++);
+	      printf("/%lx", (long int) *p++);
             }
           while (--mcnt);
           break;
@@ -790,16 +796,16 @@ print_partial_compiled_pattern (start, end)
 
 	case start_memory:
           mcnt = *p++;
-          printf ("/start_memory/%d/%d", mcnt, *p++);
+          printf ("/start_memory/%d/%ld", mcnt, (long int) *p++);
           break;
 
 	case stop_memory:
           mcnt = *p++;
-	  printf ("/stop_memory/%d/%d", mcnt, *p++);
+	  printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++);
           break;
 
 	case duplicate:
-	  printf ("/duplicate/%d", *p++);
+	  printf ("/duplicate/%ld", (long int) *p++);
 	  break;
 
 	case anychar:
@@ -817,7 +823,7 @@ print_partial_compiled_pattern (start, end)
 	    p += 5;
 	    length = *workp++; /* the length of char_classes */
 	    for (i=0 ; i<length ; i++)
-	      printf("[:%x:]", *p++);
+	      printf("[:%lx:]", (long int) *p++);
 	    length = *workp++; /* the length of collating_symbol */
 	    for (i=0 ; i<length ;)
 	      {
@@ -841,11 +847,17 @@ print_partial_compiled_pattern (start, end)
 	      {
 		wchar_t range_start = *p++;
 		wchar_t range_end = *p++;
-		printf("%C-%C", range_start, range_end);
+		if (MB_CUR_MAX == 1)
+		  printf("%c-%c", (char) range_start, (char) range_end);
+		else
+		  printf("%C-%C", (wint_t) range_start, (wint_t) range_end);
 	      }
 	    length = *workp++; /* the length of char */
 	    for (i=0 ; i<length ; i++)
-	      printf("%C", *p++);
+	      if (MB_CUR_MAX == 1)
+		putchar (*p++);
+	      else
+		printf("%C", (wint_t) *p++);
 	    putchar (']');
 #else
             register int c, last = -100;
@@ -900,7 +912,7 @@ print_partial_compiled_pattern (start, end)
 	case on_failure_jump:
           extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/on_failure_jump to %t", p + mcnt - start);
+  	  printf ("/on_failure_jump to %td", p + mcnt - start);
 #else
   	  printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start));
 #endif
@@ -909,7 +921,7 @@ print_partial_compiled_pattern (start, end)
 	case on_failure_keep_string_jump:
           extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/on_failure_keep_string_jump to %t", p + mcnt - start);
+  	  printf ("/on_failure_keep_string_jump to %td", p + mcnt - start);
 #else
   	  printf ("/on_failure_keep_string_jump to %ld",
 		  (long int) (p + mcnt - start));
@@ -919,7 +931,7 @@ print_partial_compiled_pattern (start, end)
 	case dummy_failure_jump:
           extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/dummy_failure_jump to %t", p + mcnt - start);
+  	  printf ("/dummy_failure_jump to %td", p + mcnt - start);
 #else
   	  printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start));
 #endif
@@ -932,7 +944,7 @@ print_partial_compiled_pattern (start, end)
         case maybe_pop_jump:
           extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/maybe_pop_jump to %t", p + mcnt - start);
+  	  printf ("/maybe_pop_jump to %td", p + mcnt - start);
 #else
   	  printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start));
 #endif
@@ -941,7 +953,7 @@ print_partial_compiled_pattern (start, end)
         case pop_failure_jump:
 	  extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/pop_failure_jump to %t", p + mcnt - start);
+  	  printf ("/pop_failure_jump to %td", p + mcnt - start);
 #else
   	  printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start));
 #endif
@@ -950,7 +962,7 @@ print_partial_compiled_pattern (start, end)
         case jump_past_alt:
 	  extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/jump_past_alt to %t", p + mcnt - start);
+  	  printf ("/jump_past_alt to %td", p + mcnt - start);
 #else
   	  printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start));
 #endif
@@ -959,7 +971,7 @@ print_partial_compiled_pattern (start, end)
         case jump:
 	  extract_number_and_incr (&mcnt, &p);
 #ifdef _LIBC
-  	  printf ("/jump to %t", p + mcnt - start);
+  	  printf ("/jump to %td", p + mcnt - start);
 #else
   	  printf ("/jump to %ld", (long int) (p + mcnt - start));
 #endif
@@ -970,7 +982,7 @@ print_partial_compiled_pattern (start, end)
 	  p1 = p + mcnt;
           extract_number_and_incr (&mcnt2, &p);
 #ifdef _LIBC
-	  printf ("/succeed_n to %t, %d times", p1 - start, mcnt2);
+	  printf ("/succeed_n to %td, %d times", p1 - start, mcnt2);
 #else
 	  printf ("/succeed_n to %ld, %d times",
 		  (long int) (p1 - start), mcnt2);
@@ -989,7 +1001,7 @@ print_partial_compiled_pattern (start, end)
 	  p1 = p + mcnt;
           extract_number_and_incr (&mcnt2, &p);
 #ifdef _LIBC
-	  printf ("/set_number_at location %t to %d", p1 - start, mcnt2);
+	  printf ("/set_number_at location %td to %d", p1 - start, mcnt2);
 #else
 	  printf ("/set_number_at location %ld to %d",
 		  (long int) (p1 - start), mcnt2);
@@ -1055,14 +1067,14 @@ print_partial_compiled_pattern (start, end)
           break;
 
         default:
-          printf ("?%d", *(p-1));
+          printf ("?%ld", (long int) *(p-1));
 	}
 
       putchar ('\n');
     }
 
 #ifdef _LIBC
-  printf ("%t:\tend of pattern.\n", p - start);
+  printf ("%td:\tend of pattern.\n", p - start);
 #else
   printf ("%ld:\tend of pattern.\n", (long int) (p - start));
 #endif
@@ -1909,7 +1921,7 @@ static reg_errcode_t compile_range _RE_ARGS ((unsigned int range_start,
 /* Make sure we have at least N more bytes of space in buffer.  */
 #ifdef MBS_SUPPORT
 # define GET_BUFFER_SPACE(n)						\
-    while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR			\
+    while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR	\
             + (n)*sizeof(CHAR_TYPE)) > bufp->allocated)			\
       EXTEND_BUFFER ()
 #else
@@ -1922,7 +1934,7 @@ static reg_errcode_t compile_range _RE_ARGS ((unsigned int range_start,
 #define BUF_PUSH(c)							\
   do {									\
     GET_BUFFER_SPACE (1);						\
-    *b++ = (US_CHAR_TYPE) (c);					\
+    *b++ = (US_CHAR_TYPE) (c);						\
   } while (0)
 
 
@@ -4153,7 +4165,7 @@ regex_compile (pattern, size, syntax, bufp)
 
   /* We have succeeded; set the length of the buffer.  */
 #ifdef MBS_SUPPORT
-  bufp->used = (int) b - (int) COMPILED_BUFFER_VAR;
+  bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR;
 #else
   bufp->used = b - bufp->buffer;
 #endif
@@ -5936,7 +5948,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
 	    goto fail;
 
           SET_REGS_MATCHED ();
-          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+          DEBUG_PRINT2 ("  Matched `%ld'.\n", (long int) *d);
           d++;
 	  break;
 
@@ -6308,7 +6320,8 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
            matched within the group is recorded (in the internal
            registers data structure) under the register number.  */
         case start_memory:
-	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+	  DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n",
+			(long int) *p, (long int) p[1]);
 
           /* Find out if this group can match the empty string.  */
 	  p1 = p;		/* To send to group_match_null_string_p.  */
@@ -6356,7 +6369,8 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
            arguments are the same as start_memory's: the register
            number, and the number of inner groups.  */
 	case stop_memory:
-	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+	  DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n",
+			(long int) *p, (long int) p[1]);
 
           /* We need to save the string position the last time we were at
              this close-group operator in case the group is operated
@@ -6766,8 +6780,16 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
                   {
   		    p[-(1+OFFSET_ADDRESS_SIZE)] = (US_CHAR_TYPE)
 		      pop_failure_jump;
-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
-                                  c, p1[3+OFFSET_ADDRESS_SIZE]);
+#ifdef MBS_SUPPORT
+		    if (MB_CUR_MAX != 1)
+		      DEBUG_PRINT3 ("  %C != %C => pop_failure_jump.\n",
+				    (wint_t) c,
+				    (wint_t) p1[3+OFFSET_ADDRESS_SIZE]);
+		    else
+#endif
+		      DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+				    (char) c,
+				    (char) p1[3+OFFSET_ADDRESS_SIZE]);
                   }
 
 #ifndef MBS_SUPPORT
@@ -6776,7 +6798,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
 		  {
 		    int not = (re_opcode_t) p1[3] == charset_not;
 
-		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+		    if (c < (unsigned) (p1[4] * BYTEWIDTH)
 			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
 		      not = !not;