[Clfs-commits] [Cross-LFS]Cross-LFS Book branch, master, updated. 4cc665a158807740e9d6d77036cc809947e8b6ec

git git at cross-lfs.org
Tue Aug 3 19:19:45 PDT 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Cross-LFS Book".

The branch, master has been updated
       via  4cc665a158807740e9d6d77036cc809947e8b6ec (commit)
       via  4ff3f92f9349a69791ba9131795f724845b37d47 (commit)
       via  8cc43dba37c413d2535f964d8fcdacc7549e6579 (commit)
       via  bd8e44da5fa7c8fb2aeaad0531f2c300ec6f283f (commit)
      from  110e1fa9348f0853312e3559d527e4f52a3d9f17 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 4cc665a158807740e9d6d77036cc809947e8b6ec
Author: Joe Ciccone <jciccone at gmail.com>
Date:   Tue Aug 3 22:20:33 2010 -0400

    Drop the Grep i18n patch and introduce a fixes patch.

diff --git a/BOOK/final-system/common/grep.xml b/BOOK/final-system/common/grep.xml
index b9454d7..99e3c1b 100644
--- a/BOOK/final-system/common/grep.xml
+++ b/BOOK/final-system/common/grep.xml
@@ -25,9 +25,9 @@
   <sect2 role="installation">
     <title>Installation of Grep</title>
 
-    <para os="p1">This patch adds support for Internationalization:</para>
+    <para os="p1">This patch contains various bug fixes for Grep:</para>
 
-<screen os="p2"><userinput>patch -Np1 -i ../&grep-i18n-patch;</userinput></screen>
+<screen os="p2"><userinput>patch -Np1 -i ../&grep-fixes-patch;</userinput></screen>
 
     <para os="a">Prepare Grep for compilation:</para>
 
diff --git a/BOOK/materials/common/patches.xml b/BOOK/materials/common/patches.xml
index f8cdacd..4623102 100644
--- a/BOOK/materials/common/patches.xml
+++ b/BOOK/materials/common/patches.xml
@@ -73,11 +73,11 @@
     </varlistentry>
 
     <varlistentry>
-      <term>Grep i18n Patch - <token>&grep-i18n-patch-size;</token>:</term>
+      <term>Grep Fixes Patch - <token>&grep-fixes-patch-size;</token>:</term>
       <listitem>
         <para>Download: <ulink
-        url="&patches-root;&grep-i18n-patch;"/></para>
-        <para>MD5 sum: <literal>&grep-i18n-patch-md5;</literal></para>
+        url="&patches-root;&grep-fixes-patch;"/></para>
+        <para>MD5 sum: <literal>&grep-fixes-patch-md5;</literal></para>
       </listitem>
     </varlistentry>
 
diff --git a/BOOK/patches.ent b/BOOK/patches.ent
index bbf2d82..bd3bb5c 100644
--- a/BOOK/patches.ent
+++ b/BOOK/patches.ent
@@ -32,9 +32,9 @@
 <!ENTITY gcc-specs-patch-md5 "9ba70e5765be93577166d824064e675a">
 <!ENTITY gcc-specs-patch-size "20 KB">
 
-<!ENTITY grep-i18n-patch "grep-&grep-version;-i18n-1.patch">
-<!ENTITY grep-i18n-patch-md5 "337d017202d7e3b08d428a89da3ee572">
-<!ENTITY grep-i18n-patch-size "26 KB">
+<!ENTITY grep-fixes-patch "grep-&grep-version;-fixes-1.patch">
+<!ENTITY grep-fixes-patch-md5 "0cb36684847842adb17a1b3fb96f733d">
+<!ENTITY grep-fixes-patch-size "12 KB">
 
 <!ENTITY iputils-fixes-patch "iputils-&iputils-version;-fixes-2.patch">
 <!ENTITY iputils-fixes-patch-md5 "31a39902b0d343233d48ef0f3c038559">
