patches/glibc/2.9/140-regex-BZ9697.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1201 c9967a6e3b25
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
yann@1201
     1
Original patch from: gentoo/src/patchsets/glibc/2.9/0052_all_glibc-2.9-regex-BZ9697.patch
yann@1201
     2
yann@1201
     3
-= BEGIN original header =-
yann@1201
     4
http://sourceware.org/ml/libc-alpha/2009-01/msg00005.html
yann@1201
     5
yann@1201
     6
From ea8ca0dfcbf2721bcf2c08ce3c01d5764b827572 Mon Sep 17 00:00:00 2001
yann@1201
     7
From: Ulrich Drepper <drepper@redhat.com>
yann@1201
     8
Date: Thu, 8 Jan 2009 00:42:28 +0000
yann@1201
     9
Subject: [PATCH] (re_compile_fastmap_iter): Rewrite COMPLEX_BRACKET handling.
yann@1201
    10
yann@1201
    11
-= END original header =-
yann@1201
    12
yann@1201
    13
diff -durN glibc-2_9.orig/posix/regcomp.c glibc-2_9/posix/regcomp.c
yann@1201
    14
--- glibc-2_9.orig/posix/regcomp.c	2008-05-15 05:07:21.000000000 +0200
yann@1201
    15
+++ glibc-2_9/posix/regcomp.c	2009-02-02 22:00:41.000000000 +0100
yann@1201
    16
@@ -350,47 +350,67 @@
yann@1201
    17
 #ifdef RE_ENABLE_I18N
yann@1201
    18
       else if (type == COMPLEX_BRACKET)
yann@1201
    19
 	{
yann@1201
    20
-	  int i;
yann@1201
    21
 	  re_charset_t *cset = dfa->nodes[node].opr.mbcset;
yann@1201
    22
-	  if (cset->non_match || cset->ncoll_syms || cset->nequiv_classes
yann@1201
    23
-	      || cset->nranges || cset->nchar_classes)
yann@1201
    24
-	    {
yann@1201
    25
+	  int i;
yann@1201
    26
+
yann@1201
    27
 # ifdef _LIBC
yann@1201
    28
-	      if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0)
yann@1201
    29
+	  /* See if we have to try all bytes which start multiple collation
yann@1201
    30
+	     elements.
yann@1201
    31
+	     e.g. In da_DK, we want to catch 'a' since "aa" is a valid
yann@1201
    32
+		  collation element, and don't catch 'b' since 'b' is
yann@1201
    33
+		  the only collation element which starts from 'b' (and
yann@1201
    34
+		  it is caught by SIMPLE_BRACKET).  */
yann@1201
    35
+	      if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
yann@1201
    36
+		  && (cset->ncoll_syms || cset->nranges))
yann@1201
    37
 		{
yann@1201
    38
-		  /* In this case we want to catch the bytes which are
yann@1201
    39
-		     the first byte of any collation elements.
yann@1201
    40
-		     e.g. In da_DK, we want to catch 'a' since "aa"
yann@1201
    41
-			  is a valid collation element, and don't catch
yann@1201
    42
-			  'b' since 'b' is the only collation element
yann@1201
    43
-			  which starts from 'b'.  */
yann@1201
    44
 		  const int32_t *table = (const int32_t *)
yann@1201
    45
 		    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
yann@1201
    46
 		  for (i = 0; i < SBC_MAX; ++i)
yann@1201
    47
 		    if (table[i] < 0)
yann@1201
    48
 		      re_set_fastmap (fastmap, icase, i);
yann@1201
    49
 		}
yann@1201
    50
-# else
yann@1201
    51
-	      if (dfa->mb_cur_max > 1)
yann@1201
    52
-		for (i = 0; i < SBC_MAX; ++i)
yann@1201
    53
-		  if (__btowc (i) == WEOF)
yann@1201
    54
-		    re_set_fastmap (fastmap, icase, i);
yann@1201
    55
-# endif /* not _LIBC */
yann@1201
    56
-	    }
yann@1201
    57
-	  for (i = 0; i < cset->nmbchars; ++i)
yann@1201
    58
+# endif /* _LIBC */
yann@1201
    59
+
yann@1201
    60
+	  /* See if we have to start the match at all multibyte characters,
yann@1201
    61
+	     i.e. where we would not find an invalid sequence.  This only
yann@1201
    62
+	     applies to multibyte character sets; for single byte character
yann@1201
    63
+	     sets, the SIMPLE_BRACKET again suffices.  */
yann@1201
    64
+	  if (dfa->mb_cur_max > 1
yann@1201
    65
+	      && (cset->nchar_classes || cset->non_match
yann@1201
    66
+# ifdef _LIBC
yann@1201
    67
+		  || cset->nequiv_classes
yann@1201
    68
+# endif /* _LIBC */
yann@1201
    69
+		 ))
yann@1201
    70
 	    {
yann@1201
    71
-	      char buf[256];
yann@1201
    72
-	      mbstate_t state;
yann@1201
    73
-	      memset (&state, '\0', sizeof (state));
yann@1201
    74
-	      if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
yann@1201
    75
-		re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
yann@1201
    76
-	      if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
yann@1201
    77
+	      unsigned char c = 0;
yann@1201
    78
+	      do
yann@1201
    79
 		{
yann@1201
    80
-		  if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
yann@1201
    81
-		      != (size_t) -1)
yann@1201
    82
-		    re_set_fastmap (fastmap, 0, *(unsigned char *) buf);
yann@1201
    83
+		  mbstate_t mbs;
yann@1201
    84
+		  memset (&mbs, 0, sizeof (mbs));
yann@1201
    85
+		  if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
yann@1201
    86
+		    re_set_fastmap (fastmap, false, (int) c);
yann@1201
    87
 		}
yann@1201
    88
+	      while (++c != 0);
yann@1201
    89
 	    }
yann@1201
    90
+
yann@1201
    91
+	  else
yann@1201
    92
+	    {
yann@1201
    93
+	      /* ... Else catch all bytes which can start the mbchars.  */
yann@1201
    94
+	      for (i = 0; i < cset->nmbchars; ++i)
yann@1201
    95
+		{
yann@1201
    96
+		  char buf[256];
yann@1201
    97
+		  mbstate_t state;
yann@1201
    98
+		  memset (&state, '\0', sizeof (state));
yann@1201
    99
+		  if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
yann@1201
   100
+		    re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
yann@1201
   101
+		  if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
yann@1201
   102
+		    {
yann@1201
   103
+		      if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
yann@1201
   104
+			  != (size_t) -1)
yann@1201
   105
+			re_set_fastmap (fastmap, false, *(unsigned char *) buf);
yann@1201
   106
+		    }
yann@1201
   107
+ 		}
yann@1201
   108
+ 	    }
yann@1201
   109
 	}
yann@1201
   110
 #endif /* RE_ENABLE_I18N */
yann@1201
   111
       else if (type == OP_PERIOD