- Take back the commit from Oct. 1, 2004 since FreeBSD has changed their
authorSascha Wildner <swildner@dragonflybsd.org>
Sun, 26 Dec 2004 15:55:23 +0000 (15:55 +0000)
committerSascha Wildner <swildner@dragonflybsd.org>
Sun, 26 Dec 2004 15:55:23 +0000 (15:55 +0000)
  Mk/bsd.port.mk in the meantime to use the --suffix option.

- Sync with OpenBSD, which means the reject file is written in unified
  format now if the original diff was unified.

- Perform some minor cleanup.

usr.bin/patch/inp.c
usr.bin/patch/patch.1
usr.bin/patch/patch.c
usr.bin/patch/util.c

index 6eff680..8c81010 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $OpenBSD: inp.c,v 1.32 2004/08/05 21:47:24 deraadt Exp $
- * $DragonFly: src/usr.bin/patch/inp.c,v 1.2 2004/09/28 19:09:50 joerg Exp $
+ * $DragonFly: src/usr.bin/patch/inp.c,v 1.3 2004/12/26 15:55:23 swildner Exp $
  */
 
 /*
@@ -346,7 +346,7 @@ plan_b(const char *filename)
        using_plan_a = false;
        if ((ifp = fopen(filename, "r")) == NULL)
                pfatal("can't open file %s", filename);
-       (void) unlink(TMPINNAME);
+       unlink(TMPINNAME);
        if ((tifd = open(TMPINNAME, O_EXCL | O_CREAT | O_WRONLY, 0666)) < 0)
                pfatal("can't open file %s", TMPINNAME);
        while (fgets(buf, sizeof buf, ifp) != NULL) {
index fee7af3..c60aef0 100644 (file)
@@ -1,5 +1,5 @@
 .\"    $OpenBSD: patch.1,v 1.17 2003/10/31 20:20:45 millert Exp $
-.\"    $DragonFly: src/usr.bin/patch/patch.1,v 1.2 2004/10/02 05:52:06 dillon Exp $
+.\"    $DragonFly: src/usr.bin/patch/patch.1,v 1.3 2004/12/26 15:55:23 swildner Exp $
 .\"
 .\" Copyright 1986, Larry Wall
 .\"
@@ -304,7 +304,7 @@ Always make simple backups.
 Sets internal debugging flags, and is of interest only to
 .Nm
 patchers.
-.It Fl z , Fl b , Fl Fl suffix
+.It Fl z , Fl Fl suffix
 Causes the next argument to be interpreted as the backup extension, to be
 used in place of
 .Qq .orig .
@@ -315,7 +315,7 @@ conformance, specifically:
 .Bl -enum
 .It
 Backup files are not created unless the
-.Fl Fl backup
+.Fl Fl b
 option is specified.
 .It
 If unspecified, the file name used is the first of the old, new and
@@ -484,7 +484,6 @@ the original file backed up to the same name with the extension
 or as specified by the
 .Fl B ,
 .Fl V ,
-.Fl b ,
 or
 .Fl z
 options.
index 31940fe..bc35ac1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $OpenBSD: patch.c,v 1.41 2004/07/09 19:13:46 otto Exp $
- * $DragonFly: src/usr.bin/patch/patch.c,v 1.2 2004/10/02 05:52:06 dillon Exp $
+ * $DragonFly: src/usr.bin/patch/patch.c,v 1.3 2004/12/26 15:55:23 swildner Exp $
  */
 
 /*
@@ -31,7 +31,6 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <unistd.h>
 
 #include <ctype.h>
 #include <getopt.h>
@@ -39,6 +38,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "common.h"
 #include "util.h"
@@ -90,6 +90,8 @@ int           posix = 0;              /* strict POSIX mode? */
 static void    reinitialize_almost_everything(void);
 static void    get_some_switches(void);
 static LINENUM locate_hunk(LINENUM);
+static void    abort_context_hunk(void);
+static void    rej_line(int, LINENUM);
 static void    abort_hunk(void);
 static void    apply_hunk(LINENUM);
 static void    init_output(const char *);
