diff --git a/.diffutils.metadata b/.diffutils.metadata
new file mode 100644
index 0000000..8e754fb
--- /dev/null
+++ b/.diffutils.metadata
@@ -0,0 +1 @@
+6463cce7d3eb73489996baefd0e4425928ecd61e SOURCES/diffutils-3.3.tar.xz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..68437e0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/diffutils-3.3.tar.xz
diff --git a/SOURCES/diffutils-3.3-diffseq.patch b/SOURCES/diffutils-3.3-diffseq.patch
new file mode 100644
index 0000000..3453224
--- /dev/null
+++ b/SOURCES/diffutils-3.3-diffseq.patch
@@ -0,0 +1,208 @@
+diff -up diffutils-3.3/lib/diffseq.h.me diffutils-3.3/lib/diffseq.h
+--- diffutils-3.3/lib/diffseq.h.me	2018-08-10 14:26:48.940444056 +0200
++++ diffutils-3.3/lib/diffseq.h	2018-08-10 14:26:50.453439777 +0200
+@@ -138,12 +132,6 @@ struct partition
+   /* Midpoints of this partition.  */
+   OFFSET xmid;
+   OFFSET ymid;
+-
+-  /* True if low half will be analyzed minimally.  */
+-  bool lo_minimal;
+-
+-  /* Likewise for high half.  */
+-  bool hi_minimal;
+ };
+ 
+ 
+@@ -175,7 +156,7 @@ struct partition
+    suboptimal diff output.  It cannot cause incorrect diff output.  */
+ 
+ static void
+-diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, bool find_minimal,
++diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
+       struct partition *part, struct context *ctxt)
+ {
+   OFFSET *const fd = ctxt->fdiag;       /* Give the compiler a chance. */
+@@ -235,7 +216,6 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y
+             {
+               part->xmid = x;
+               part->ymid = y;
+-              part->lo_minimal = part->hi_minimal = true;
+               return;
+             }
+         }
+@@ -268,14 +248,10 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y
+             {
+               part->xmid = x;
+               part->ymid = y;
+-              part->lo_minimal = part->hi_minimal = true;
+               return;
+             }
+         }
+ 
+-      if (find_minimal)
+-        continue;
+-
+ #ifdef USE_HEURISTIC
+       /* Heuristic: check occasionally for a diagonal that has made lots
+          of progress compared with the edit distance.  If we have any
+@@ -319,11 +295,7 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y
+                   }
+               }
+             if (best > 0)
+-              {
+-                part->lo_minimal = true;
+-                part->hi_minimal = false;
+-                return;
+-              }
++	      return;
+           }
+ 
+           {
+@@ -358,77 +330,10 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y
+                   }
+               }
+             if (best > 0)
+-              {
+-                part->lo_minimal = false;
+-                part->hi_minimal = true;
+-                return;
+-              }
++	      return;
+           }
+         }
+ #endif /* USE_HEURISTIC */
+-
+-      /* Heuristic: if we've gone well beyond the call of duty, give up
+-         and report halfway between our best results so far.  */
+-      if (c >= ctxt->too_expensive)
+-        {
+-          OFFSET fxybest;
+-          OFFSET fxbest IF_LINT (= 0);
+-          OFFSET bxybest;
+-          OFFSET bxbest IF_LINT (= 0);
+-
+-          /* Find forward diagonal that maximizes X + Y.  */
+-          fxybest = -1;
+-          for (d = fmax; d >= fmin; d -= 2)
+-            {
+-              OFFSET x = MIN (fd[d], xlim);
+-              OFFSET y = x - d;
+-              if (ylim < y)
+-                {
+-                  x = ylim + d;
+-                  y = ylim;
+-                }
+-              if (fxybest < x + y)
+-                {
+-                  fxybest = x + y;
+-                  fxbest = x;
+-                }
+-            }
+-
+-          /* Find backward diagonal that minimizes X + Y.  */
+-          bxybest = OFFSET_MAX;
+-          for (d = bmax; d >= bmin; d -= 2)
+-            {
+-              OFFSET x = MAX (xoff, bd[d]);
+-              OFFSET y = x - d;
+-              if (y < yoff)
+-                {
+-                  x = yoff + d;
+-                  y = yoff;
+-                }
+-              if (x + y < bxybest)
+-                {
+-                  bxybest = x + y;
+-                  bxbest = x;
+-                }
+-            }
+-
+-          /* Use the better of the two diagonals.  */
+-          if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff))
+-            {
+-              part->xmid = fxbest;
+-              part->ymid = fxybest - fxbest;
+-              part->lo_minimal = true;
+-              part->hi_minimal = false;
+-            }
+-          else
+-            {
+-              part->xmid = bxbest;
+-              part->ymid = bxybest - bxbest;
+-              part->lo_minimal = false;
+-              part->hi_minimal = true;
+-            }
+-          return;
+-        }
+     }
+   #undef XREF_YREF_EQUAL
+ }
+@@ -452,7 +354,7 @@ diag (OFFSET xoff, OFFSET xlim, OFFSET y
+ 
+ static bool
+ compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
+-            bool find_minimal, struct context *ctxt)
++            struct context *ctxt)
+ {
+ #ifdef ELEMENT
+   ELEMENT const *xv = ctxt->xvec; /* Help the compiler.  */
+@@ -498,12 +400,12 @@ compareseq (OFFSET xoff, OFFSET xlim, OF
+       struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 });
+ 
+       /* Find a point of correspondence in the middle of the vectors.  */
+-      diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
++      diag (xoff, xlim, yoff, ylim, &part, ctxt);
+ 
+       /* Use the partitions to split this problem into subproblems.  */
+-      if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt))
++      if (compareseq (xoff, part.xmid, yoff, part.ymid, ctxt))
+         return true;
+-      if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt))
++      if (compareseq (part.xmid, xlim, part.ymid, ylim, ctxt))
+         return true;
+     }
+ 
+diff -up diffutils-3.3/src/analyze.c.me diffutils-3.3/src/analyze.c
+--- diffutils-3.3/src/analyze.c.me	2018-08-10 14:06:53.473858743 +0200
++++ diffutils-3.3/src/analyze.c	2018-08-10 14:08:30.533579865 +0200
+@@ -542,7 +542,6 @@ diff_2_files (struct comparison *cmp)
+     {
+       struct context ctxt;
+       lin diags;
+-      lin too_expensive;
+ 
+       /* Allocate vectors for the results of comparison:
+ 	 a flag for each line of each file, saying whether that line
+@@ -574,18 +573,11 @@ diff_2_files (struct comparison *cmp)
+ 
+       ctxt.heuristic = speed_large_files;
+ 
+-      /* Set TOO_EXPENSIVE to be approximate square root of input size,
+-	 bounded below by 256.  */
+-      too_expensive = 1;
+-      for (;  diags != 0;  diags >>= 2)
+-	too_expensive <<= 1;
+-      ctxt.too_expensive = MAX (256, too_expensive);
+-
+       files[0] = cmp->file[0];
+       files[1] = cmp->file[1];
+ 
+       compareseq (0, cmp->file[0].nondiscarded_lines,
+-		  0, cmp->file[1].nondiscarded_lines, minimal, &ctxt);
++		  0, cmp->file[1].nondiscarded_lines, &ctxt);
+ 
+       free (ctxt.fdiag - (cmp->file[1].nondiscarded_lines + 1));
+ 
+diff -up diffutils-3.3/src/diff.h.me diffutils-3.3/src/diff.h
+--- diffutils-3.3/src/diff.h.me	2018-08-10 14:28:25.878169926 +0200
++++ diffutils-3.3/src/diff.h	2018-08-10 14:28:40.739127903 +0200
+@@ -376,7 +376,7 @@ extern void print_sdiff_script (struct c
+ extern char const change_letter[4];
+ extern char const pr_program[];
+ extern char *concat (char const *, char const *, char const *);
+-extern bool (*lines_differ) (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
++extern bool (*lines_differ) (char const *, size_t, char const *, size_t);
+ extern bool lines_differ_singlebyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
+ #ifdef HANDLE_MULTIBYTE
+ extern bool lines_differ_multibyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
diff --git a/SOURCES/diffutils-cmp-s-empty.patch b/SOURCES/diffutils-cmp-s-empty.patch
new file mode 100644
index 0000000..bc1c6b4
--- /dev/null
+++ b/SOURCES/diffutils-cmp-s-empty.patch
@@ -0,0 +1,20 @@
+diff -up diffutils-2.8.1/src/cmp.c.cmp-s-empty diffutils-2.8.1/src/cmp.c
+--- diffutils-2.8.1/src/cmp.c.cmp-s-empty	2002-04-05 21:37:31.000000000 +0100
++++ diffutils-2.8.1/src/cmp.c	2010-06-25 14:56:08.464802321 +0100
+@@ -316,12 +316,15 @@ main (int argc, char **argv)
+ 
+   /* If only a return code is needed,
+      and if both input descriptors are associated with plain files,
++     and if both files are larger than 0 bytes (procfs files are always 0),
+      conclude that the files differ if they have different sizes
+      and if more bytes will be compared than are in the smaller file.  */
+ 
+   if (comparison_type == type_status
+       && S_ISREG (stat_buf[0].st_mode)
+-      && S_ISREG (stat_buf[1].st_mode))
++      && S_ISREG (stat_buf[1].st_mode)
++      && stat_buf[0].st_size > 0
++      && stat_buf[1].st_size > 0)
+     {
+       off_t s0 = stat_buf[0].st_size - file_position (0);
+       off_t s1 = stat_buf[1].st_size - file_position (1);
diff --git a/SOURCES/diffutils-i18n.patch b/SOURCES/diffutils-i18n.patch
new file mode 100644
index 0000000..be365e4
--- /dev/null
+++ b/SOURCES/diffutils-i18n.patch
@@ -0,0 +1,778 @@
+diff -up diffutils-3.3/src/diff.c.i18n diffutils-3.3/src/diff.c
+--- diffutils-3.3/src/diff.c.i18n	2013-02-02 04:39:05.000000000 +0000
++++ diffutils-3.3/src/diff.c	2013-10-23 11:25:18.729708853 +0100
+@@ -74,6 +74,8 @@ static void try_help (char const *, char
+ static void check_stdout (void);
+ static void usage (void);
+ 
++bool (*lines_differ) (char const *, size_t, char const *, size_t);
++
+ /* If comparing directories, compare their common subdirectories
+    recursively.  */
+ static bool recursive;
+@@ -285,6 +287,13 @@ main (int argc, char **argv)
+   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, NULL)) != -1)
+diff -up diffutils-3.3/src/diff.h.i18n diffutils-3.3/src/diff.h
+--- diffutils-3.3/src/diff.h.i18n	2013-02-02 04:39:05.000000000 +0000
++++ diffutils-3.3/src/diff.h	2013-10-23 11:25:18.729708853 +0100
+@@ -23,6 +23,17 @@
+ #include <stdio.h>
+ #include <unlocked-io.h>
+ 
++/* For platforms which support the ISO C ammendment 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
++
+ /* What kind of changes a hunk contains.  */
+ enum changes
+ {
+@@ -365,7 +376,11 @@ extern void print_sdiff_script (struct c
+ extern char const change_letter[4];
+ extern char const pr_program[];
+ extern char *concat (char const *, char const *, char const *);
+-extern bool lines_differ (char const *, char const *) _GL_ATTRIBUTE_PURE;
++extern bool (*lines_differ) (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
++extern bool lines_differ_singlebyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
++#ifdef HANDLE_MULTIBYTE
++extern bool lines_differ_multibyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
++#endif
+ extern lin translate_line_number (struct file_data const *, lin);
+ extern struct change *find_change (struct change *);
+ extern struct change *find_reverse_change (struct change *);
+diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c
+--- diffutils-3.3/src/io.c.i18n	2013-02-02 04:39:05.000000000 +0000
++++ diffutils-3.3/src/io.c	2013-10-23 12:03:09.155348827 +0100
+@@ -23,6 +23,7 @@
+ #include <cmpbuf.h>
+ #include <file-type.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)))
+@@ -208,6 +209,28 @@ slurp (struct file_data *current)
+ 
+ /* 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)
+@@ -234,12 +257,300 @@ find_and_hash_each_line (struct file_dat
+   bool same_length_diff_contents_compare_anyway =
+     diff_length_compare_anyway | ig_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;
+       hash_value h = 0;
+       unsigned char c;
+ 
++#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 (ig_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 (ig_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 || !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:
++	    case IGNORE_TAB_EXPANSION_AND_TRAILING_SPACE:
++	    case IGNORE_TRAILING_SPACE:
++	      {
++		size_t column = 0;
++		while (1)
++		  {
++		    if (*p == '\n')
++		      {
++			++p;
++			break;
++		      }
++
++		    MBC2WC (p, suffix_begin, mblength, wc, state, convfail);
++
++		    if (!convfail
++			&& ig_white_space & IGNORE_TRAILING_SPACE
++			&& iswspace (wc))
++		      {
++			char const *p1 = p;
++			while (1)
++			  {
++			    if (*p1 == '\n')
++			      {
++				p = p1 + 1;
++				goto hashing_done;
++			      }
++
++			    p1 += mblength;
++			    MBC2WC (p1, suffix_begin, mblength, wc, state, convfail);
++			    if (convfail || !iswspace (wc))
++			      break;
++			  }
++		      }
++
++		    size_t repetitions = 1;
++		    bool no_convert = 0;
++
++		    if (ig_white_space & IGNORE_TAB_EXPANSION)
++		      {
++			if (convfail)
++			  column++;
++			else
++			  switch (wc)
++			    {
++			    case L'\b':
++			      column -= 0 < column;
++			      break;
++
++			    case L'\t':
++			      mbc[0] = ' ';
++			      mblength = 1;
++			      no_convert = 1;
++			      p++;
++			      assert(mblength == 1);
++			      repetitions = tabsize - column % tabsize;
++			      column = (column + repetitions < column
++					? 0
++					: column + repetitions);
++			      break;
++
++			    case L'\r':
++			      column = 0;
++			      break;
++
++			    default:
++			      column += wcwidth (wc);
++			      break;
++			    }
++		      }
++
++		    if (ig_case)
++		      {
++			lo_wc = towlower (wc);
++			if (lo_wc != wc)
++			  {
++			    no_convert = 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 (!no_convert)
++		      for (i = 0; i < mblength; i++)
++			mbc[i] = *p++;
++
++		    do
++		      {
++			for (i = 0; i < mblength; i++)
++			  h = HASH (h, mbc[i]);
++		      }
++		    while (--repetitions != 0);
++		  }
++	      }
++	      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 (ig_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.  */
+       switch (ig_white_space)
+ 	{
+@@ -390,7 +701,7 @@ find_and_hash_each_line (struct file_dat
+ 	    else if (!diff_length_compare_anyway)
+ 	      continue;
+ 
+-	    if (! lines_differ (eqline, ip))
++	    if (! lines_differ (eqline, eqs[i].length + 1, ip, length + 1))
+ 	      break;
+ 	  }
+ 
+diff -up diffutils-3.3/src/util.c.i18n diffutils-3.3/src/util.c
+--- diffutils-3.3/src/util.c.i18n	2013-02-02 04:39:05.000000000 +0000
++++ diffutils-3.3/src/util.c	2013-10-23 11:25:18.730708857 +0100
+@@ -408,7 +408,8 @@ finish_output (void)
+    Return nonzero if the lines differ.  */
+ 
+ bool
+-lines_differ (char const *s1, char const *s2)
++lines_differ_singlebyte (char const *s1, size_t s1len,
++			 char const *s2, size_t s2len)
+ {
+   register char const *t1 = s1;
+   register char const *t2 = s2;
+@@ -564,6 +565,354 @@ lines_differ (char const *s1, char const
+ 
+   return true;
+ }
++
++#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, size_t s1len,
++			char const *s2, size_t s2len)
++{
++  char const *end1, *end2;
++  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;
++  
++  char const *t1 = s1;
++  char const *t2 = s2;
++  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;
++    }
++
++  end1 = t1 + s1len;
++  end2 = t2 + s2len;
++
++  memset (&state1, '\0', sizeof (mbstate_t));
++  memset (&state2, '\0', sizeof (mbstate_t));
++
++  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 we went too far when doing the simple test for
++		     equality, go back to the first non-whitespace
++		     character in both sides and try again.  */
++		  if (wc2 == L' ' && wc1 != L'\n' &&
++		      t1 > 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 > 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_TRAILING_SPACE:
++	    case IGNORE_TAB_EXPANSION_AND_TRAILING_SPACE:
++	      if (iswspace (wc1) && iswspace (wc2))
++		{
++		  char const *p;
++		  wchar_t wc;
++		  size_t mblength;
++		  int convfail;
++		  mbstate_t state;
++		  bool just_whitespace_left = 1;
++		  if (wc1 != L'\n')
++		    {
++		      mblength = mblen1;
++		      p = t1;
++		      memset (&state, '\0', sizeof(mbstate_t));
++		      while (p < end1)
++			{
++			  if (*p == '\n')
++			    break;
++
++			  p += mblength;
++			  MBC2WC (p, end1, mblength, wc, state, convfail);
++			  if (convfail || !iswspace (wc))
++			    {
++			      just_whitespace_left = 0;
++			      break;
++			    }
++			}
++		    }
++		  if (just_whitespace_left && wc2 != L'\n')
++		    {
++		      mblength = mblen2;
++		      p = t2;
++		      memset (&state, '\0', sizeof(mbstate_t));
++		      while (p < end2)
++			{
++			  if (*p == '\n')
++			    break;
++
++			  p += mblength;
++			  MBC2WC (p, end2, mblength, wc, state, convfail);
++			  if (convfail || !iswspace (wc))
++			    {
++			      just_whitespace_left = 0;
++			      break;
++			    }
++			}
++		    }
++
++		  if (just_whitespace_left)
++		    /* Both lines have nothing but whitespace left.  */
++		    return false;
++		}
++
++	      if (ignore_white_space == IGNORE_TRAILING_SPACE)
++		break;
++	      /* Fall through.  */
++	    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 += tabsize - column % tabsize;
++		      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 += tabsize - column2 % tabsize;
++		      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') ? tabsize - column % tabsize : wcwidth (wc1);
++    }
++
++  return 1;
++}
++#endif
+ 
+ /* Find the consecutive changes at the start of the script START.
+    Return the last link before the first gap.  */
diff --git a/SOURCES/diffutils-mkdir_p.patch b/SOURCES/diffutils-mkdir_p.patch
new file mode 100644
index 0000000..78d29eb
--- /dev/null
+++ b/SOURCES/diffutils-mkdir_p.patch
@@ -0,0 +1,12 @@
+diff -up diffutils-3.3/po/Makefile.in.in.mkdir_p diffutils-3.3/po/Makefile.in.in
+--- diffutils-3.3/po/Makefile.in.in.mkdir_p	2013-03-26 11:25:58.869375066 +0000
++++ diffutils-3.3/po/Makefile.in.in	2013-03-26 11:26:00.114379442 +0000
+@@ -42,7 +42,7 @@ INSTALL_DATA = @INSTALL_DATA@
+ mkinstalldirs = $(SHELL) @install_sh@ -d
+ install_sh = $(SHELL) @install_sh@
+ MKDIR_P = @MKDIR_P@
+-mkdir_p = @mkdir_p@
++mkdir_p = @MKDIR_P@
+ 
+ GMSGFMT_ = @GMSGFMT@
+ GMSGFMT_no = @GMSGFMT@
diff --git a/SPECS/diffutils.spec b/SPECS/diffutils.spec
new file mode 100644
index 0000000..b08c54c
--- /dev/null
+++ b/SPECS/diffutils.spec
@@ -0,0 +1,320 @@
+Summary: A GNU collection of diff utilities
+Name: diffutils
+Version: 3.3
+Release: 5%{?dist}
+Group: Applications/Text
+URL: http://www.gnu.org/software/diffutils/diffutils.html
+Source: ftp://ftp.gnu.org/gnu/diffutils/diffutils-%{version}.tar.xz
+Patch1: diffutils-cmp-s-empty.patch
+Patch2: diffutils-mkdir_p.patch
+Patch4: diffutils-i18n.patch
+Patch5: diffutils-3.3-diffseq.patch
+License: GPLv3+
+Requires(post): info
+Requires(preun): info
+Provides: bundled(gnulib)
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildRequires: help2man
+
+%description
+Diffutils includes four utilities: diff, cmp, diff3 and sdiff. Diff
+compares two files and shows the differences, line by line.  The cmp
+command shows the offset and line numbers where two files differ, or
+cmp can show the characters that differ between the two files.  The
+diff3 command shows the differences between three files.  Diff3 can be
+used when two people have made independent changes to a common
+original; diff3 can produce a merged file that contains both sets of
+changes and warnings about conflicts.  The sdiff command can be used
+to merge two files interactively.
+
+Install diffutils if you need to compare text files.
+
+%prep
+%setup -q
+# For 'cmp -s', compare file sizes only if both non-zero (bug #563618).
+%patch1 -p1 -b .cmp-s-empty
+
+# Work around @mkdir_p@ build issue.
+%patch2 -p1 -b .mkdir_p
+
+%patch4 -p1 -b .i18n
+
+%patch5 -p1 -b .diffseq
+
+%build
+%configure
+make PR_PROGRAM=%{_bindir}/pr
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+%find_lang %{name}
+
+%check
+make check
+
+%post
+/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
+
+%preun
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
+fi
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -f %{name}.lang
+%defattr(-,root,root)
+%doc COPYING NEWS README
+%{_bindir}/*
+%{_mandir}/*/*
+%{_infodir}/diffutils.info*gz
+
+%changelog
+* Wed Nov 21 2018 Than Ngo <than@redhat.com> - 3.3-5
+- Resolves: #1611281, diff -y produces garbage
+
+* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 3.3-4
+- Mass rebuild 2014-01-24
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 3.3-3
+- Mass rebuild 2013-12-27
+
+* Wed Oct 23 2013 Tim Waugh <twaugh@redhat.com> 3.3-2
+- Fixed multibyte handling logic for diff -Z (bug #1022417).
+
+* Tue Mar 26 2013 Tim Waugh <twaugh@redhat.com> 3.3-1
+- 3.3 (bug #927560).
+
+* Fri Feb 22 2013 Tim Waugh <twaugh@redhat.com> 3.2-13
+- Fixed i18n handling of 'diff -E' (bug #914666).
+
+* Wed Feb 13 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.2-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Fri Oct 26 2012 Tim Waugh <twaugh@redhat.com> 3.2-11
+- Ported i18n patch and reinstated it (bug #870460).
+
+* Wed Sep 19 2012 Tim Waugh <twaugh@redhat.com> 3.2-10
+- Fixed license as current source says GPLv3+.
+
+* Mon Jul 23 2012 Tim Waugh <twaugh@redhat.com> 3.2-9
+- Fixed build failure.
+
+* Wed Jul 18 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.2-8
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Mon May 21  2012 Tim Waugh <twaugh@redhat.com> 3.2-7
+- Provides bundled(gnulib) (bug #821751).
+
+* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.2-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Thu Dec  8 2011 Tim Waugh <twaugh@redhat.com> 3.2-5
+- Fix bug #747969 again.
+
+* Tue Nov 29 2011 Tim Waugh <twaugh@redhat.com> 3.2-4
+- Real fix for bug #747969: the diffutils info file changed name in
+  3.1.  Updated the scriptlets to install/remove the correct filename
+  from the info directory.
+
+* Fri Nov 25 2011 Tim Waugh <twaugh@redhat.com> 3.2-3
+- Fixed up reference to info page in man pages (bug #747969).
+
+* Fri Nov 25 2011 Tim Waugh <twaugh@redhat.com> 3.2-2
+- Applied upstream gnulib fix for float test on ppc, as well as
+  correction for LDBL_MANT_DIG definition (bug #733536).
+
+* Fri Sep  2 2011 Tim Waugh <twaugh@redhat.com> 3.2-1
+- 3.2.
+
+* Thu Aug 11 2011 Tim Waugh <twaugh@redhat.com> 3.1-1
+- 3.1.
+
+* Wed Apr 13 2011 Tim Waugh <twaugh@redhat.com> 3.0-1
+- 3.0 (bug #566482).
+- The i18n patch is dropped for the time being.
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.8.1-30
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Fri Jun 25 2010 Tim Waugh <twaugh@redhat.com> 2.8.1-29
+- For 'cmp -s', compare file sizes only if both non-zero (bug #563618).
+
+* Wed Apr 21 2010 Tim Waugh <twaugh@redhat.com> - 2.8.1-28
+- Build requires help2man (bug #577325).  Fixes empty diff man page.
+
+* Wed Mar  3 2010 Tim Waugh <twaugh@redhat.com> - 2.8.1-27
+- Added comments for all patches.
+
+* Wed Mar  3 2010 Tim Waugh <twaugh@redhat.com> - 2.8.1-26
+- Use upstream man pages.
+- Ship COPYING file.
+
+* Tue Aug 11 2009 Tim Waugh <twaugh@redhat.com> 2.8.1-25
+- Only try to install the info file if it exists so that package
+  installation does not fail with --excludedocs (bug #515919).
+
+* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.8.1-24
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.8.1-23
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Fri Feb 13 2009 Tim Waugh <twaugh@redhat.com> 2.8.1-22
+- Fixed 'sdiff -E' (bug #484892).
+
+* Wed Feb 13 2008 Tim Waugh <twaugh@redhat.com> 2.8.1-21
+- Rebuild for GCC 4.3.
+
+* Wed Jan  2 2008 Tim Waugh <twaugh@redhat.com> 2.8.1-20
+- Converted spec file to UTF-8 (bug #225696).
+- Fixed summary (bug #225696).
+- Fixed PreReq (bug #225696).
+- Removed Prefix (bug #225696).
+- Fixed build root (bug #225696).
+- Avoid %%makeinstall (bug #225696).
+- Fixed license tag (bug #225696).
+
+* Tue Nov  6 2007 Tim Waugh <twaugh@redhat.com> 2.8.1-19
+- Rebuilt.
+
+* Tue Nov  6 2007 Tim Waugh <twaugh@redhat.com> 2.8.1-18
+- Fixed multibyte speed improvement patch (bug #363831).
+
+* Tue Aug 14 2007 Tim Waugh <twaugh@redhat.com> 2.8.1-17
+- Multibyte speed improvement (bug #252117).
+
+* Mon Jan 22 2007 Tim Waugh <twaugh@redhat.com> 2.8.1-16
+- Make scriptlet unconditionally succeed (bug #223683).
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 2.8.1-15.2.2
+- rebuild
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 2.8.1-15.2.1
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 2.8.1-15.2
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Wed Apr  6 2005 Tim Waugh <twaugh@redhat.com> 2.8.1-15
+- Fixed sdiff exit code handling (bug #152967).
+
+* Wed Mar  2 2005 Tim Waugh <twaugh@redhat.com> 2.8.1-14
+- Rebuild for new GCC.
+
+* Wed Feb  9 2005 Tim Waugh <twaugh@redhat.com> 2.8.1-13
+- Rebuilt.
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Thu Jan  8 2004 Tim Waugh <twaugh@redhat.com> 2.8.1-10
+- Fix mistaken use of '|' instead of '||'.
+
+* Sat Oct 25 2003 Tim Waugh <twaugh@redhat.com> 2.8.1-9
+- Rebuilt.
+
+* Tue Jun 17 2003 Tim Waugh <twaugh@redhat.com> 2.8.1-8
+- Rebuilt.
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Tue Nov 19 2002 Tim Waugh <twaugh@redhat.com> 2.8.1-5
+- i18n patch.
+
+* Tue Oct 22 2002 Tim Waugh <twaugh@redhat.com> 2.8.1-4
+- Ship translations.
+
+* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Thu May 23 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Mon Apr 22 2002 Tim Waugh <twaugh@redhat.com> 2.8.1-1
+- 2.8.1.
+- No longer need immunix-owl-tmp patch.
+
+* Wed Feb 27 2002 Tim Waugh <twaugh@redhat.com> 2.7.2-5
+- Rebuild in new environment.
+
+* Wed Jan 09 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Fri Nov 02 2001 Tim Waugh <twaugh@redhat.com> 2.7.2-3
+- Make sure %%post scriplet doesn't fail if --excludedocs is used.
+
+* Fri Jun 01 2001 Tim Waugh <twaugh@redhat.com> 2.7.2-2
+- Install diff.1, since it's no longer in man-pages.
+
+* Fri Mar 30 2001 Tim Waugh <twaugh@redhat.com> 2.7.2-1
+- 2.7.2.
+
+* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Thu Jul 06 2000 Trond Eivind Glomsrød <teg@redhat.com>
+- fix %%changelog entries (escape them)
+- update source location
+- remove manual stripping
+- add URL
+
+* Tue Jun 06 2000 Than Ngo <than@redhat.de>
+- add %%defattr
+- use rpm macros
+
+* Wed May 31 2000 Ngo Than <than@redhat.de>
+- put man pages and info files in correct place
+- cleanup specfile
+
+* Thu Feb 03 2000 Preston Brown <pbrown@redhat.com>
+- rebuild to gzip man pages.
+
+* Mon Apr 19 1999 Jeff Johnson <jbj@redhat.com>
+- man pages not in %%files.
+- but avoid conflict for diff.1
+
+* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com> 
+- auto rebuild in the new build environment (release 14)
+
+* Sun Mar 14 1999 Jeff Johnson <jbj@redhat.com>
+- add man pages (#831).
+- add %%configure and Prefix.
+
+* Thu Dec 17 1998 Cristian Gafton <gafton@redhat.com>
+- build for glibc 2.1
+
+* Tue Jul 14 1998 Bill Kawakami <billk@home.com>
+- included the four man pages stolen from Slackware
+
+* Tue May 05 1998 Prospector System <bugs@redhat.com>
+- translations modified for de, fr, tr
+
+* Sun May 03 1998 Cristian Gafton <gafton@redhat.com>
+- fixed spec file to reference/use the $RPM_BUILD_ROOT always
+    
+* Wed Dec 31 1997 Otto Hammersmith <otto@redhat.com>
+- fixed where it looks for 'pr' (/usr/bin, rather than /bin)
+
+* Fri Oct 17 1997 Donnie Barnes <djb@redhat.com>
+- added BuildRoot
+
+* Sun Sep 14 1997 Erik Troan <ewt@redhat.com>
+- uses install-info
+
+* Mon Jun 02 1997 Erik Troan <ewt@redhat.com>
+- built against glibc