diff --git a/patches/grep-2.5.4-i18n-1.patch b/patches/grep-2.5.4-i18n-1.patch
deleted file mode 100644
index ae22235..0000000
--- a/patches/grep-2.5.4-i18n-1.patch
+++ /dev/null
@@ -1,1109 +0,0 @@
-Submitted By: Ken Moffat <ken at linuxfromscratch dot org>
-Date: 2008-02-19
-Initial Package Version: 2.5.3
-Upstream Status: uncertain
-Origin: from debian.
-Description: Various fixes, particularly speed improvements for UTF-8 locales.
-Also adds a 'standard input' marker into the results for certain obscure uses.
-
-diff -Naur grep-2.5.3.orig/lib/posix/regex.h grep-2.5.3.lfs/lib/posix/regex.h
---- grep-2.5.3.orig/lib/posix/regex.h	2007-06-28 19:57:18.000000000 +0100
-+++ grep-2.5.3.lfs/lib/posix/regex.h	2008-02-10 18:56:07.000000000 +0000
-@@ -165,6 +165,10 @@
-    treated as 'a\{1'.  */
- #define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
- 
-+/* If this bit is set, then ignore case when matching.
-+   If not set, then case is significant.  */
-+#define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
-+
- /* This global variable defines the particular regexp syntax to use (for
-    some interfaces).  When a regexp is compiled, the syntax used is
-    stored in the pattern buffer, so changing this does not affect
-diff -Naur grep-2.5.3.orig/src/dfa.c grep-2.5.3.lfs/src/dfa.c
---- grep-2.5.3.orig/src/dfa.c	2007-06-28 19:57:19.000000000 +0100
-+++ grep-2.5.3.lfs/src/dfa.c	2008-02-10 18:55:29.000000000 +0000
-@@ -594,6 +594,17 @@
- 		/* build character class.  */
- 		{
- 		  wctype_t wt;
-+		  /* NOTE:
-+		   * when case_fold, character class [:upper:] and [:lower:]
-+		   * should be treated as [:alpha:], this is the same way
-+		   * of glibc/posix/regcomp.c:build_charclass().
-+		   * reported by Bug#276202
-+		   * - fixed by Fumitoshi UKAI
-+		   */
-+		  if (case_fold 
-+		      && (strcmp (str, "upper") == 0 || strcmp (str, "lower") == 0)) 
-+		      strcpy (str, "alpha");
-+
- 		  /* Query the character class as wctype_t.  */
- 		  wt = wctype (str);
- 
-@@ -681,6 +692,29 @@
- 	  REALLOC_IF_NECESSARY(work_mbc->range_ends, wchar_t,
- 			       range_ends_al, work_mbc->nranges + 1);
- 	  work_mbc->range_ends[work_mbc->nranges++] = (wchar_t)wc2;
-+	  if (case_fold 
-+	      && (iswlower((wint_t)wc) || iswupper((wint_t)wc))
-+	      && (iswlower((wint_t)wc2) || iswupper((wint_t)wc2))) {
-+	    wint_t altcase;
-+	    altcase = wc;
-+	    if (iswlower((wint_t)wc))
-+	      altcase = towupper((wint_t)wc);
-+	    else
-+	      altcase = towlower((wint_t)wc);
-+	    REALLOC_IF_NECESSARY(work_mbc->range_sts, wchar_t,
-+				 range_sts_al, work_mbc->nranges + 1);
-+	    work_mbc->range_sts[work_mbc->nranges] = (wchar_t)altcase;
-+	    
-+	    altcase = wc2;
-+	    if (iswlower((wint_t)wc2))
-+	      altcase = towupper((wint_t)wc2);
-+	    else
-+	      altcase = towlower((wint_t)wc2);
-+	    REALLOC_IF_NECESSARY(work_mbc->range_ends, wchar_t,
-+				 range_ends_al, work_mbc->nranges + 1);
-+	    work_mbc->range_ends[work_mbc->nranges++] = (wchar_t)altcase;
-+	    
-+	  }
- 	}
-       else if (wc != WEOF)
- 	/* build normal characters.  */
-@@ -688,6 +722,20 @@
- 	  REALLOC_IF_NECESSARY(work_mbc->chars, wchar_t, chars_al,
- 			       work_mbc->nchars + 1);
- 	  work_mbc->chars[work_mbc->nchars++] = (wchar_t)wc;
-+	  if (case_fold && (iswlower((wint_t) wc) || iswupper((wint_t) wc)))
-+	    {
-+		wint_t altcase;
-+
-+		altcase = wc;		/* keeps compiler happy */
-+		if (iswlower((wint_t) wc))
-+		  altcase = towupper((wint_t) wc);
-+		else if (iswupper((wint_t) wc))
-+		  altcase = towlower((wint_t) wc);
-+
-+		REALLOC_IF_NECESSARY(work_mbc->chars, wchar_t, chars_al,
-+			       work_mbc->nchars + 1);
-+		work_mbc->chars[work_mbc->nchars++] = (wchar_t) altcase;
-+	    }
- 	}
-     }
-   while ((wc = wc1) != L']');
-diff -Naur grep-2.5.3.orig/src/grep.c grep-2.5.3.lfs/src/grep.c
---- grep-2.5.3.orig/src/grep.c	2007-06-28 19:57:19.000000000 +0100
-+++ grep-2.5.3.lfs/src/grep.c	2008-02-10 18:54:53.000000000 +0000
-@@ -274,6 +274,12 @@
- #endif
- ;
- 
-+/* Default for `file_list' if no files are given on the command line. */
-+static char *stdin_argv[] =
-+{
-+  "-", NULL
-+};
-+
- /* Non-boolean long options that have no corresponding short equivalents.  */
- enum
- {
-@@ -534,7 +540,16 @@
- 	 for byte sentinels fore and aft.  */
-       newalloc = newsize + pagesize + 1;
- 
--      newbuf = bufalloc < newalloc ? xmalloc (bufalloc = newalloc) : buffer;
-+      newbuf = bufalloc < newalloc ? malloc (bufalloc = newalloc) : buffer;
-+      if (newbuf == NULL)
-+	{
-+	  int saved_errno = errno;
-+	  free (buffer);
-+	  bufalloc = ALIGN_TO (INITIAL_BUFSIZE, pagesize) + pagesize + 1;
-+	  buffer = xmalloc (bufalloc);
-+	  errno = saved_errno;
-+	  return 0;
-+	}
-       readbuf = ALIGN_TO (newbuf + 1 + save, pagesize);
-       bufbeg = readbuf - save;
-       memmove (bufbeg, buffer + saved_offset, save);
-@@ -1825,6 +1840,7 @@
-   FILE *fp;
-   extern char *optarg;
-   extern int optind;
-+  char **file_list;
- 
-   initialize_main (&argc, &argv);
-   program_name = argv[0];
-@@ -2244,29 +2260,29 @@
-   if (max_count == 0)
-     exit (1);
- 
--  if (optind < argc)
-+  file_list = (optind == argc ? stdin_argv : &argv[optind]);
-+
-+  status = 1;
-+  while (1)
-     {
--	status = 1;
--	do
-+      char *file = *file_list++;
-+
-+      if (file == NULL)
-+	break;
-+
-+      if ((included_patterns || excluded_patterns)
-+	  && !isdir (file))
- 	{
--	  char *file = argv[optind];
--	  if ((included_patterns || excluded_patterns)
--	      && !isdir (file))
--	    {
--	      if (included_patterns &&
--		  ! excluded_filename (included_patterns, file, 0))
--		continue;
--	      if (excluded_patterns &&
--		  excluded_filename (excluded_patterns, file, 0))
--		continue;
--	    }
--	  status &= grepfile (strcmp (file, "-") == 0 ? (char *) NULL : file,
--			      &stats_base);
-+	  if (included_patterns &&
-+	      ! excluded_filename (included_patterns, file, 0))
-+	    continue;
-+	  if (excluded_patterns &&
-+	      excluded_filename (excluded_patterns, file, 0))
-+	    continue;
- 	}
--	while ( ++optind < argc);
-+      status &= grepfile (strcmp (file, "-") == 0
-+			  ? (char *) NULL : file, &stats_base);
-     }
--  else
--    status = grepfile ((char *) NULL, &stats_base);
- 
-   /* We register via atexit() to test stdout.  */
-   exit (errseen ? 2 : status);
-diff -Naur grep-2.5.3.orig/src/search.c grep-2.5.3.lfs/src/search.c
---- grep-2.5.3.orig/src/search.c	2007-06-28 19:57:19.000000000 +0100
-+++ grep-2.5.3.lfs/src/search.c	2008-02-10 18:56:18.000000000 +0000
-@@ -18,10 +18,15 @@
- 
- /* Written August 1992 by Mike Haertel. */
- 
-+#ifndef _GNU_SOURCE
-+# define _GNU_SOURCE 1
-+#endif
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
- 
-+#include <assert.h>
-+
- #include <sys/types.h>
- 
- #include "mbsupport.h"
-@@ -43,6 +48,9 @@
- #ifdef HAVE_LIBPCRE
- # include <pcre.h>
- #endif
-+#ifdef HAVE_LANGINFO_CODESET
-+# include <langinfo.h>
-+#endif
- 
- #define NCHAR (UCHAR_MAX + 1)
- 
-@@ -68,6 +76,19 @@
-     error (2, 0, _("memory exhausted"));
- }
- 
-+/* UTF-8 encoding allows some optimizations that we can't otherwise
-+   assume in a multibyte encoding. */
-+static int using_utf8;
-+
-+void
-+check_utf8 (void)
-+{
-+#ifdef HAVE_LANGINFO_CODESET
-+  if (strcmp (nl_langinfo (CODESET), "UTF-8") == 0)
-+    using_utf8 = 1;
-+#endif
-+}
-+
- #ifndef FGREP_PROGRAM
- /* DFA compiled regexp. */
- static struct dfa dfa;
-@@ -134,49 +155,6 @@
- }
- #endif /* !FGREP_PROGRAM */
- 
--#ifdef MBS_SUPPORT
--/* This function allocate the array which correspond to "buf".
--   Then this check multibyte string and mark on the positions which
--   are not single byte character nor the first byte of a multibyte
--   character.  Caller must free the array.  */
--static char*
--check_multibyte_string(char const *buf, size_t size)
--{
--  char *mb_properties = xmalloc(size);
--  mbstate_t cur_state;
--  wchar_t wc;
--  int i;
--
--  memset(&cur_state, 0, sizeof(mbstate_t));
--  memset(mb_properties, 0, sizeof(char)*size);
--
--  for (i = 0; i < size ;)
--    {
--      size_t mbclen;
--      mbclen = mbrtowc(&wc, buf + i, size - i, &cur_state);
--
--      if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0)
--	{
--	  /* An invalid sequence, or a truncated multibyte character.
--	     We treat it as a single byte character.  */
--	  mbclen = 1;
--	}
--      else if (match_icase)
--	{
--	  if (iswupper((wint_t)wc))
--	    {
--	      wc = towlower((wint_t)wc);
--	      wcrtomb(buf + i, wc, &cur_state);
--	    }
--	}
--      mb_properties[i] = mbclen;
--      i += mbclen;
--    }
--
--  return mb_properties;
--}
--#endif /* MBS_SUPPORT */
--
- #if defined(GREP_PROGRAM) || defined(EGREP_PROGRAM)
- #ifdef EGREP_PROGRAM
- COMPILE_FCT(Ecompile)
-@@ -193,10 +171,9 @@
-   size_t total = size;
-   char const *motif = pattern;
- 
--#if 0
-+  check_utf8 ();
-   if (match_icase)
-     syntax_bits |= RE_ICASE;
--#endif
-   re_set_syntax (syntax_bits);
-   dfasyntax (syntax_bits, match_icase, eolbyte);
- 
-@@ -301,23 +278,35 @@
-   char eol = eolbyte;
-   int backref, start, len, best_len;
-   struct kwsmatch kwsm;
-+  static int use_dfa;
-+  static int use_dfa_checked = 0;
-   size_t i, ret_val;
- #ifdef MBS_SUPPORT
--  char *mb_properties = NULL;
--  if (MB_CUR_MAX > 1)
-+  const char *last_char = NULL;
-+  int mb_cur_max = MB_CUR_MAX;
-+  mbstate_t mbs;
-+  memset (&mbs, '\0', sizeof (mbstate_t));
-+#endif /* MBS_SUPPORT */
-+
-+  if (!use_dfa_checked)
-     {
--      if (match_icase)
--        {
--          char *case_buf = xmalloc(size);
--          memcpy(case_buf, buf, size);
--	  if (start_ptr)
--	    start_ptr = case_buf + (start_ptr - buf);
--          buf = case_buf;
--        }
--      if (kwset)
--        mb_properties = check_multibyte_string(buf, size);
--    }
-+      char *grep_use_dfa = getenv ("GREP_USE_DFA");
-+      if (!grep_use_dfa)
-+	{
-+#ifdef MBS_SUPPORT
-+	  /* Turn off DFA when processing multibyte input. */
-+	  use_dfa = (MB_CUR_MAX == 1);
-+#else
-+	  use_dfa = 1;
- #endif /* MBS_SUPPORT */
-+	}
-+      else
-+	{
-+	  use_dfa = atoi (grep_use_dfa);
-+	}
-+
-+      use_dfa_checked = 1;
-+    }
- 
-   buflim = buf + size;
- 
-@@ -329,40 +318,123 @@
- 	  if (kwset)
- 	    {
- 	      /* Find a possible match using the KWset matcher. */
--	      size_t offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
-+#ifdef MBS_SUPPORT
-+	      size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
-+	      size_t offset;
-+#ifdef MBS_SUPPORT
-+	      /* kwsexec doesn't work with match_icase and multibyte input. */
-+	      if (match_icase && mb_cur_max > 1)
-+		/* Avoid kwset */
-+		offset = 0;
-+	      else
-+#endif /* MBS_SUPPORT */
-+	      offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
- 	      if (offset == (size_t) -1)
--		goto failure;
-+		return (size_t)-1;
-+#ifdef MBS_SUPPORT
-+	      if (mb_cur_max > 1 && !using_utf8)
-+		{
-+		  bytes_left = offset;
-+		  while (bytes_left)
-+		    {
-+		      size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+		      last_char = beg;
-+		      if (mlen == (size_t) -1 || mlen == 0)
-+			{
-+			  /* Incomplete character: treat as single-byte. */
-+			  memset (&mbs, '\0', sizeof (mbstate_t));
-+			  beg++;
-+			  bytes_left--;
-+			  continue;
-+			}
-+
-+		      if (mlen == (size_t) -2)
-+			/* Offset points inside multibyte character:
-+			 * no good. */
-+			break;
-+
-+		      beg += mlen;
-+		      bytes_left -= mlen;
-+		    }
-+		}
-+	      else
-+#endif /* MBS_SUPPORT */
- 	      beg += offset;
- 	      /* Narrow down to the line containing the candidate, and
- 		 run it through DFA. */
- 	      end = memchr(beg, eol, buflim - beg);
- 	      end++;
- #ifdef MBS_SUPPORT
--	      if (MB_CUR_MAX > 1 && mb_properties[beg - buf] == 0)
-+	      if (mb_cur_max > 1 && bytes_left)
- 		continue;
- #endif
- 	      while (beg > buf && beg[-1] != eol)
- 		--beg;
--	      if (kwsm.index < kwset_exact_matches)
-+	      if (
-+#ifdef MBS_SUPPORT
-+		  !(match_icase && mb_cur_max > 1) &&
-+#endif /* MBS_SUPPORT */
-+		  (kwsm.index < kwset_exact_matches))
- 		goto success;
--	      if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
-+	      if (use_dfa &&
-+		  dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
- 		continue;
- 	    }
- 	  else
- 	    {
- 	      /* No good fixed strings; start with DFA. */
--	      size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
-+#ifdef MBS_SUPPORT
-+	      size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
-+	      size_t offset = 0;
-+	      if (use_dfa)
-+		offset = dfaexec (&dfa, beg, buflim - beg, &backref);
- 	      if (offset == (size_t) -1)
- 		break;
- 	      /* Narrow down to the line we've found. */
-+#ifdef MBS_SUPPORT
-+	      if (mb_cur_max > 1 && !using_utf8)
-+		{
-+		  bytes_left = offset;
-+		  while (bytes_left)
-+		    {
-+		      size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+		      last_char = beg;
-+		      if (mlen == (size_t) -1 || mlen == 0)
-+			{
-+			  /* Incomplete character: treat as single-byte. */
-+			  memset (&mbs, '\0', sizeof (mbstate_t));
-+			  beg++;
-+			  bytes_left--;
-+			  continue;
-+			}
-+
-+		      if (mlen == (size_t) -2)
-+			/* Offset points inside multibyte character:
-+			 * no good. */
-+			break;
-+
-+		      beg += mlen;
-+		      bytes_left -= mlen;
-+		    }
-+		}
-+	      else
-+#endif /* MBS_SUPPORT */
- 	      beg += offset;
- 	      end = memchr (beg, eol, buflim - beg);
- 	      end++;
-+#ifdef MBS_SUPPORT
-+	      if (mb_cur_max > 1 && bytes_left)
-+		continue;
-+#endif /* MBS_SUPPORT */
- 	      while (beg > buf && beg[-1] != eol)
- 		--beg;
- 	    }
- 	  /* Successful, no backreferences encountered! */
--	  if (!backref)
-+	  if (use_dfa && !backref)
- 	    goto success;
- 	}
-       else
-@@ -408,10 +480,84 @@
- 	      if (match_words)
- 		while (match <= best_match)
- 		  {
--		    if ((match == buf || !WCHAR ((unsigned char) match[-1]))
--			&& (len == end - beg - 1
--			    || !WCHAR ((unsigned char) match[len])))
--		      goto assess_pattern_match;
-+		    int lword_match = 0;
-+		    if (match == buf)
-+		      lword_match = 1;
-+		    else
-+		      {
-+			assert (start > 0);
-+#ifdef MBS_SUPPORT
-+			if (mb_cur_max > 1)
-+			  {
-+			    const char *s;
-+			    int mr;
-+			    wchar_t pwc;
-+			    if (using_utf8)
-+			      {
-+				s = match - 1;
-+				while (s > buf
-+				       && (unsigned char) *s >= 0x80
-+				       && (unsigned char) *s <= 0xbf)
-+				  --s;
-+			      }
-+			    else
-+			      s = last_char;
-+			    mr = mbtowc (&pwc, s, match - s);
-+			    if (mr <= 0)
-+			      {
-+				memset (&mbs, '\0', sizeof (mbstate_t));
-+				lword_match = 1;
-+			      }
-+			    else if (!(iswalnum (pwc) || pwc == L'_')
-+				     && mr == (int) (match - s))
-+			      lword_match = 1;
-+			  }
-+			else
-+#endif /* MBS_SUPPORT */
-+			if (!WCHAR ((unsigned char) match[-1]))
-+			  lword_match = 1;
-+		      }
-+
-+		    if (lword_match)
-+		      {
-+			int rword_match = 0;
-+			if (start + len == end - beg - 1)
-+			  rword_match = 1;
-+			else
-+			  {
-+#ifdef MBS_SUPPORT
-+			    if (mb_cur_max > 1)
-+			      {
-+				wchar_t nwc;
-+				int mr;
-+
-+				mr = mbtowc (&nwc, buf + start + len,
-+					     end - buf - start - len - 1);
-+				if (mr <= 0)
-+				  {
-+				    memset (&mbs, '\0', sizeof (mbstate_t));
-+				    rword_match = 1;
-+				  }
-+				else if (!iswalnum (nwc) && nwc != L'_')
-+				  rword_match = 1;
-+			      }
-+			    else
-+#endif /* MBS_SUPPORT */
-+			    if (!WCHAR ((unsigned char) match[len]))
-+			      rword_match = 1;
-+			  }
-+
-+			if (rword_match)
-+			  {
-+			    if (!start_ptr)
-+			      /* Returns the whole line. */
-+			      goto success;
-+			    else
-+			      {
-+				goto assess_pattern_match;
-+			      }
-+			  }
-+		      }
- 		    if (len > 0)
- 		      {
- 			/* Try a shorter length anchored at the same place. */
-@@ -475,24 +621,144 @@
-   *match_size = len;
-   ret_val = beg - buf;
-  out:
--#ifdef MBS_SUPPORT
--  if (MB_CUR_MAX > 1)
--    {
--      if (match_icase)
--        free((char*)buf);
--      if (mb_properties)
--        free(mb_properties);
--    }
--#endif /* MBS_SUPPORT */
-   return ret_val;
- }
- #endif /* defined(GREP_PROGRAM) || defined(EGREP_PROGRAM) */
- 
-+#ifdef MBS_SUPPORT
-+static int f_i_multibyte; /* whether we're using the new -Fi MB method */
-+static struct
-+{
-+  wchar_t **patterns;
-+  size_t count, maxlen;
-+  unsigned char *match;
-+} Fimb;
-+#endif
-+
- #if defined(GREP_PROGRAM) || defined(FGREP_PROGRAM)
- COMPILE_FCT(Fcompile)
- {
-+  int mb_cur_max = MB_CUR_MAX;
-   char const *beg, *lim, *err;
- 
-+  check_utf8 ();
-+#ifdef MBS_SUPPORT
-+  /* Support -F -i for UTF-8 input. */
-+  if (match_icase && mb_cur_max > 1)
-+    {
-+      mbstate_t mbs;
-+      wchar_t *wcpattern = xmalloc ((size + 1) * sizeof (wchar_t));
-+      const char *patternend = pattern;
-+      size_t wcsize;
-+      kwset_t fimb_kwset = NULL;
-+      char *starts = NULL;
-+      wchar_t *wcbeg, *wclim;
-+      size_t allocated = 0;
-+
-+      memset (&mbs, '\0', sizeof (mbs));
-+# ifdef __GNU_LIBRARY__
-+      wcsize = mbsnrtowcs (wcpattern, &patternend, size, size, &mbs);
-+      if (patternend != pattern + size)
-+	wcsize = (size_t) -1;
-+# else
-+      {
-+	char *patterncopy = xmalloc (size + 1);
-+
-+	memcpy (patterncopy, pattern, size);
-+	patterncopy[size] = '\0';
-+	patternend = patterncopy;
-+	wcsize = mbsrtowcs (wcpattern, &patternend, size, &mbs);
-+	if (patternend != patterncopy + size)
-+	  wcsize = (size_t) -1;
-+	free (patterncopy);
-+      }
-+# endif
-+      if (wcsize + 2 <= 2)
-+	{
-+fimb_fail:
-+	  free (wcpattern);
-+	  free (starts);
-+	  if (fimb_kwset)
-+	    kwsfree (fimb_kwset);
-+	  free (Fimb.patterns);
-+	  Fimb.patterns = NULL;
-+	}
-+      else
-+	{
-+	  if (!(fimb_kwset = kwsalloc (NULL)))
-+	    error (2, 0, _("memory exhausted"));
-+
-+	  starts = xmalloc (mb_cur_max * 3);
-+	  wcbeg = wcpattern;
-+	  do
-+	    {
-+	      int i;
-+	      size_t wclen;
-+
-+	      if (Fimb.count >= allocated)
-+		{
-+		  if (allocated == 0)
-+		    allocated = 128;
-+		  else
-+		    allocated *= 2;
-+		  Fimb.patterns = xrealloc (Fimb.patterns,
-+					    sizeof (wchar_t *) * allocated);
-+		}
-+	      Fimb.patterns[Fimb.count++] = wcbeg;
-+	      for (wclim = wcbeg;
-+		   wclim < wcpattern + wcsize && *wclim != L'\n'; ++wclim)
-+		*wclim = towlower (*wclim);
-+	      *wclim = L'\0';
-+	      wclen = wclim - wcbeg;
-+	      if (wclen > Fimb.maxlen)
-+		Fimb.maxlen = wclen;
-+	      if (wclen > 3)
-+		wclen = 3;
-+	      if (wclen == 0)
-+		{
-+		  if ((err = kwsincr (fimb_kwset, "", 0)) != 0)
-+		    error (2, 0, err);
-+		}
-+	      else
-+		for (i = 0; i < (1 << wclen); i++)
-+		  {
-+		    char *p = starts;
-+		    int j, k;
-+
-+		    for (j = 0; j < wclen; ++j)
-+		      {
-+			wchar_t wc = wcbeg[j];
-+			if (i & (1 << j))
-+			  {
-+			    wc = towupper (wc);
-+			    if (wc == wcbeg[j])
-+			      continue;
-+			  }
-+			k = wctomb (p, wc);
-+			if (k <= 0)
-+			  goto fimb_fail;
-+			p += k;
-+		      }
-+		    if ((err = kwsincr (fimb_kwset, starts, p - starts)) != 0)
-+		      error (2, 0, err);
-+		  }
-+	      if (wclim < wcpattern + wcsize)
-+		++wclim;
-+	      wcbeg = wclim;
-+	    }
-+	  while (wcbeg < wcpattern + wcsize);
-+	  f_i_multibyte = 1;
-+	  kwset = fimb_kwset;
-+	  free (starts);
-+	  Fimb.match = xmalloc (Fimb.count);
-+	  if ((err = kwsprep (kwset)) != 0)
-+	    error (2, 0, err);
-+	  return;
-+	}
-+    }
-+#endif /* MBS_SUPPORT */
-+
-+
-   kwsinit ();
-   beg = pattern;
-   do
-@@ -511,6 +777,76 @@
-     error (2, 0, err);
- }
- 
-+#ifdef MBS_SUPPORT
-+static int
-+Fimbexec (const char *buf, size_t size, size_t *plen, int exact)
-+{
-+  size_t len, letter, i;
-+  int ret = -1;
-+  mbstate_t mbs;
-+  wchar_t wc;
-+  int patterns_left;
-+
-+  assert (match_icase && f_i_multibyte == 1);
-+  assert (MB_CUR_MAX > 1);
-+
-+  memset (&mbs, '\0', sizeof (mbs));
-+  memset (Fimb.match, '\1', Fimb.count);
-+  letter = len = 0;
-+  patterns_left = 1;
-+  while (patterns_left && len <= size)
-+    {
-+      size_t c;
-+
-+      patterns_left = 0;
-+      if (len < size)
-+	{
-+	  c = mbrtowc (&wc, buf + len, size - len, &mbs);
-+	  if (c + 2 <= 2)
-+	    return ret;
-+
-+	  wc = towlower (wc);
-+	}
-+      else
-+	{
-+	  c = 1;
-+	  wc = L'\0';
-+	}
-+
-+      for (i = 0; i < Fimb.count; i++)
-+	{
-+	  if (Fimb.match[i])
-+	    {
-+	      if (Fimb.patterns[i][letter] == L'\0')
-+		{
-+		  /* Found a match. */
-+		  *plen = len;
-+		  if (!exact && !match_words)
-+		    return 0;
-+		  else
-+		    {
-+		      /* For -w or exact look for longest match.  */
-+		      ret = 0;
-+		      Fimb.match[i] = '\0';
-+		      continue;
-+		    }
-+		}
-+
-+	      if (Fimb.patterns[i][letter] == wc)
-+		patterns_left = 1;
-+	      else
-+		Fimb.match[i] = '\0';
-+	    }
-+	}
-+
-+      len += c;
-+      letter++;
-+    }
-+
-+  return ret;
-+}
-+#endif /* MBS_SUPPORT */
-+
- EXECUTE_FCT(Fexecute)
- {
-   register char const *beg, *try, *end;
-@@ -519,69 +855,256 @@
-   struct kwsmatch kwsmatch;
-   size_t ret_val;
- #ifdef MBS_SUPPORT
--  char *mb_properties = NULL;
--  if (MB_CUR_MAX > 1)
--    {
--      if (match_icase)
--        {
--          char *case_buf = xmalloc(size);
--          memcpy(case_buf, buf, size);
--	  if (start_ptr)
--	    start_ptr = case_buf + (start_ptr - buf);
--          buf = case_buf;
--        }
--      mb_properties = check_multibyte_string(buf, size);
--    }
-+  int mb_cur_max = MB_CUR_MAX;
-+  mbstate_t mbs;
-+  memset (&mbs, '\0', sizeof (mbstate_t));
-+  const char *last_char = NULL;
- #endif /* MBS_SUPPORT */
- 
-   for (beg = start_ptr ? start_ptr : buf; beg <= buf + size; beg++)
-     {
-       size_t offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch);
-       if (offset == (size_t) -1)
--	goto failure;
-+	return offset;
- #ifdef MBS_SUPPORT
--      if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0)
--	continue; /* It is a part of multibyte character.  */
-+      if (mb_cur_max > 1 && !using_utf8)
-+	{
-+	  size_t bytes_left = offset;
-+	  while (bytes_left)
-+	    {
-+	      size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+	      last_char = beg;
-+	      if (mlen == (size_t) -1 || mlen == 0)
-+		{
-+		  /* Incomplete character: treat as single-byte. */
-+		  memset (&mbs, '\0', sizeof (mbstate_t));
-+		  beg++;
-+		  bytes_left--;
-+		  continue;
-+		}
-+
-+	      if (mlen == (size_t) -2)
-+		/* Offset points inside multibyte character: no good. */
-+		break;
-+
-+	      beg += mlen;
-+	      bytes_left -= mlen;
-+	    }
-+
-+	  if (bytes_left)
-+	    continue;
-+	}
-+      else
- #endif /* MBS_SUPPORT */
-       beg += offset;
-+#ifdef MBS_SUPPORT
-+      /* For f_i_multibyte, the string at beg now matches first 3 chars of
-+	 one of the search strings (less if there are shorter search strings).
-+	 See if this is a real match.  */
-+      if (f_i_multibyte
-+	  && Fimbexec (beg, buf + size - beg, &kwsmatch.size[0], start_ptr == NULL))
-+	goto next_char;
-+#endif /* MBS_SUPPORT */
-       len = kwsmatch.size[0];
-       if (start_ptr && !match_words)
- 	goto success_in_beg_and_len;
-       if (match_lines)
- 	{
- 	  if (beg > buf && beg[-1] != eol)
--	    continue;
-+	    goto next_char;
- 	  if (beg + len < buf + size && beg[len] != eol)
--	    continue;
-+	    goto next_char;
- 	  goto success;
- 	}
-       else if (match_words)
--	for (try = beg; len; )
--	  {
--	    if (try > buf && WCHAR((unsigned char) try[-1]))
--	      break;
--	    if (try + len < buf + size && WCHAR((unsigned char) try[len]))
--	      {
--		offset = kwsexec (kwset, beg, --len, &kwsmatch);
--		if (offset == (size_t) -1)
--		  break;
--		try = beg + offset;
--		len = kwsmatch.size[0];
--	      }
--	    else if (!start_ptr)
--	      goto success;
--	    else
--	      goto success_in_beg_and_len;
--	  } /* for (try) */
--      else
-+	{
-+	  while (len)
-+	    {
-+	      int word_match = 0;
-+	      if (beg > buf)
-+		{
-+#ifdef MBS_SUPPORT
-+		  if (mb_cur_max > 1)
-+		    {
-+		      const char *s;
-+		      int mr;
-+		      wchar_t pwc;
-+
-+		      if (using_utf8)
-+			{
-+			  s = beg - 1;
-+			  while (s > buf
-+				 && (unsigned char) *s >= 0x80
-+				 && (unsigned char) *s <= 0xbf)
-+			    --s;
-+			}
-+		      else
-+			s = last_char;
-+		      mr = mbtowc (&pwc, s, beg - s);
-+		      if (mr <= 0)
-+			memset (&mbs, '\0', sizeof (mbstate_t));
-+		      else if ((iswalnum (pwc) || pwc == L'_')
-+			       && mr == (int) (beg - s))
-+			goto next_char;
-+		    }
-+		  else
-+#endif /* MBS_SUPPORT */
-+		  if (WCHAR ((unsigned char) beg[-1]))
-+		    goto next_char;
-+		}
-+#ifdef MBS_SUPPORT
-+	      if (mb_cur_max > 1)
-+		{
-+		  wchar_t nwc;
-+		  int mr;
-+
-+		  mr = mbtowc (&nwc, beg + len, buf + size - beg - len);
-+		  if (mr <= 0)
-+		    {
-+		      memset (&mbs, '\0', sizeof (mbstate_t));
-+		      word_match = 1;
-+		    }
-+		  else if (!iswalnum (nwc) && nwc != L'_')
-+		    word_match = 1;
-+		}
-+	      else
-+#endif /* MBS_SUPPORT */
-+		if (beg + len >= buf + size || !WCHAR ((unsigned char) beg[len]))
-+		  word_match = 1;
-+	      if (word_match)
-+		{
-+		  if (start_ptr == NULL)
-+		    /* Returns the whole line now we know there's a word match. */
-+		    goto success;
-+		  else {
-+		    /* Returns just this word match. */
-+		    *match_size = len;
-+		    return beg - buf;
-+		  }
-+		}
-+	      if (len > 0)
-+		{
-+		  /* Try a shorter length anchored at the same place. */
-+		  --len;
-+		  offset = kwsexec (kwset, beg, len, &kwsmatch);
-+
-+		  if (offset == -1)
-+		    goto next_char; /* Try a different anchor. */
-+#ifdef MBS_SUPPORT
-+
-+		  if (mb_cur_max > 1 && !using_utf8)
-+		    {
-+		      size_t bytes_left = offset;
-+		      while (bytes_left)
-+			{
-+			  size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+			  last_char = beg;
-+			  if (mlen == (size_t) -1 || mlen == 0)
-+			    {
-+			      /* Incomplete character: treat as single-byte. */
-+			      memset (&mbs, '\0', sizeof (mbstate_t));
-+			      beg++;
-+			      bytes_left--;
-+			      continue;
-+			    }
-+
-+			  if (mlen == (size_t) -2)
-+			    {
-+			      /* Offset points inside multibyte character:
-+			       * no good. */
-+			      break;
-+			    }
-+
-+			  beg += mlen;
-+			  bytes_left -= mlen;
-+			}
-+
-+		      if (bytes_left)
-+			{
-+			  memset (&mbs, '\0', sizeof (mbstate_t));
-+			  goto next_char; /* Try a different anchor. */
-+			}
-+		    }
-+		  else
-+#endif /* MBS_SUPPORT */
-+		  beg += offset;
-+#ifdef MBS_SUPPORT
-+		  /* The string at beg now matches first 3 chars of one of
-+		     the search strings (less if there are shorter search
-+		     strings).  See if this is a real match.  */
-+		  if (f_i_multibyte
-+		      && Fimbexec (beg, len - offset, &kwsmatch.size[0],
-+				   start_ptr == NULL))
-+		    goto next_char;
-+#endif /* MBS_SUPPORT */
-+		  len = kwsmatch.size[0];
-+		}
-+	    }
-+	}
-+       else
- 	goto success;
--    } /* for (beg in buf) */
-+next_char:;
-+#ifdef MBS_SUPPORT
-+      /* Advance to next character.  For MB_CUR_MAX == 1 case this is handled
-+	 by ++beg above.  */
-+      if (mb_cur_max > 1)
-+	{
-+	  if (using_utf8)
-+	    {
-+	      unsigned char c = *beg;
-+	      if (c >= 0xc2)
-+		{
-+		  if (c < 0xe0)
-+		    ++beg;
-+		  else if (c < 0xf0)
-+		    beg += 2;
-+		  else if (c < 0xf8)
-+		    beg += 3;
-+		  else if (c < 0xfc)
-+		    beg += 4;
-+		  else if (c < 0xfe)
-+		    beg += 5;
-+		}
-+	    }
-+	  else
-+	    {
-+	      size_t l = mbrlen (beg, buf + size - beg, &mbs);
- 
-- failure:
--  ret_val = -1;
--  goto out;
-+	      last_char = beg;
-+	      if (l + 2 >= 2)
-+		beg += l - 1;
-+	      else
-+		memset (&mbs, '\0', sizeof (mbstate_t));
-+	    }
-+	}
-+#endif /* MBS_SUPPORT */
-+    }
-+
-+  return -1;
- 
-  success:
-+#ifdef MBS_SUPPORT
-+  if (mb_cur_max > 1 && !using_utf8)
-+    {
-+      end = beg + len;
-+      while (end < buf + size)
-+	{
-+	  size_t mlen = mbrlen (end, buf + size - end, &mbs);
-+	  if (mlen == (size_t) -1 || mlen == (size_t) -2 || mlen == 0)
-+	    {
-+	      memset (&mbs, '\0', sizeof (mbstate_t));
-+	      mlen = 1;
-+	    }
-+	  if (mlen == 1 && *end == eol)
-+	    break;
-+
-+	  end += mlen;
-+	}
-+     }
-+  else
-+ #endif /* MBS_SUPPORT */
-   end = memchr (beg + len, eol, (buf + size) - (beg + len));
-   end++;
-   while (buf < beg && beg[-1] != eol)
-@@ -591,15 +1114,6 @@
-   *match_size = len;
-   ret_val = beg - buf;
-  out:
--#ifdef MBS_SUPPORT
--  if (MB_CUR_MAX > 1)
--    {
--      if (match_icase)
--        free((char*)buf);
--      if (mb_properties)
--        free(mb_properties);
--    }
--#endif /* MBS_SUPPORT */
-   return ret_val;
- }
- #endif /* defined(GREP_PROGRAM) || defined(FGREP_PROGRAM) */
diff --git a/patches/grep-2.6.3-fixes-1.patch b/patches/grep-2.6.3-fixes-1.patch
new file mode 100644
index 0000000..d0c9794
--- /dev/null
+++ b/patches/grep-2.6.3-fixes-1.patch
@@ -0,0 +1,325 @@
+Submitted By: Joe Ciccone
+Date: 2010-08-03
+Initial Package Version: 2.6.3
+Upstream Status: Unknown
+Origin: http://ftp.de.debian.org/debian/pool/main/g/grep/grep_2.6.3-3.debian.tar.bz2
+Description: Various fixes from debian for Grep
+
+diff -Naur grep-2.6.3.orig/NEWS grep-2.6.3/NEWS
+--- grep-2.6.3.orig/NEWS	2010-04-02 04:55:33.000000000 -0400
++++ grep-2.6.3/NEWS	2010-08-03 22:11:08.142326516 -0400
+@@ -1,5 +1,8 @@
+ GNU grep NEWS                                    -*- outline -*-
+ 
++  --mmap was meant to be ignored in 2.6.x, but it was instead
++  removed by mistake.  [bug introduced in 2.6]
++
+ * Noteworthy changes in release 2.6.3 (2010-04-02) [stable]
+ 
+ ** Bug fixes
+diff -Naur grep-2.6.3.orig/configure grep-2.6.3/configure
+--- grep-2.6.3.orig/configure	2010-04-02 04:56:49.000000000 -0400
++++ grep-2.6.3/configure	2010-08-03 22:11:08.137850711 -0400
+@@ -24372,13 +24372,14 @@
+ if test "$ac_res" != no; then :
+   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+   test "$ac_cv_search_pcre_compile" = "none required" ||
+-	 LIB_PCRE=$ac_cv_search_pcre_compile
++	 LIB="-ldl $LIBS"
+ fi
+ 
+       for ac_func in pcre_compile
+ do :
+   ac_fn_c_check_func "$LINENO" "pcre_compile" "ac_cv_func_pcre_compile"
+ if test "x$ac_cv_func_pcre_compile" = x""yes; then :
++  CPPFLAGS="$CPPFLAGS -DHAVE_DYNAMIC_LIBPCRE"
+   cat >>confdefs.h <<_ACEOF
+ #define HAVE_PCRE_COMPILE 1
+ _ACEOF
+diff -Naur grep-2.6.3.orig/doc/grep.in.1 grep-2.6.3/doc/grep.in.1
+--- grep-2.6.3.orig/doc/grep.in.1	2010-04-01 04:15:35.000000000 -0400
++++ grep-2.6.3/doc/grep.in.1	2010-08-03 22:11:08.137850711 -0400
+@@ -25,7 +25,7 @@
+ .hy 0
+ .
+ .SH NAME
+-grep, egrep, fgrep \- print lines matching a pattern
++grep, egrep, fgrep, rgrep \- print lines matching a pattern
+ .
+ .SH SYNOPSIS
+ .B grep
+@@ -56,10 +56,11 @@
+ .B grep
+ prints the matching lines.
+ .PP
+-In addition, two variant programs
+-.B egrep
+-and
++In addition, three variant programs
++.B egrep,
+ .B fgrep
++and
++.B rgrep
+ are available.
+ .B egrep
+ is the same as
+@@ -67,6 +68,9 @@
+ .B fgrep
+ is the same as
+ .BR "grep\ \-F" .
++.B rgrep
++is the same as
++.BR "grep\ \-r" .
+ Direct invocation as either
+ .B egrep
+ or
+@@ -825,7 +829,7 @@
+ is not special if it would be the start of an invalid interval
+ specification.
+ For example, the command
+-.B "grep\ \-E\ '{1'"
++.B "grep\ \-E\ \(aq{1\(aq"
+ searches for the two-character string
+ .B {1
+ instead of reporting a syntax error in the regular expression.
+@@ -865,7 +869,7 @@
+ For example, if
+ .B GREP_OPTIONS
+ is
+-.BR "'\-\^\-binary-files=without-match \-\^\-directories=skip'" ,
++.BR "\(aq\-\^\-binary-files=without-match \-\^\-directories=skip\(aq" ,
+ .B grep
+ behaves as if the two options
+ .B \-\^\-binary\-files=without-match
+@@ -1160,23 +1164,9 @@
+ is not set.
+ .
+ .SH "EXIT STATUS"
+-Normally, the exit status is 0 if selected lines are found and 1 otherwise.
+-But the exit status is 2 if an error occurred, unless the
+-.B \-q
+-or
+-.B \-\^\-quiet
+-or
+-.B \-\^\-silent
+-option is used and a selected line is found.
+-Note, however, that \s-1POSIX\s0 only mandates, for programs such as
+-.BR grep ,
+-.BR cmp ,
+-and
+-.BR diff ,
+-that the exit status in case of error be greater than 1;
+-it is therefore advisable, for the sake of portability,
+-to use logic that tests for this general condition
+-instead of strict equality with\ 2.
++The exit status is 0 if selected lines are found, and 1 if not found.          
++If an error occurred the exit status is 2.  (Note: POSIX error 
++handling code should check for '2' or greater.)
+ .
+ .SH COPYRIGHT
+ Copyright 1998-2000, 2002, 2005-2010 Free Software Foundation, Inc.
+diff -Naur grep-2.6.3.orig/po/ca.po grep-2.6.3/po/ca.po
+--- grep-2.6.3.orig/po/ca.po	2010-04-02 04:57:08.000000000 -0400
++++ grep-2.6.3/po/ca.po	2010-08-03 22:11:08.137850711 -0400
+@@ -278,7 +278,7 @@
+ #: src/main.c:1165
+ #, c-format
+ msgid "Binary file %s matches\n"
+-msgstr "Concidència en el fitxer binari %s\n"
++msgstr "Coincidència en el fitxer binari %s\n"
+ 
+ #: src/main.c:1179
+ msgid "(standard input)"
+diff -Naur grep-2.6.3.orig/src/kwset.c grep-2.6.3/src/kwset.c
+--- grep-2.6.3.orig/src/kwset.c	2010-04-01 04:15:35.000000000 -0400
++++ grep-2.6.3/src/kwset.c	2010-08-03 22:11:08.142326516 -0400
+@@ -40,7 +40,7 @@
+ #ifdef GREP
+ # include "xalloc.h"
+ # undef malloc
+-# define malloc(s) xmalloc(s)
++# define malloc xmalloc
+ #endif
+ 
+ #define NCHAR (UCHAR_MAX + 1)
+diff -Naur grep-2.6.3.orig/src/main.c grep-2.6.3/src/main.c
+--- grep-2.6.3.orig/src/main.c	2010-04-01 12:52:10.000000000 -0400
++++ grep-2.6.3/src/main.c	2010-08-03 22:11:08.142326516 -0400
+@@ -266,6 +266,12 @@
+ static char const short_options[] =
+ "0123456789A:B:C:D:EFGHIPTUVX:abcd:e:f:hiKLlm:noqRrsuvwxyZz";
+ 
++/* Default for `file_list' if no files are given on the command line. */
++static char *stdin_argv[] =
++{
++  "-", NULL
++};
++
+ /* Non-boolean long options that have no corresponding short equivalents.  */
+ enum
+ {
+@@ -511,7 +517,16 @@
+ 	 for byte sentinels fore and aft.  */
+       newalloc = newsize + pagesize + 1;
+ 
+-      newbuf = bufalloc < newalloc ? xmalloc (bufalloc = newalloc) : buffer;
++      newbuf = bufalloc < newalloc ? malloc (bufalloc = newalloc) : buffer;
++      if (newbuf == NULL)
++	{
++	  int saved_errno = errno;
++	  free (buffer);
++	  bufalloc = ALIGN_TO (INITIAL_BUFSIZE, pagesize) + pagesize + 1;
++	  buffer = xmalloc (bufalloc);
++	  errno = saved_errno;
++	  return 0;
++	}
+       readbuf = ALIGN_TO (newbuf + 1 + save, pagesize);
+       bufbeg = readbuf - save;
+       memmove (bufbeg, buffer + saved_offset, save);
+@@ -1739,6 +1754,7 @@
+   int opt, cc, status;
+   int default_context;
+   FILE *fp;
++  char **file_list;
+ 
+   initialize_main (&argc, &argv);
+   set_program_name (argv[0]);
+@@ -2061,6 +2077,7 @@
+ 	label = optarg;
+ 	break;
+ 
++      case MMAP_OPTION:
+       case 0:
+ 	/* long options */
+ 	break;
+@@ -2154,29 +2171,29 @@
+   if (max_count == 0)
+     exit (EXIT_FAILURE);
+ 
+-  if (optind < argc)
++  file_list = (optind == argc ? stdin_argv : &argv[optind]);
++
++  status = 1;
++  while (1)
+     {
+-	status = 1;
+-	do
+-	{
+-	  char *file = argv[optind];
+-	  if ((included_patterns || excluded_patterns)
+-	      && !isdir (file))
+-	    {
+-	      if (included_patterns &&
+-		  ! excluded_file_name (included_patterns, file))
+-		continue;
+-	      if (excluded_patterns &&
+-		  excluded_file_name (excluded_patterns, file))
+-		continue;
+-	    }
+-	  status &= grepfile (strcmp (file, "-") == 0 ? (char *) NULL : file,
+-			      &stats_base);
+-	}
+-	while ( ++optind < argc);
++	char *file = *file_list++;
++
++	if (file == NULL)
++	  break;
++
++	if ((included_patterns || excluded_patterns)
++	   && !isdir (file))
++	  {
++	    if (included_patterns &&
++	        ! excluded_file_name (included_patterns, file))
++	      continue;
++	    if (excluded_patterns &&
++	        excluded_file_name (excluded_patterns, file))
++	      continue;
++	  }
++	status &= grepfile (strcmp (file, "-") == 0
++			   ? (char *) NULL : file, &stats_base);
+     }
+-  else
+-    status = grepfile ((char *) NULL, &stats_base);
+ 
+   /* We register via atexit() to test stdout.  */
+   exit (errseen ? EXIT_TROUBLE : status);
+diff -Naur grep-2.6.3.orig/src/pcresearch.c grep-2.6.3/src/pcresearch.c
+--- grep-2.6.3.orig/src/pcresearch.c	2010-04-01 04:15:35.000000000 -0400
++++ grep-2.6.3/src/pcresearch.c	2010-08-03 22:11:08.137850711 -0400
+@@ -22,8 +22,14 @@
+ #include "search.h"
+ #if HAVE_PCRE_H
+ # include <pcre.h>
++# ifdef HAVE_DYNAMIC_LIBPCRE
++#  include <dlfcn.h>
++# endif
+ #elif HAVE_PCRE_PCRE_H
+ # include <pcre/pcre.h>
++# ifdef HAVE_DYNAMIC_LIBPCRE
++#  include <dlfcn.h>
++# endif
+ #endif
+ 
+ #if HAVE_LIBPCRE
+@@ -34,6 +40,50 @@
+ static pcre_extra *extra;
+ #endif
+ 
++#ifdef HAVE_DYNAMIC_LIBPCRE
++
++# define pcre_compile dl_pcre_compile
++# define pcre_study dl_pcre_study
++# define pcre_exec dl_pcre_exec
++# define pcre_maketables dl_pcre_maketables
++
++static pcre *(*pcre_compile)(const char *pattern, int options,
++const char **errptr, int *erroffset,
++                               const unsigned char *tableptr);
++static pcre_extra *(*pcre_study)(const pcre *code, int options,
++                                   const char **errptr);
++static int (*pcre_exec)(const pcre *code, const pcre_extra *extra,
++                          const char *subject, int length, int startoffset,
++                          int options, int *ovector, int ovecsize);
++static const unsigned char *(*pcre_maketables)(void);
++
++static int
++map_pcre(void)
++{
++  void *library;
++
++  if (pcre_maketables)
++    return 1;
++
++  if (!(library = dlopen("libpcre.so.3", RTLD_NOW)))
++    return 0;
++
++  if (!(pcre_compile = dlsym(library, "pcre_compile")))
++    return 0;
++  if (!(pcre_study = dlsym(library, "pcre_study")))
++    return 0;
++  if (!(pcre_exec = dlsym(library, "pcre_exec")))
++    return 0;
++  if (!(pcre_maketables = dlsym(library, "pcre_maketables")))
++    return 0;
++
++  return 1;
++}
++
++#else
++#define map_pcre() (1)
++#endif /* HAVE_DYNAMIC_LIBPCRE */
++
+ void
+ Pcompile (char const *pattern, size_t size)
+ {
+@@ -51,6 +101,10 @@
+   char const *p;
+   char const *pnul;
+ 
++  if (!map_pcre ())
++    error (EXIT_TROUBLE, 0, "%s",
++	   _("The -P option is not supported: libpcre.so.3 is not available"));
++
+   /* FIXME: Remove these restrictions.  */
+   if (memchr(pattern, '\n', size))
+     error (EXIT_TROUBLE, 0, _("the -P option only supports a single pattern"));

commit 4ff3f92f9349a69791ba9131795f724845b37d47
Author: Joe Ciccone <jciccone at gmail.com>
Date:   Tue Aug 3 22:01:04 2010 -0400

    Drop the i18n patch for diffutils and change build commands for 3.0.0.

diff --git a/BOOK/final-system/common/diffutils.xml b/BOOK/final-system/common/diffutils.xml
index cc5a438..8d3ab9d 100644
--- a/BOOK/final-system/common/diffutils.xml
+++ b/BOOK/final-system/common/diffutils.xml
@@ -25,10 +25,6 @@
   <sect2 role="installation">
     <title>Installation of Diffutils</title>
 
-    <para os="p1">This patch adds support for Internationalization:</para>
-
-<screen os="p2"><userinput>patch -Np1 -i ../&diffutils-i18n-patch;</userinput></screen>
-
     <para os="a">Prepare Diffutils for compilation:</para>
 
 <screen os="b"><userinput>./configure --prefix=/usr</userinput></screen>
@@ -36,13 +32,7 @@
     <para os="s1">Diffutils wants <command>ed</command> as the default editor.
     The following sed will change the default to <command>vim</command>:</para>
 
-<screen os="s2"><userinput>sed -i 's@\(^#define DEFAULT_EDITOR_PROGRAM \).*@\1"vi"@' config.h</userinput></screen>
-
-    <para os="s3">Diffutils man-pages want to be recreated, but it requires
-    help2man. So we update the time on the files to prevent them from being
-    recreated:</para>
-
-<screen os="s4"><userinput>touch man/*.1</userinput></screen>
+<screen os="s2"><userinput>sed -i 's@\(^#define DEFAULT_EDITOR_PROGRAM \).*@\1"vi"@' lib/config.h</userinput></screen>
 
     <para os="c">Compile the package:</para>
 
diff --git a/BOOK/final-system/multilib/diffutils.xml b/BOOK/final-system/multilib/diffutils.xml
index fb6943d..b347214 100644
--- a/BOOK/final-system/multilib/diffutils.xml
+++ b/BOOK/final-system/multilib/diffutils.xml
@@ -23,14 +23,6 @@
 
     <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
     href="../common/diffutils.xml"
-    xpointer="xpointer(//*[@os='p1'])"/>
-
-    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
-    href="../common/diffutils.xml"
-    xpointer="xpointer(//*[@os='p2'])"/>
-
-    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
-    href="../common/diffutils.xml"
     xpointer="xpointer(//*[@os='a'])"/>
 
 <screen os="b"><userinput>CC="gcc ${BUILD64}" ./configure --prefix=/usr</userinput></screen>
@@ -45,14 +37,6 @@
 
     <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
     href="../common/diffutils.xml"
-    xpointer="xpointer(//*[@os='s3'])"/>
-
-    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
-    href="../common/diffutils.xml"
-    xpointer="xpointer(//*[@os='s4'])"/>
-
-    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
-    href="../common/diffutils.xml"
     xpointer="xpointer(//*[@os='c'])"/>
 
     <xi:include xmlns:xi="http://www.w3.org/2003/XInclude"
diff --git a/BOOK/materials/common/patches.xml b/BOOK/materials/common/patches.xml
index 9717019..f8cdacd 100644
--- a/BOOK/materials/common/patches.xml
+++ b/BOOK/materials/common/patches.xml
@@ -37,15 +37,6 @@
     </varlistentry>
 
     <varlistentry>
-      <term>Diffutils i18n Patch - <token>&diffutils-i18n-patch-size;</token>:</term>
-      <listitem>
-        <para>Download: <ulink
-        url="&patches-root;&diffutils-i18n-patch;"/></para>
-        <para>MD5 sum: <literal>&diffutils-i18n-patch-md5;</literal></para>
-      </listitem>
-    </varlistentry>
-
-    <varlistentry>
       <term>EGLIBC Fixes Patch - <token>&eglibc-fixes-patch-size;</token>:</term>
       <listitem>
         <para>Download: <ulink
diff --git a/BOOK/patches.ent b/BOOK/patches.ent
index 525a3b0..bbf2d82 100644
--- a/BOOK/patches.ent
+++ b/BOOK/patches.ent
@@ -12,10 +12,6 @@
 <!ENTITY coreutils-uname-patch-md5 "b2e0649d3f22a631fff96667baeab971">
 <!ENTITY coreutils-uname-patch-size "8 KB">
 
-<!ENTITY diffutils-i18n-patch "diffutils-&diffutils-version;-i18n-1.patch">
-<!ENTITY diffutils-i18n-patch-md5 "2e176c390bf4dca2fb088e0a16261a96">
-<!ENTITY diffutils-i18n-patch-size "17 KB">
-
 <!ENTITY eglibc-fixes-patch "eglibc-&eglibc-version;-&eglibc-date;-r&eglibc-revision;-fixes-1.patch">
 <!ENTITY eglibc-fixes-patch-md5 "36593dc2394852253ff0ff1afa7f2009">
 <!ENTITY eglibc-fixes-patch-size "2 KB">
diff --git a/patches/diffutils-2.8.7-i18n-1.patch b/patches/diffutils-2.8.7-i18n-1.patch
deleted file mode 100644
index 9d0f29f..0000000
--- a/patches/diffutils-2.8.7-i18n-1.patch
+++ /dev/null
@@ -1,808 +0,0 @@
-Submitted By: Jim Gifford <jim at cross-lfs dot org>
-Date: 2009-01-08
-Initial Package Version: 2.8.7
-Upstream Status: Unkown
-Origin: Mandriva
-Description: i18n Updates
-
-diff -Naur diffutils-2.8.7.orig/src/diff.c diffutils-2.8.7/src/diff.c
---- diffutils-2.8.7.orig/src/diff.c	2004-04-12 00:44:35.000000000 -0700
-+++ diffutils-2.8.7/src/diff.c	2009-01-08 13:26:42.000000000 -0800
-@@ -273,6 +273,13 @@
-   re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);
-   excluded = new_exclude ();
- 
-+#ifdef HANDLE_MULTIBYTE
-+  if (MB_CUR_MAX > 1)
-+    lines_differ = lines_differ_multibyte;
-+  else
-+#endif
-+    lines_differ = lines_differ_singlebyte;
-+
-   /* Decode the options.  */
- 
-   while ((c = getopt_long (argc, argv, shortopts, longopts, 0)) != -1)
-diff -Naur diffutils-2.8.7.orig/src/diff.h diffutils-2.8.7/src/diff.h
---- diffutils-2.8.7.orig/src/diff.h	2004-04-12 00:44:35.000000000 -0700
-+++ diffutils-2.8.7/src/diff.h	2009-01-08 13:26:42.000000000 -0800
-@@ -25,6 +25,19 @@
- #include <stdio.h>
- #include <unlocked-io.h>
- 
-+/* For platform which support the ISO C amendement 1 functionality we
-+   support user defined character classes.  */
-+#if defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H
-+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-+# include <wchar.h>
-+# include <wctype.h>
-+/* # if defined (HAVE_MBRTOWC) */
-+#  define HANDLE_MULTIBYTE      1
-+/* # endif */
-+#endif
-+
-+#define TAB_WIDTH 8
-+
- /* What kind of changes a hunk contains.  */
- enum changes
- {
-@@ -352,7 +365,13 @@
- extern char const pr_program[];
- char *concat (char const *, char const *, char const *);
- char *dir_file_pathname (char const *, char const *);
--bool lines_differ (char const *, char const *);
-+
-+bool (*lines_differ) (char const *, char const *);
-+bool lines_differ_singlebyte (char const *, char const *);
-+#ifdef HANDLE_MULTIBYTE
-+bool lines_differ_multibyte (char const *, char const *);
-+#endif
-+
- lin translate_line_number (struct file_data const *, lin);
- struct change *find_change (struct change *);
- struct change *find_reverse_change (struct change *);
-diff -Naur diffutils-2.8.7.orig/src/io.c diffutils-2.8.7/src/io.c
---- diffutils-2.8.7.orig/src/io.c	2004-04-12 00:44:35.000000000 -0700
-+++ diffutils-2.8.7/src/io.c	2009-01-08 13:26:42.000000000 -0800
-@@ -25,6 +25,7 @@
- #include <file-type.h>
- #include <setmode.h>
- #include <xalloc.h>
-+#include <assert.h>
- 
- /* Rotate an unsigned value to the left.  */
- #define ROL(v, n) ((v) << (n) | (v) >> (sizeof (v) * CHAR_BIT - (n)))
-@@ -212,6 +213,28 @@
- 
- /* Split the file into lines, simultaneously computing the equivalence
-    class for each line.  */
-+#ifdef HANDLE_MULTIBYTE
-+# define MBC2WC(P, END, MBLENGTH, WC, STATE, CONVFAIL)			\
-+do									\
-+{									\
-+    mbstate_t state_bak = STATE;					\
-+									\
-+    CONVFAIL = 0;							\
-+    MBLENGTH = mbrtowc (&WC, P, END - (char const *)P, &STATE);		\
-+									\
-+    switch (MBLENGTH)							\
-+      {									\
-+      case (size_t)-2:							\
-+      case (size_t)-1:							\
-+	STATE = state_bak;						\
-+	++CONVFAIL;							\
-+	  /* Fall through. */						\
-+      case 0:								\
-+	MBLENGTH = 1;							\
-+      }									\
-+}									\
-+while (0)
-+#endif
- 
- static void
- find_and_hash_each_line (struct file_data *current)
-@@ -238,12 +261,280 @@
-   bool same_length_diff_contents_compare_anyway =
-     diff_length_compare_anyway | ignore_case;
- 
-+#ifdef HANDLE_MULTIBYTE
-+  wchar_t   wc;
-+  size_t    mblength;
-+  mbstate_t state;
-+  int       convfail;
-+  
-+  memset (&state, '\0', sizeof (mbstate_t));
-+#endif
-+
-   while (p < suffix_begin)
-     {
-       char const *ip = p;
- 
-       h = 0;
-+#ifdef HANDLE_MULTIBYTE
-+      if (MB_CUR_MAX > 1)
-+	{
-+	  wchar_t   lo_wc;
-+	  char	    mbc[MB_LEN_MAX];
-+	  mbstate_t state_wc;
-+
-+	  /* Hash this line until we find a newline.  */
-+	  switch (ignore_white_space)
-+	    {
-+	    case IGNORE_ALL_SPACE:
-+	      while (1)
-+		{
-+		  if (*p == '\n')
-+		    {
-+		      ++p;
-+		      break;
-+		    }
-+
-+		  MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
-+
-+		  if (convfail)
-+		    mbc[0] = *p++;
-+		  else if (!iswspace (wc))
-+		    {
-+		      bool flag = 0;
-+
-+		      if (ignore_case)
-+			{
-+			  lo_wc = towlower (wc);
-+			  if (lo_wc != wc)
-+			    {
-+			      flag = 1;
-+
-+			      p += mblength;
-+			      memset (&state_wc, '\0', sizeof(mbstate_t));
-+			      mblength = wcrtomb (mbc, lo_wc, &state_wc);
-+
-+			      assert (mblength != (size_t)-1 &&
-+				  mblength != (size_t)-2);
-+
-+			      mblength = (mblength < 1) ? 1 : mblength;
-+			    }
-+			}
-+
-+		      if (!flag)
-+			{
-+			  for (i = 0; i < mblength; i++)
-+			    mbc[i] =  *p++;
-+			}
-+		    }
-+		  else
-+		    {
-+		      p += mblength;
-+		      continue;
-+		    }
-+
-+		  for (i = 0; i < mblength; i++)
-+		    h = HASH (h, mbc[i]);
-+		}
-+	      break;
-+
-+	    case IGNORE_SPACE_CHANGE:
-+	      while (1)
-+		{
-+		  if (*p == '\n')
-+		    {
-+		      ++p;
-+		      break;
-+		    }
- 
-+		  MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
-+
-+		  if (!convfail && iswspace (wc))
-+		    {
-+		      while (1)
-+			{
-+			  if (*p == '\n')
-+			    {
-+			      ++p;
-+			      goto hashing_done;
-+			    }
-+
-+			  p += mblength;
-+			  MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
-+			  if (convfail || (!convfail && !iswspace (wc)))
-+			    break;
-+			}
-+		      h = HASH (h, ' ');
-+		    }
-+
-+		  /* WC is now the first non-space.  */
-+		  if (convfail)
-+		    mbc[0] = *p++;
-+		  else
-+		    {
-+		      bool flag = 0;
-+
-+		      if (ignore_case)
-+			{
-+			  lo_wc = towlower (wc);
-+			  if (lo_wc != wc)
-+			    {
-+			      flag = 1;
-+
-+			      p += mblength;
-+			      memset (&state_wc, '\0', sizeof(mbstate_t));
-+			      mblength = wcrtomb (mbc, lo_wc, &state_wc);
-+
-+			      assert (mblength != (size_t)-1 &&
-+				  mblength != (size_t)-2);
-+
-+			      mblength = (mblength < 1) ? 1 : mblength;
-+			    }
-+			}
-+
-+		      if (!flag)
-+			{
-+			  for (i = 0; i < mblength; i++)
-+			    mbc[i] = *p++;
-+			}
-+		    }
-+
-+		  for (i = 0; i < mblength; i++)
-+		    h = HASH (h, mbc[i]);
-+		}
-+	      break;
-+
-+	    case IGNORE_TAB_EXPANSION:
-+		{
-+		  size_t column = 0;
-+
-+		  while (1)
-+		    {
-+		      if (*p == '\n')
-+			{
-+			  ++p;
-+			  break;
-+			}
-+
-+		      MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
-+
-+		      if (convfail)
-+			{
-+			  h = HASH (h, *p++);
-+			  ++column;
-+			}
-+		      else
-+			{
-+			  bool flag;
-+
-+			  switch (wc)
-+			    {
-+			    case L'\b':
-+			      column -= 0 < column;
-+			      h = HASH (h, '\b');
-+			      ++p;
-+			      break;
-+
-+			    case L'\t':
-+				{
-+				  int repetitions;
-+
-+				  repetitions = TAB_WIDTH - column % TAB_WIDTH;
-+				  column += repetitions;
-+				  do
-+				    h = HASH (h, ' ');
-+				  while (--repetitions != 0);
-+				  ++p;
-+				}
-+			      break;
-+
-+			    case L'\r':
-+			      column = 0;
-+			      h = HASH (h, '\r');
-+			      ++p;
-+			      break;
-+
-+			    default:
-+			      flag = 0;
-+			      column += wcwidth (wc);
-+			      if (ignore_case)
-+				{
-+				  lo_wc = towlower (wc);
-+				  if (lo_wc != wc)
-+				    {
-+				      flag = 1;
-+				      p += mblength;
-+				      memset (&state_wc, '\0', sizeof(mbstate_t));
-+				      mblength = wcrtomb (mbc, lo_wc, &state_wc);
-+
-+				      assert (mblength != (size_t)-1 &&
-+					  mblength != (size_t)-2);
-+
-+				      mblength = (mblength < 1) ? 1 : mblength;
-+				    }
-+				}
-+
-+			      if (!flag)
-+				{
-+				  for (i = 0; i < mblength; i++)
-+				    mbc[i] = *p++;
-+				}
-+
-+			      for (i = 0; i < mblength; i++)
-+				h = HASH (h, mbc[i]);
-+			    }
-+			}
-+		    }
-+		}
-+	      break;
-+
-+	    default:
-+	      while (1)
-+		{
-+		  if (*p == '\n')
-+		    {
-+		      ++p;
-+		      break;
-+		    }
-+
-+		  MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
-+
-+		  if (convfail)
-+		    mbc[0] = *p++;
-+		  else
-+		    {
-+		      int flag = 0;
-+
-+		      if (ignore_case)
-+			{
-+			  lo_wc = towlower (wc);
-+			  if (lo_wc != wc)
-+			    {
-+			      flag = 1;
-+			      p += mblength;
-+			      memset (&state_wc, '\0', sizeof(mbstate_t));
-+			      mblength = wcrtomb (mbc, lo_wc, &state_wc);
-+
-+			      assert (mblength != (size_t)-1 &&
-+				  mblength != (size_t)-2);
-+
-+			      mblength = (mblength < 1) ? 1 : mblength;
-+			    }
-+			}
-+
-+		      if (!flag)
-+			{
-+			  for (i = 0; i < mblength; i++)
-+			    mbc[i] = *p++;
-+			}
-+		    }
-+
-+		  for (i = 0; i < mblength; i++)
-+		    h = HASH (h, mbc[i]);
-+		}
-+	    }
-+	}
-+      else
-+#endif
-       /* Hash this line until we find a newline.  */
-       if (ignore_case)
- 	switch (ignore_white_space)
-diff -Naur diffutils-2.8.7.orig/src/side.c diffutils-2.8.7/src/side.c
---- diffutils-2.8.7.orig/src/side.c	2004-04-12 00:44:35.000000000 -0700
-+++ diffutils-2.8.7/src/side.c	2009-01-08 13:26:42.000000000 -0800
-@@ -73,11 +73,72 @@
-   register size_t out_position = 0;
-   register char const *text_pointer = line[0];
-   register char const *text_limit = line[1];
-+#if defined HAVE_WCHAR_H && defined HAVE_WCTYPE_H
-+  unsigned char mbc[MB_LEN_MAX];
-+  wchar_t wc;
-+  mbstate_t state, state_bak;
-+  size_t mbc_pos, mblength;
-+  int mbc_loading_flag = 0;
-+  int wc_width;
-+
-+  memset (&state, '\0', sizeof (mbstate_t));
-+#endif
- 
-   while (text_pointer < text_limit)
-     {
-       register unsigned char c = *text_pointer++;
- 
-+#if defined HAVE_WCHAR_H && defined HAVE_WCTYPE_H
-+      if (MB_CUR_MAX > 1 && mbc_loading_flag)
-+	{
-+	  mbc_loading_flag = 0;
-+	  state_bak = state;
-+	  mbc[mbc_pos++] = c;
-+
-+process_mbc:
-+	  mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-+
-+	  switch (mblength)
-+	    {
-+	    case (size_t)-2:	/* Incomplete multibyte character. */
-+	      mbc_loading_flag = 1;
-+	      state = state_bak;
-+	      break;
-+
-+	    case (size_t)-1:	/* Invalid as a multibyte character. */
-+	      if (in_position++ < out_bound)
-+		{
-+		  out_position = in_position;
-+		  putc (mbc[0], out);
-+		}
-+	      memmove (mbc, mbc + 1, --mbc_pos);
-+	      if (mbc_pos > 0)
-+		{
-+		  mbc[mbc_pos] = '\0';
-+		  goto process_mbc;
-+		}
-+	      break;
-+
-+	    default:
-+	      wc_width = wcwidth (wc);
-+	      if (wc_width < 1)	/* Unprintable multibyte character. */
-+		{
-+		  if (in_position <= out_bound)
-+		    fprintf (out, "%lc", (wint_t)wc);
-+		}
-+	      else		/* Printable multibyte character. */
-+		{
-+		  in_position += wc_width;
-+		  if (in_position <= out_bound)
-+		    {
-+		      out_position = in_position;
-+		      fprintf (out, "%lc", (wint_t)wc);
-+		    }
-+		}
-+	    }
-+	  continue;
-+	}
-+#endif
-       switch (c)
- 	{
- 	case '\t':
-@@ -135,8 +196,39 @@
- 	  break;
- 
- 	default:
--	  if (! isprint (c))
--	    goto control_char;
-+#if defined HAVE_WCHAR_H && defined HAVE_WCTYPE_H
-+	  if (MB_CUR_MAX > 1)
-+	    {
-+	      memset (mbc, '\0', MB_LEN_MAX);
-+	      mbc_pos = 0;
-+	      mbc[mbc_pos++] = c;
-+	      state_bak = state;
-+
-+	      mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-+
-+	      /* The value of mblength is always less than 2 here. */
-+	      switch (mblength)
-+		{
-+		case (size_t)-2:	/* Incomplete multibyte character. */
-+		  state = state_bak;
-+		  mbc_loading_flag = 1;
-+		  continue;
-+
-+		case (size_t)-1:	/* Invalid as a multibyte character. */
-+		  state = state_bak;
-+		  break;
-+
-+		default:
-+		  if (! iswprint (wc))
-+		    goto control_char;
-+		}
-+	    }
-+	  else
-+#endif
-+	    {
-+	      if (! isprint (c))
-+		goto control_char;
-+	    }
- 	  /* falls through */
- 	case ' ':
- 	  if (in_position++ < out_bound)
-diff -Naur diffutils-2.8.7.orig/src/util.c diffutils-2.8.7/src/util.c
---- diffutils-2.8.7.orig/src/util.c	2004-04-12 00:44:35.000000000 -0700
-+++ diffutils-2.8.7/src/util.c	2009-01-08 13:26:42.000000000 -0800
-@@ -319,7 +319,7 @@
-    Return nonzero if the lines differ.  */
- 
- bool
--lines_differ (char const *s1, char const *s2)
-+lines_differ_singlebyte (char const *s1, char const *s2)
- {
-   register char const *t1 = s1;
-   register char const *t2 = s2;
-@@ -458,6 +458,293 @@
-   return start;
- }
- 
-+#ifdef HANDLE_MULTIBYTE
-+# define MBC2WC(T, END, MBLENGTH, WC, STATE, CONVFAIL)			\
-+do									\
-+{									\
-+    mbstate_t bak = STATE;						\
-+									\
-+    CONVFAIL = 0;							\
-+    MBLENGTH = mbrtowc (&WC, T, END - T, &STATE);			\
-+									\
-+    switch (MBLENGTH)							\
-+      {									\
-+      case (size_t)-2:							\
-+      case (size_t)-1:							\
-+	STATE = bak;							\
-+	++CONVFAIL;							\
-+	  /* Fall through. */						\
-+      case 0:								\
-+	MBLENGTH = 1;							\
-+      }									\
-+}									\
-+while (0)
-+
-+bool
-+lines_differ_multibyte (char const *s1, char const *s2)
-+{
-+  unsigned char const *end1, *end2;
-+  unsigned char c1, c2;
-+  wchar_t wc1, wc2, wc1_bak, wc2_bak;
-+  size_t mblen1, mblen2;
-+  mbstate_t state1, state2, state1_bak, state2_bak;
-+  int convfail1, convfail2, convfail1_bak, convfail2_bak;
-+  
-+  unsigned char const *t1 = (unsigned char const *) s1;
-+  unsigned char const *t2 = (unsigned char const *) s2;
-+  unsigned char const *t1_bak, *t2_bak;
-+  size_t column = 0;
-+
-+  if (ignore_white_space == IGNORE_NO_WHITE_SPACE  && !ignore_case)
-+    {
-+      while (*t1 != '\n')
-+	if (*t1++ != * t2++)
-+	  return 1;
-+      return 0;
-+    }
-+
-+  memset (&state1, '\0', sizeof (mbstate_t));
-+  memset (&state2, '\0', sizeof (mbstate_t));
-+
-+  end1 = s1 + strlen (s1);
-+  end2 = s2 + strlen (s2);
-+
-+  while (1)
-+    {
-+      c1 = *t1;
-+      c2 = *t2;
-+      MBC2WC (t1, end1, mblen1, wc1, state1, convfail1);
-+      MBC2WC (t2, end2, mblen2, wc2, state2, convfail2);
-+
-+      /* Test for exact char equality first, since it's a common case.  */
-+      if (convfail1 ^ convfail2)
-+	break;
-+      else if (convfail1 && convfail2 && c1 != c2)
-+	break;
-+      else if (!convfail1 && !convfail2 && wc1 != wc2)
-+	{
-+	  switch (ignore_white_space)
-+	    {
-+	    case IGNORE_ALL_SPACE:
-+	      /* For -w, just skip past any white space.  */
-+	      while (1)
-+		{
-+		  if (convfail1)
-+		    break;
-+		  else if (wc1 == L'\n' || !iswspace (wc1))
-+		    break;
-+
-+		  t1 += mblen1;
-+		  c1 = *t1;
-+		  MBC2WC (t1, end1, mblen1, wc1, state1, convfail1);
-+		}
-+
-+	      while (1)
-+		{
-+		  if (convfail2)
-+		    break;
-+		  else if (wc2 == L'\n' || !iswspace (wc2))
-+		    break;
-+
-+		  t2 += mblen2;
-+		  c2 = *t2;
-+		  MBC2WC (t2, end2, mblen2, wc2, state2, convfail2);
-+		}
-+	      t1 += mblen1;
-+	      t2 += mblen2;
-+	      break;
-+
-+	    case IGNORE_SPACE_CHANGE:
-+	      /* For -b, advance past any sequence of white space in
-+		 line 1 and consider it just one space, or nothing at
-+		 all if it is at the end of the line.  */
-+	      if (wc1 != L'\n' && iswspace (wc1))
-+		{
-+		  size_t mblen_bak;
-+		  mbstate_t state_bak;
-+
-+		  do
-+		    {
-+		      t1 += mblen1;
-+		      mblen_bak = mblen1;
-+		      state_bak = state1;
-+		      MBC2WC (t1, end1, mblen1, wc1, state1, convfail1);
-+		    }
-+		  while (!convfail1 && (wc1 != L'\n' && iswspace (wc1)));
-+
-+		  state1 = state_bak;
-+		  mblen1 = mblen_bak;
-+		  t1 -= mblen1;
-+		  convfail1 = 0;
-+		  wc1 = L' ';
-+		}
-+
-+	      /* Likewise for line 2.  */
-+	      if (wc2 != L'\n' && iswspace (wc2))
-+		{
-+		  size_t mblen_bak;
-+		  mbstate_t state_bak;
-+
-+		  do
-+		    {
-+		      t2 += mblen2;
-+		      mblen_bak = mblen2;
-+		      state_bak = state2;
-+		      MBC2WC (t2, end2, mblen2, wc2, state2, convfail2);
-+		    }
-+		  while (!convfail2 && (wc2 != L'\n' && iswspace (wc2)));
-+
-+		  state2 = state_bak;
-+		  mblen2 = mblen_bak;
-+		  t2 -= mblen2;
-+		  convfail2 = 0;
-+		  wc2 = L' ';
-+		}
-+
-+	      if (wc1 != wc2)
-+		{
-+		  if (wc2 == L' ' && wc1 != L'\n' &&
-+		      t1 > (unsigned char const *)s1 &&
-+		      !convfail1_bak && iswspace (wc1_bak))
-+		    {
-+		      t1 = t1_bak;
-+		      wc1 = wc1_bak;
-+		      state1 = state1_bak;
-+		      convfail1 = convfail1_bak;
-+		      continue;
-+		    }
-+		  if (wc1 == L' ' && wc2 != L'\n'
-+		      && t2 > (unsigned char const *)s2
-+		      && !convfail2_bak && iswspace (wc2_bak))
-+		    {
-+		      t2 = t2_bak;
-+		      wc2 = wc2_bak;
-+		      state2 = state2_bak;
-+		      convfail2 = convfail2_bak;
-+		      continue;
-+		    }
-+		}
-+
-+	      t1_bak = t1;		  t2_bak = t2;
-+	      wc1_bak = wc1;		  wc2_bak = wc2;
-+	      state1_bak = state1;	  state2_bak = state2;
-+	      convfail1_bak = convfail1;  convfail2_bak = convfail2;
-+
-+	      if (wc1 == L'\n')
-+		wc1 = L' ';
-+	      else
-+		t1 += mblen1;
-+
-+	      if (wc2 == L'\n')
-+		wc2 = L' ';
-+	      else
-+		t2 += mblen2;
-+
-+	      break;
-+
-+	    case IGNORE_TAB_EXPANSION:
-+	      if ((wc1 == L' ' && wc2 == L'\t')
-+		  || (wc1 == L'\t' && wc2 == L' '))
-+		{
-+		  size_t column2 = column;
-+
-+		  while (1)
-+		    {
-+		      if (convfail1)
-+			{
-+			  ++t1;
-+			  break;
-+			}
-+		      else if (wc1 == L' ')
-+			column++;
-+		      else if (wc1 == L'\t')
-+			column += TAB_WIDTH - column % TAB_WIDTH;
-+		      else
-+			{
-+			  t1 += mblen1;
-+			  break;
-+			}
-+
-+		      t1 += mblen1;
-+		      c1 = *t1;
-+		      MBC2WC (t1, end1, mblen1, wc1, state1, convfail1);
-+		    }
-+
-+		  while (1)
-+		    {
-+		      if (convfail2)
-+			{
-+			  ++t2;
-+			  break;
-+			}
-+		      else if (wc2 == L' ')
-+			column2++;
-+		      else if (wc2 == L'\t')
-+			column2 += TAB_WIDTH - column2 % TAB_WIDTH;
-+		      else
-+			{
-+			  t2 += mblen2;
-+			  break;
-+			}
-+
-+		      t2 += mblen2;
-+		      c2 = *t2;
-+		      MBC2WC (t2, end2, mblen2, wc2, state2, convfail2);
-+		    }
-+
-+		  if (column != column2)
-+		    return 1;
-+		}
-+	      else
-+		{
-+		  t1 += mblen1;
-+		  t2 += mblen2;
-+		}
-+	      break;
-+
-+	    case IGNORE_NO_WHITE_SPACE:
-+	      t1 += mblen1;
-+	      t2 += mblen2;
-+	      break;
-+	    }
-+
-+	  /* Lowercase all letters if -i is specified.  */
-+	  if (ignore_case)
-+	    {
-+	      if (!convfail1)
-+		wc1 = towlower (wc1);
-+	      if (!convfail2)
-+		wc2 = towlower (wc2);
-+	    }
-+
-+	  if (convfail1 ^ convfail2)
-+	    break;
-+	  else if (convfail1 && convfail2 && c1 != c2)
-+	    break;
-+	  else if (!convfail1 && !convfail2 && wc1 != wc2)
-+	    break;
-+	}
-+      else
-+	{
-+	  t1_bak = t1;			t2_bak = t2;
-+	  wc1_bak = wc1;		wc2_bak = wc2;
-+	  state1_bak = state1;		state2_bak = state2;
-+	  convfail1_bak = convfail1;	convfail2_bak = convfail2;
-+
-+	  t1 += mblen1;			t2 += mblen2;
-+	}
-+      
-+      if (!convfail1 && wc1 == L'\n')
-+	return 0;
-+
-+      column += convfail1 ? 1 :
-+	(wc1 == L'\t') ? TAB_WIDTH - column % TAB_WIDTH : wcwidth (wc1);
-+    }
-+
-+  return 1;
-+}
-+#endif
-+
- struct change *
- find_reverse_change (struct change *start)
- {
-

commit 8cc43dba37c413d2535f964d8fcdacc7549e6579
Author: Joe Ciccone <jciccone at gmail.com>
Date:   Tue Aug 3 21:45:56 2010 -0400

    Update Automake to 1.11.1

diff --git a/BOOK/introduction/common/changelog.xml b/BOOK/introduction/common/changelog.xml
index ed1ef30..b37829c 100644
--- a/BOOK/introduction/common/changelog.xml
+++ b/BOOK/introduction/common/changelog.xml
@@ -40,6 +40,9 @@
       <para>August 02, 2010</para>
       <itemizedlist>
         <listitem>
+          <para>[jciccone] - Updated Automake to 1.11.1.</para>
+        </listitem>
+        <listitem>
           <para>[jciccone] - Updated Autoconf to 2.67.</para>
         </listitem>
         <listitem>
diff --git a/BOOK/packages.ent b/BOOK/packages.ent
index e1ee953..976a6fb 100644
--- a/BOOK/packages.ent
+++ b/BOOK/packages.ent
@@ -24,10 +24,10 @@
 <!ENTITY autoconf-home "&gnu-software;autoconf">
 
 <!ENTITY automake-version "1.11">
-<!ENTITY automake-version2 "1.11">
-<!ENTITY automake-size "1,033 KB">
+<!ENTITY automake-version2 "&automake-version;.1">
+<!ENTITY automake-size "1,044 KB">
 <!ENTITY automake-url "&gnu;automake/automake-&automake-version;.tar.bz2">
-<!ENTITY automake-md5 "4db4efe027e26b33930a7e151de19d0f">
+<!ENTITY automake-md5 "c2972c4d9b3e29c03d5f2af86249876f">
 <!ENTITY automake-home "&gnu-software;automake">
 
 <!ENTITY bash-version "4.1">

commit bd8e44da5fa7c8fb2aeaad0531f2c300ec6f283f
Author: Joe Ciccone <jciccone at gmail.com>
Date:   Tue Aug 3 21:43:58 2010 -0400

    Updated Autoconf to 2.67.

diff --git a/BOOK/introduction/common/changelog.xml b/BOOK/introduction/common/changelog.xml
index e9a511b..ed1ef30 100644
--- a/BOOK/introduction/common/changelog.xml
+++ b/BOOK/introduction/common/changelog.xml
@@ -40,6 +40,9 @@
       <para>August 02, 2010</para>
       <itemizedlist>
         <listitem>
+          <para>[jciccone] - Updated Autoconf to 2.67.</para>
+        </listitem>
+        <listitem>
           <para>[jciccone] - Updated Readline to 6.1.</para>
         </listitem>
       </itemizedlist>
diff --git a/BOOK/packages.ent b/BOOK/packages.ent
index 9cf49a3..e1ee953 100644
--- a/BOOK/packages.ent
+++ b/BOOK/packages.ent
@@ -17,10 +17,10 @@
 <!ENTITY arcload-md5 "b00e1c79074a13c2de97748f56f9bd1f">
 <!ENTITY arcload-home "http://www.linux-mips.org/wiki/ARCLoad">
 
-<!ENTITY autoconf-version "2.64">
-<!ENTITY autoconf-size "1,087 KB">
+<!ENTITY autoconf-version "2.67">
+<!ENTITY autoconf-size "1,132 KB">
 <!ENTITY autoconf-url "&gnu;autoconf/autoconf-&autoconf-version;.tar.xz">
-<!ENTITY autoconf-md5 "9decdd5c672fd403ea467bb0789bc194">
+<!ENTITY autoconf-md5 "1da24eebe4e6a774e4039242a4f06aad">
 <!ENTITY autoconf-home "&gnu-software;autoconf">
 
 <!ENTITY automake-version "1.11">

-----------------------------------------------------------------------

Summary of changes:
 BOOK/final-system/common/diffutils.xml   |   12 +-
 BOOK/final-system/common/grep.xml        |    4 +-
 BOOK/final-system/multilib/diffutils.xml |   16 -
 BOOK/introduction/common/changelog.xml   |    6 +
 BOOK/materials/common/patches.xml        |   15 +-
 BOOK/packages.ent                        |   12 +-
 BOOK/patches.ent                         |   10 +-
 patches/diffutils-2.8.7-i18n-1.patch     |  808 ----------------------
 patches/grep-2.5.4-i18n-1.patch          | 1109 ------------------------------
 patches/grep-2.6.3-fixes-1.patch         |  325 +++++++++
 10 files changed, 346 insertions(+), 1971 deletions(-)
 delete mode 100644 patches/diffutils-2.8.7-i18n-1.patch
 delete mode 100644 patches/grep-2.5.4-i18n-1.patch
 create mode 100644 patches/grep-2.6.3-fixes-1.patch


hooks/post-receive
-- 
Cross-LFS Book



More information about the Clfs-commits mailing list