@@ -145,7 +147,7 @@ static char         end_defined[128];
 int
 main(int argc, char *argv[])
 {
-       int     error = 0, hunk, failed, patch_seen = 0, i, fd;
+       int     error = 0, hunk, failed, i, fd;
        LINENUM where = 0, newwhere, fuzz, mymaxfuzz;
        const   char *tmpdir;
        char    *v;
@@ -209,7 +211,6 @@ main(int argc, char *argv[])
            reinitialize_almost_everything()) {
                /* for each patch in patch file */
 
-               patch_seen = true;
                warn_on_invalid_line = true;
 
                if (outname == NULL)
@@ -436,7 +437,7 @@ reinitialize_almost_everything(void)
 static void
 get_some_switches(void)
 {
-       const char *options = "b:B:cCd:D:eEfF:i:lnNo:p:r:RstuvV:x:z:";
+       const char *options = "b::B:cCd:D:eEfF:i:lnNo:p:r:RstuvV:x:z:";
        static struct option longopts[] = {
                {"backup",              no_argument,            0,      'b'},
                {"batch",               no_argument,            0,      't'},
@@ -668,7 +669,7 @@ locate_hunk(LINENUM fuzz)
 /* We did not find the pattern, dump out the hunk so they can handle it. */
 
 static void
-abort_hunk(void)
+abort_context_hunk(void)
 {
        LINENUM i;
        const LINENUM   pat_end = pch_end();
@@ -714,7 +715,85 @@ abort_hunk(void)
                        fprintf(rejfp, "%c %s", pch_char(i), pfetch(i));
                        break;
                default:
-                       fatal("fatal internal error in abort_hunk\n");
+                       fatal("fatal internal error in abort_context_hunk\n");
+               }
+       }
+}
+
+static void
+rej_line(int ch, LINENUM i)
+{
+       size_t len;
+       const char *line = pfetch(i);
+
+       len = strlen(line);
+
+       fprintf(rejfp, "%c%s", ch, line);
+       if (len == 0 || line[len-1] != '\n')
+               fprintf(rejfp, "\n\\ No newline at end of file\n");
+}
+
+static void
+abort_hunk(void)
+{
+       LINENUM         i, j, split;
+       int             ch1, ch2;
+       const LINENUM   pat_end = pch_end();
+       const LINENUM   oldfirst = pch_first() + last_offset;
+       const LINENUM   newfirst = pch_newfirst() + last_offset;
+
+       if (diff_type != UNI_DIFF) {
+               abort_context_hunk();
+               return;
+       }
+       split = -1;
+       for (i = 0; i <= pat_end; i++) {
+               if (pch_char(i) == '=') {
+                       split = i;
+                       break;
+               }
+       }
+       if (split == -1) {
+               fprintf(rejfp, "malformed hunk: no split found\n");
+               return;
+       }
+       i = 0;
+       j = split + 1;
+       fprintf(rejfp, "@@ -%ld,%ld +%ld,%ld @@\n",
+           pch_ptrn_lines() ? oldfirst : 0,
+           pch_ptrn_lines(), newfirst, pch_repl_lines());
+       while (i < split || j <= pat_end) {
+               ch1 = i < split ? pch_char(i) : -1;
+               ch2 = j <= pat_end ? pch_char(j) : -1;
+               if (ch1 == '-') {
+                       rej_line('-', i);
+                       i++;
+               } else if (ch1 == ' ' && ch2 == ' ') {
+                       rej_line(' ', i);
+                       i++;
+                       j++;
+               } else if (ch1 == '!' && ch2 == '!') {
+                       while (i < split && ch1 == '!') {
+                               rej_line('-', i);
+                               i++;
+                               ch1 = i < split ? pch_char(i) : -1;
+                       }
+                       while (j <= pat_end && ch2 == '!') {
+                               rej_line('+', j);
+                               j++;
+                               ch2 = j <= pat_end ? pch_char(j) : -1;
+                       }
+               } else if (ch1 == '*') {
+                       i++;
+               } else if (ch2 == '+' || ch2 == ' ') {
+                       rej_line(ch2, j);
+                       j++;
+               } else {
+                       fprintf(rejfp, "internal error on (%ld %ld %ld)\n",
+                           i, split, j);
+                       rej_line(ch1, i);
+                       rej_line(ch2, j);
+                       return;
                }
        }
 }
index 91fae1b..b92a02f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * $OpenBSD: util.c,v 1.28 2004/08/05 21:47:24 deraadt Exp $
- * $DragonFly: src/usr.bin/patch/util.c,v 1.2 2004/09/28 19:09:50 joerg Exp $
+ * $DragonFly: src/usr.bin/patch/util.c,v 1.3 2004/12/26 15:55:23 swildner Exp $
  */
 
 /*
@@ -332,7 +332,7 @@ char *
 fetchname(const char *at, bool *exists, int strip_leading)
 {
        char            *fullname, *name, *t;
-       int             sleading;
+       int             sleading, tab;
        struct stat     filestat;
 
        if (at == NULL || *at == '\0')
@@ -348,8 +348,10 @@ fetchname(const char *at, bool *exists, int strip_leading)
                return NULL;
        name = fullname = t = savestr(at);
 
+       tab = strchr(t, '\t') != NULL;
        /* Strip off up to `strip_leading' path components and NUL terminate. */
-       for (sleading = strip_leading; *t != '\0' && !isspace(*t); t++) {
+       for (sleading = strip_leading; *t != '\0' && ((tab && *t != '\t') ||
+           !isspace(*t)); t++) {
                if (t[0] == '/' && t[1] != '/' && t[1] != '\0')
                        if (--sleading >= 0)
                                name = t + 1;