=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/diff/diffdir.c,v retrieving revision 1.16 retrieving revision 1.17 diff -c -r1.16 -r1.17 *** src/usr.bin/diff/diffdir.c 2003/07/04 02:54:36 1.16 --- src/usr.bin/diff/diffdir.c 2003/07/04 17:50:24 1.17 *************** *** 1,4 **** ! /* $OpenBSD: diffdir.c,v 1.16 2003/07/04 02:54:36 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. --- 1,4 ---- ! /* $OpenBSD: diffdir.c,v 1.17 2003/07/04 17:50:24 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. *************** *** 57,66 **** */ #define d_flags d_ino ! #define ONLY 1 /* Only in this directory */ ! #define SAME 2 /* Both places and same */ ! #define DIFFER 4 /* Both places and different */ ! #define DIRECT 8 /* Directory */ struct dir { u_long d_ino; --- 57,63 ---- */ #define d_flags d_ino ! #define DIRECT 1 /* Directory */ struct dir { u_long d_ino; *************** *** 69,90 **** char *d_entry; }; - int header; static int dirstatus; /* exit status from diffdir */ ! extern int status; ! char title[2 * BUFSIZ]; ! char *etitle; ! char *prargs[] = {"pr", "-h", 0, "-f", 0, 0}; static struct dir *setupdir(char *); static int ascii(int); static void compare(struct dir *); ! static void calldiff(char *); static void setfile(char **fpp, char **epp, char *file); static int useless(char *); static void only(struct dir *dp, int which); - static void scanpr(struct dir *, int, char *, char *, char *, char *, char *); static int entcmp(const void *, const void *); void --- 66,82 ---- char *d_entry; }; static int dirstatus; /* exit status from diffdir */ ! static char title[2 * BUFSIZ]; static struct dir *setupdir(char *); static int ascii(int); static void compare(struct dir *); ! static void calldiff(void); static void setfile(char **fpp, char **epp, char *file); static int useless(char *); static void only(struct dir *dp, int which); static int entcmp(const void *, const void *); void *************** *** 96,103 **** if (opt == D_IFDEF) warnx("can't specify -I with directories"); ! if (opt == D_EDIT && (sflag || lflag)) ! warnx("warning: shouldn't give -s or -l with -e"); strlcpy(title, "diff ", sizeof title); for (i = 1; diffargv[i + 2]; i++) { if (!strcmp(diffargv[i], "-")) --- 88,95 ---- if (opt == D_IFDEF) warnx("can't specify -I with directories"); ! if (opt == D_EDIT && sflag) ! warnx("warning: shouldn't give -s with -e"); strlcpy(title, "diff ", sizeof title); for (i = 1; diffargv[i + 2]; i++) { if (!strcmp(diffargv[i], "-")) *************** *** 105,112 **** strlcat(title, diffargv[i], sizeof title); strlcat(title, " ", sizeof title); } - for (etitle = title; *etitle; etitle++) - ; setfile(&file1, &efile1, file1); setfile(&file2, &efile2, file2); argv[0] = file1; --- 97,102 ---- *************** *** 131,139 **** else cmp = strcmp(d1->d_entry, d2->d_entry); if (cmp < 0) { ! if (lflag) ! d1->d_flags |= ONLY; ! else if (opt == 0 || opt == 2) only(d1, 1); d1++; dirstatus |= 1; --- 121,127 ---- else cmp = strcmp(d1->d_entry, d2->d_entry); if (cmp < 0) { ! if (opt == 0 || opt == 2) only(d1, 1); d1++; dirstatus |= 1; *************** *** 142,168 **** d1++; d2++; } else { ! if (lflag) ! d2->d_flags |= ONLY; ! else if (opt == 0 || opt == 2) only(d2, 2); d2++; dirstatus |= 1; } } - if (lflag) { - scanpr(dir1, ONLY, "Only in %.*s", file1, efile1, 0, 0); - scanpr(dir2, ONLY, "Only in %.*s", file2, efile2, 0, 0); - scanpr(dir1, SAME, "Common identical files in %.*s and %.*s", - file1, efile1, file2, efile2); - scanpr(dir1, DIFFER, "Binary files which differ in %.*s and %.*s", - file1, efile1, file2, efile2); - scanpr(dir1, DIRECT, "Common subdirectories of %.*s and %.*s", - file1, efile1, file2, efile2); - } if (rflag) { - if (header && lflag) - printf("\f"); for (d1 = dir1; d1->d_entry; d1++) { if ((d1->d_flags & DIRECT) == 0) continue; --- 130,142 ---- d1++; d2++; } else { ! if (opt == 0 || opt == 2) only(d2, 2); d2++; dirstatus |= 1; } } if (rflag) { for (d1 = dir1; d1->d_entry; d1++) { if ((d1->d_flags & DIRECT) == 0) continue; *************** *** 170,176 **** file1 + MAXPATHLEN - efile1); strlcpy(efile2, d1->d_entry, file2 + MAXPATHLEN - efile2); ! calldiff(0); } } status = dirstatus; --- 144,150 ---- file1 + MAXPATHLEN - efile1); strlcpy(efile2, d1->d_entry, file2 + MAXPATHLEN - efile2); ! calldiff(); } } status = dirstatus; *************** *** 198,227 **** *epp = cp; } - static void - scanpr(struct dir *dp, int test, char *title, char *file1, char *efile1, - char *file2, char *efile2) - { - int titled = 0; - - for (; dp->d_entry; dp++) { - if ((dp->d_flags & test) == 0) - continue; - if (titled == 0) { - if (header == 0) - header = 1; - else - printf("\n"); - printf(title, - efile1 - file1 - 1, file1, - efile2 - file2 - 1, file2); - printf(":\n"); - titled = 1; - } - printf("\t%s\n", dp->d_entry); - } - } - void only(struct dir *dp, int which) { --- 172,177 ---- *************** *** 302,308 **** goto same; if (fmt1 == S_IFDIR) { dp->d_flags = DIRECT; ! if (lflag || opt == D_EDIT) goto closem; printf("Common subdirectories: %s and %s\n", file1, file2); --- 252,258 ---- goto same; if (fmt1 == S_IFDIR) { dp->d_flags = DIRECT; ! if (opt == D_EDIT) goto closem; printf("Common subdirectories: %s and %s\n", file1, file2); *************** *** 325,343 **** goto notsame; } same: ! if (sflag == 0) ! goto closem; ! if (lflag) ! dp->d_flags = SAME; ! else printf("Files %s and %s are identical\n", file1, file2); goto closem; notsame: dirstatus |= 1; if (!ascii(f1) || !ascii(f2)) { ! if (lflag) ! dp->d_flags |= DIFFER; ! else if (opt == D_NORMAL || opt == D_CONTEXT || opt == D_UNIFIED) printf("Binary files %s and %s differ\n", file1, file2); goto closem; --- 275,287 ---- goto notsame; } same: ! if (sflag != 0) printf("Files %s and %s are identical\n", file1, file2); goto closem; notsame: dirstatus |= 1; if (!ascii(f1) || !ascii(f2)) { ! if (opt == D_NORMAL || opt == D_CONTEXT || opt == D_UNIFIED) printf("Binary files %s and %s differ\n", file1, file2); goto closem; *************** *** 345,363 **** close(f1); close(f2); anychange = 1; ! if (lflag) ! calldiff(title); ! else { ! if (opt == D_EDIT) { ! printf("ed - %s << '-*-END-*-'\n", dp->d_entry); ! calldiff(0); ! } else { ! printf("%s%s %s\n", title, file1, file2); ! calldiff(0); ! } ! if (opt == D_EDIT) ! printf("w\nq\n-*-END-*-\n"); } return; closem: close(f1); --- 289,303 ---- close(f1); close(f2); anychange = 1; ! if (opt == D_EDIT) { ! printf("ed - %s << '-*-END-*-'\n", dp->d_entry); ! calldiff(); ! } else { ! printf("%s%s %s\n", title, file1, file2); ! calldiff(); } + if (opt == D_EDIT) + printf("w\nq\n-*-END-*-\n"); return; closem: close(f1); *************** *** 365,413 **** } static void ! calldiff(char *wantpr) { ! int lstatus, lstatus2, pv[2]; pid_t pid; - prargs[2] = wantpr; fflush(stdout); - if (wantpr) { - snprintf(etitle, title + sizeof title - etitle, - "%s %s", file1, file2); - pipe(pv); - pid = fork(); - if (pid == -1) - errorx("No more processes"); - if (pid == 0) { - close(0); - dup(pv[0]); - close(pv[0]); - close(pv[1]); - execv(_PATH_PR, prargs); - errorx("%s", _PATH_PR); - } - } pid = fork(); if (pid == -1) errorx("No more processes"); if (pid == 0) { - if (wantpr) { - close(1); - dup(pv[1]); - close(pv[0]); - close(pv[1]); - } execv(_PATH_DIFF, diffargv); error("%s", _PATH_DIFF); } - if (wantpr) { - close(pv[0]); - close(pv[1]); - } while (wait(&lstatus) != pid) - continue; - while (wait(&lstatus2) != -1) continue; /* if ((lstatus >> 8) >= 2) --- 305,324 ---- } static void ! calldiff(void) { ! int lstatus; pid_t pid; fflush(stdout); pid = fork(); if (pid == -1) errorx("No more processes"); if (pid == 0) { execv(_PATH_DIFF, diffargv); error("%s", _PATH_DIFF); } while (wait(&lstatus) != pid) continue; /* if ((lstatus >> 8) >= 2)