ast@cs.vu.nl (Andy Tanenbaum) (06/29/87)
: This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin echo Extracting \R\E\A\D\_\M\E sed 's/^X//' > \R\E\A\D\_\M\E << '+ END-OF-FILE '\R\E\A\D\_\M\E XI am almost done with the MINIX 1.2 release. P-H does not have any kind of Xupgrade policy. If you buy the first edition of a book, that does not give Xyou any right to a discount on the second edition. They don't even have a Xlist of who bought MINIX 1.1, so they couldn't even implement such a policy Xif they wanted to. For the benefit of readers of this news group, I will Xpost most of the changes that I have made, so you can upgrade yourself. XPlease in fact do so, and if you post subsequent changes, do so relative to XMINIX 1.2 if at all possible. In any event, when posting diffs, specify Xwhich version 1.1 or 1.2 was the base. Bug reports in any of the 1.2 programs Xare welcome, and should be posted or mailed to me. X XThe diff listings were made with Erik Baalbergen's diff, which will be included Xin 1.2 and is the "official" diff. An up-to-date version of that diff.c is Xincluded in this file. To update, say, your old cp.c, do as follows: XFirst compile fix.c and put it on fix. This is the "official" MINIX patch-type Xprogram. It was orginally posted by Erik Baalbergen as "patch," but I changed Xthe name to fix to avoid confusion with Larry Wall's program, which is much Xfancier (and much bigger). Then, to fix, say, cp.c, do the following: X Xcp cp.c cp.c.old Xfix cp.c.old cp.diff >cp.c X XRepeat this process for each file to be fixed. The files that are new I Xhave posted in their entirety in a separate posting. X XI will be away for about 3 weeks, so if there are problems, post them to the Xnet and see if you can figure them out collectively. X XAndy Tanenbaum (ast@cs.vu.nl) X X------------------------------------------------------------------------- XHere is a listing of the new or modified files in commands. X-rw-r--r-- 1 ast 10506 Jun 29 20:59 ar.c X-rw-r--r-- 1 ast 622 Jun 29 20:59 basename.c X-rw-r--r-- 1 ast 1406 Jun 29 20:59 cat.c X-rw-r--r-- 1 ast 10899 Jun 29 20:59 cc.c X-rw-r--r-- 1 ast 2891 Jun 29 20:59 cp.c X-rw-r--r-- 1 ast 3611 Jun 29 20:59 cpdir.c X-rw-r--r-- 1 ast 2979 Jun 29 20:59 df.c X-rw-r--r-- 1 ast 5376 Jun 29 21:03 diff.c X-rw-r--r-- 1 ast 20167 Jun 29 20:59 dosread.c X-rw-r--r-- 1 ast 4363 Jun 29 20:59 du.c X-rw-r--r-- 1 ast 2763 Jun 29 20:59 expr.c X-rw-r--r-- 1 ast 28692 Jun 29 20:59 find.c X-rw-r--r-- 1 ast 3506 Jun 29 21:07 fix.c X-rw-r--r-- 1 ast 1265 Jun 29 20:59 head.c X-rw-r--r-- 1 ast 1082 Jun 29 20:59 ln.c X-rw-r--r-- 1 ast 1211 Jun 29 20:59 login.c X-rw-r--r-- 1 ast 12924 Jun 29 20:59 ls.c X-rw-r--r-- 1 ast 51610 Jun 29 20:59 make.c X-rw-r--r-- 1 ast 24065 Jun 29 20:59 mkfs.c X-rw-r--r-- 1 ast 4523 Jun 29 20:59 more.c X-rw-r--r-- 1 ast 3184 Jun 29 20:59 mv.c X-rw-r--r-- 1 ast 5193 Jun 29 20:59 od.c X-rw-r--r-- 1 ast 2384 Jun 29 20:59 passwd.c X-rw-r--r-- 1 ast 6562 Jun 29 20:59 pr.c X-rw-r--r-- 1 ast 1635 Jun 29 20:59 pwd.c X-rw-r--r-- 1 ast 14451 Jun 29 20:59 readfs.c X-rw-r--r-- 1 ast 3002 Jun 29 20:59 rmdir.c X-rw-r--r-- 1 ast 20250 Jun 29 20:59 roff.c X-rw-r--r-- 1 ast 1977 Jun 29 20:59 split.c X-rw-r--r-- 1 ast 9382 Jun 29 20:59 tar.c X-rw-r--r-- 1 ast 4115 Jun 29 20:59 test.c X-rw-r--r-- 1 ast 3393 Jun 29 20:59 uudecode.c X-rw-r--r-- 1 ast 1822 Jun 29 20:59 uuencode.c X-rw-r--r-- 1 ast 2920 Jun 29 20:59 wc.c X XHere are the sums of the above files. There were made on a VAX, so the block Xsizes will be off by a factor of 2, but the sums should be ok. X39677 11 ar.c X38334 1 basename.c X00126 2 cat.c X15390 11 cc.c X00802 3 cp.c X36999 4 cpdir.c X01111 3 df.c X50498 6 diff.c X19389 20 dosread.c X42103 5 du.c X09684 3 expr.c X06369 29 find.c X06970 4 fix.c X01392 2 head.c X21556 2 ln.c X06704 2 login.c X28118 13 ls.c X03475 51 make.c X50786 24 mkfs.c X15911 5 more.c X26091 4 mv.c X50949 6 od.c X53805 3 passwd.c X16635 7 pr.c X14023 2 pwd.c X53130 15 readfs.c X45906 3 rmdir.c X04713 20 roff.c X29787 2 split.c X33176 10 tar.c X57177 5 test.c X15350 4 uudecode.c X13877 2 uuencode.c X30936 3 wc.c X X + END-OF-FILE READ_ME chmod 'u=rw,g=r,o=r' \R\E\A\D\_\M\E set `sum \R\E\A\D\_\M\E` sum=$1 case $sum in 30564) :;; *) echo 'Bad sum in '\R\E\A\D\_\M\E >&2 esac echo Extracting \a\r\.\d\i\f\f sed 's/^X//' > \a\r\.\d\i\f\f << '+ END-OF-FILE '\a\r\.\d\i\f\f X244c244 X< ar_fd = open_archive(argv[2], (show_fl || pr_fl) ? READ : APPEND); X--- X> ar_fd = open_archive(argv[2], (show_fl || pr_fl || ex_fl) ? READ : APPEND); + END-OF-FILE ar.diff chmod 'u=rw,g=r,o=r' \a\r\.\d\i\f\f set `sum \a\r\.\d\i\f\f` sum=$1 case $sum in 26299) :;; *) echo 'Bad sum in '\a\r\.\d\i\f\f >&2 esac echo Extracting \b\a\s\e\n\a\m\e\.\d\i\f\f sed 's/^X//' > \b\a\s\e\n\a\m\e\.\d\i\f\f << '+ END-OF-FILE '\b\a\s\e\n\a\m\e\.\d\i\f\f X27c27 X< prints("%s \n",d); X--- X> prints("%s\n",d); X35,36c35,36 X< prints("%s \n",c); X< } X--- X> prints("%s\n",c); X> } + END-OF-FILE basename.diff chmod 'u=rw,g=r,o=r' \b\a\s\e\n\a\m\e\.\d\i\f\f set `sum \b\a\s\e\n\a\m\e\.\d\i\f\f` sum=$1 case $sum in 07740) :;; *) echo 'Bad sum in '\b\a\s\e\n\a\m\e\.\d\i\f\f >&2 esac echo Extracting \c\a\t\.\d\i\f\f sed 's/^X//' > \c\a\t\.\d\i\f\f << '+ END-OF-FILE '\c\a\t\.\d\i\f\f X86c86 X< if (write(1, buffer, next - buffer) <= 0) quit(); X--- X> if (write(1, buffer, (int) (next - buffer)) <= 0) quit(); + END-OF-FILE cat.diff chmod 'u=rw,g=r,o=r' \c\a\t\.\d\i\f\f set `sum \c\a\t\.\d\i\f\f` sum=$1 case $sum in 13846) :;; *) echo 'Bad sum in '\c\a\t\.\d\i\f\f >&2 esac echo Extracting \c\c\.\d\i\f\f sed 's/^X//' > \c\c\.\d\i\f\f << '+ END-OF-FILE '\c\c\.\d\i\f\f X1,5c1,6 X< /* $Header: cc.c,v 1.2 86/08/26 09:40:10 erikb Locked $ X< Driver for the CEMCOM compiler: works like /bin/cc and accepts the X< options accepted by /bin/cc and /usr/em/bin/ack. X< Derived from: "cem.c,v 1.5 86/01/20 11:10:29 erikb Exp" X< X--- X> /* X> Driver for the CEMCOM compiler. X> Derived from: "cem.c,v 1.5 86/01/20 11:10:29 erikb Exp" X> Author: Erik Baalbergen X> X> Log: X14c15 X< Author: Erik Baalbergen X--- X> Various minor corrections for MINIX (Mar 18, 1987) X30c31 X< !!!!_SEE_BELOW_!!! X--- X> !!!!_SEE_BELOW_!!! X42c43 X< /* #define MEM640K */ X--- X> /* #define MEM640K */ X67,69d67 X< /* object sizes */ X< char *V_FLAG = "-Vs2.2w2.2i2.2l4.2f4.2d8.2p2.2"; X< X84a83 X> X190,195d188 X< case 'L': X< if (strcmp(&str[1], "LIB") == 0) { X< append(&OPT_FLAGS, "-L"); X< break; X< } X< /*FALLTHROUGH*/ X204a198 X> append(&ASLD_FLAGS, str); X211,212c205,211 X< X< default: X--- X> case 'L': X> if (strcmp(&str[1], "LIB") == 0) { X> append(&OPT_FLAGS, "-L"); X> break; X> } X> /*FALLTHROUGH*/ X> default: /* -i goes here! */ X218a218 X> append(&CEM_FLAGS, "-L"); /* disable profiling */ X254d253 X< append(call1, V_FLAG); X274d272 X< append(call, V_FLAG); X417,420c415,421 X< if (*--p1 == '.') X< *p1 = '\0'; X< while (*dst++ = *p2++); X< *p1 = '.'; X--- X> if (*--p1 == '.') { X> *p1 = '\0'; X> while (*dst++ = *p2++); X> *p1 = '.'; X> } X> else X> while (*dst++ = *p2++); + END-OF-FILE cc.diff chmod 'u=rw,g=r,o=r' \c\c\.\d\i\f\f set `sum \c\c\.\d\i\f\f` sum=$1 case $sum in 62048) :;; *) echo 'Bad sum in '\c\c\.\d\i\f\f >&2 esac echo Extracting \c\p\.\d\i\f\f sed 's/^X//' > \c\p\.\d\i\f\f << '+ END-OF-FILE '\c\p\.\d\i\f\f X47a48 X> exit(0); + END-OF-FILE cp.diff chmod 'u=rw,g=r,o=r' \c\p\.\d\i\f\f set `sum \c\p\.\d\i\f\f` sum=$1 case $sum in 31554) :;; *) echo 'Bad sum in '\c\p\.\d\i\f\f >&2 esac echo Extracting \d\f\.\d\i\f\f sed 's/^X//' > \d\f\.\d\i\f\f << '+ END-OF-FILE '\d\f\.\d\i\f\f X37d36 X< extern char *itoa(); X133a133 X> return(0); X146a147 X> extern char *itoa(); + END-OF-FILE df.diff chmod 'u=rw,g=r,o=r' \d\f\.\d\i\f\f set `sum \d\f\.\d\i\f\f` sum=$1 case $sum in 26779) :;; *) echo 'Bad sum in '\d\f\.\d\i\f\f >&2 esac echo Extracting \d\i\f\f\.\c sed 's/^X//' > \d\i\f\f\.\c << '+ END-OF-FILE '\d\i\f\f\.\c X/* diff - print differences between 2 files Author: Erik Baalbergen */ X X/* Poor man's implementation of diff(1) X - no options available X - may give more output than other diffs, due to the straight-forward algorithm X - runs out of memory if the differing chunks become too large X - input line length should not exceed LINELEN; longer lines are truncated, X while only the first LINELEN characters are compared X X Please report bugs and suggestions to erikb@cs.vu.nl X*/ X#include "stdio.h" XFILE *fopen(); X X#define LINELEN 128 X Xchar *prog; Xint diffs = 0; X Xmain(argc, argv) X char **argv; X{ X FILE *fp1 = NULL, *fp2 = NULL; X X prog = *argv++; X if (argc != 3) X fatal("use: %s file1 file2", prog); X if (strcmp(argv[0], "-") == 0) X fp1 = stdin; X else X if (strcmp(argv[1], "-") == 0) X fp2 = stdin; X if (fp1 == NULL && (fp1 = fopen(argv[0], "r")) == NULL) X fatal("can't read %s", argv[0]); X if (fp2 == NULL && (fp2 = fopen(argv[1], "r")) == NULL) X fatal("can't read %s", argv[1]); X diff(fp1, fp2); X exit(diffs > 0); X} X Xfatal(fmt, s) X char *fmt, *s; X{ X fprintf(stderr, "%s: ", prog); X fprintf(stderr, fmt, s); X fprintf(stderr, "\n"); X exit(2); X} X X/* the line module */ Xchar *malloc(); Xchar *fgets(); X Xstruct line { X struct line *l_next; X char l_text[LINELEN + 2]; X}; X Xstruct line *freelist = 0; X Xstruct line * Xnew_line() X{ X register struct line *l; X X if (l = freelist) X freelist = freelist->l_next; X else X if ((l = (struct line *)malloc(sizeof(struct line))) == 0) X fatal("out of memory"); X return l; X} X Xfree_line(l) X register struct line *l; X{ X l->l_next = freelist; X freelist = l; X} X X#define equal_line(l1, l2) (strcmp((l1)->l_text, (l2)->l_text) == 0) X Xint equal_3(l1, l2) X struct line *l1, *l2; X{ X register int i; X X for (i=0; i<3 && l1 && l2; ++i, l1=l1->l_next, l2=l2->l_next) { X if (!equal_line(l1, l2)) X return 0; X } X return (i==3); X} X Xstruct line * Xread_line(fp) X FILE *fp; X{ X register struct line *l = new_line(); X register char *p; X register int c; X X (p = &(l->l_text[LINELEN]))[1] = '\377'; X if (fgets(l->l_text, LINELEN + 2, fp) == NULL) { X free_line(l); X return 0; X } X if (p[1] != '\377' && *p != '\n') { X while ((c = fgetc(fp)) != '\n' && c != EOF) {} X *p++ = '\n'; X *p = '\0'; X } X l->l_next = 0; X return l; X} X X/* file window handler */ Xstruct f { X struct line *f_bwin, *f_ewin; X struct line *f_aside; X int f_linecnt; /* line number in file of last advanced line */ X FILE *f_fp; X}; X Xadvance(f) X register struct f *f; X{ X register struct line *l; X X if (l = f->f_bwin) { X if (f->f_ewin == l) X f->f_bwin = f->f_ewin = 0; X else X f->f_bwin = l->l_next; X free_line(l); X (f->f_linecnt)++; X } X} X Xaside(f, l) X struct f *f; X struct line *l; X{ X register struct line *ll; X X if (ll = l->l_next) { X while (ll->l_next) X ll = ll->l_next; X ll->l_next = f->f_aside; X f->f_aside = l->l_next; X l->l_next = 0; X f->f_ewin = l; X } X} X Xstruct line * Xnext(f) X register struct f *f; X{ X register struct line *l; X X if (l = f->f_aside) { X f->f_aside = l->l_next; X l->l_next = 0; X } X else X l = read_line(f->f_fp); X if (l) { X if (f->f_bwin == 0) X f->f_bwin = f->f_ewin = l; X else { X f->f_ewin->l_next = l; X f->f_ewin = l; X } X } X return l; X} X Xinit_f(f, fp) X register struct f *f; X FILE *fp; X{ X f->f_bwin = f->f_ewin = f->f_aside = 0; X f->f_linecnt = 0; X f->f_fp = fp; X} X Xupdate(f, s) X register struct f *f; X char *s; X{ X while (f->f_bwin && f->f_bwin != f->f_ewin) { X printf("%s%s", s, f->f_bwin->l_text); X advance(f); X } X} X X/* diff procedure */ Xdiff(fp1, fp2) X FILE *fp1, *fp2; X{ X struct f f1, f2; X struct line *l1, *s1, *b1, *l2, *s2, *b2; X register struct line *ll; X X init_f(&f1, fp1); X init_f(&f2, fp2); X l1 = next(&f1); X l2 = next(&f2); X while (l1 && l2) { X if (equal_line(l1, l2)) { Xequal: X advance(&f1); X advance(&f2); X l1 = next(&f1); X l2 = next(&f2); X continue; X } X s1 = b1 = l1; X s2 = b2 = l2; X /* read several more lines */ X next(&f1); next(&f1); X next(&f2); next(&f2); X /* start searching */ Xsearch: X if ((l2 = next(&f2)) == 0) X continue; X ll = s1; X b2 = b2->l_next; X do { X if (equal_3(ll, b2)) { X aside(&f1, ll); X aside(&f2, b2); X differ(&f1, &f2); X goto equal; X } X } while (ll = ll->l_next); X if ((l1 = next(&f1)) == 0) X continue; X ll = s2; X b1 = b1->l_next; X do { X if (equal_3(ll, b1)) { X aside(&f2, ll); X aside(&f1, b1); X differ(&f1, &f2); X goto equal; X } X } while (ll = ll->l_next); X goto search; X } X /* one of the files reached EOF */ X if (l1) /* eof on 2 */ X while (next(&f1)) {} X if (l2) X while (next(&f2)) {} X f1.f_ewin = 0; X f2.f_ewin = 0; X differ(&f1, &f2); X} X Xdiffer(f1, f2) X register struct f *f1, *f2; X{ X int cnt1 = f1->f_linecnt, len1 = wlen(f1), cnt2 = f2->f_linecnt, X len2 = wlen(f2); X X if ((len1 = wlen(f1)) || (len2 = wlen(f2))) { X if (len1 == 0) { X printf("%da", cnt1); X range(cnt2 + 1, cnt2 + len2); X } X else X if (len2 == 0) { X range(cnt1 + 1, cnt1 + len1); X printf("d%d", cnt2); X } X else { X range(cnt1 + 1, cnt1 + len1); X putchar('c'); X range(cnt2 + 1, cnt2 + len2); X } X putchar('\n'); X if (len1) X update(f1, "< "); X if (len1 && len2) X printf("---\n"); X if (len2) X update(f2, "> "); X diffs++; X } X} X Xwlen(f) X struct f *f; X{ X register cnt = 0; X register struct line *l = f->f_bwin, *e = f->f_ewin; X X while (l && l != e) { X cnt++; X l = l->l_next; X } X return cnt; X} X Xrange(a, b) X{ X printf(((a == b) ? "%d" : "%d,%d"), a, b); X} + END-OF-FILE diff.c chmod 'u=rw,g=r,o=r' \d\i\f\f\.\c set `sum \d\i\f\f\.\c` sum=$1 case $sum in 50498) :;; *) echo 'Bad sum in '\d\i\f\f\.\c >&2 esac echo Extracting \d\o\s\r\e\a\d\.\d\i\f\f sed 's/^X//' > \d\o\s\r\e\a\d\.\d\i\f\f << '+ END-OF-FILE '\d\o\s\r\e\a\d\.\d\i\f\f X16c16 X< #define DRIVE "/dev/fdX" X--- X> #define DRIVE "/dev/atX" X279c279 X< while (*pathname != '/' && *pathname && i < 11) X--- X> while (*pathname != '/' && *pathname && i < 12) X494,506c494,502 X< for (i = 0, ptr = name; i < 8 && *ptr != '.' && *ptr; i++) X< entry->d_name[i] = *ptr++; X< while (i < 8) X< entry->d_name[i++] = ' '; X< r = strlen(name); X< while (r && name[r - 1] != '.') X< r--; X< X< i = 0; X< while (r && i < 3 && name[r]) X< entry->d_ext[i++] = name[r++]; X< while (i < 3) X< entry->d_ext[i++] = ' '; X--- X> bcopy(" ",&entry->d_name[0],11); /* clear entry */ X> for (i = 0, ptr = name; i < 8 && *ptr != '.' && *ptr; i++) X> entry->d_name[i] = *ptr++; X> while (*ptr != '.' && *ptr) X> ptr++; X> if (*ptr == '.') X> ptr++; X> for (i=0;i < 3 && *ptr; i++) X> entry->d_ext[i] = *ptr++; X584c580 X< day -= mon_len[i]; X--- X> day -= mon_len[i++]; X641c637 X< return (buffer - begin); X--- X> return (int) (buffer - begin); X819c815 X< write(2, buf, buf_ptr - buf); X--- X> write(2, buf, (int) (buf_ptr - buf)); + END-OF-FILE dosread.diff chmod 'u=rw,g=r,o=r' \d\o\s\r\e\a\d\.\d\i\f\f set `sum \d\o\s\r\e\a\d\.\d\i\f\f` sum=$1 case $sum in 27353) :;; *) echo 'Bad sum in '\d\o\s\r\e\a\d\.\d\i\f\f >&2 esac echo Extracting \h\e\a\d\.\d\i\f\f sed 's/^X//' > \h\e\a\d\.\d\i\f\f << '+ END-OF-FILE '\h\e\a\d\.\d\i\f\f X1a2,3 X> /* change to use putc() instead of prints() -- Dean Long 3/7/87 */ X> X8d9 X< char lbuf[256]; X43,44c44,47 X< else X< do_file(n); X--- X> else { X> do_file(n); X> fflush(stdout); X> } X48d50 X< fflush(stdout); X57,58c59,70 X< /* Print the first 'n' lines of a file. */ X< while (n--) do_line(); X--- X> int c; X> X> /* Print the first 'n' lines of a file. */ X> while(n) X> switch (c = getc(stdin)) { X> case EOF : X> return; X> case '\n': X> --n; X> default : X> putc((char)c, stdout); X> } X62,80c74,79 X< do_line() X< { X< /* Print one line. */ X< X< char c, *cp; X< cp = lbuf; X< while ( (c = getc(stdin)) != '\n') *cp++ = c; X< *cp++ = '\n'; X< *cp++ = 0; X< prints("%s",lbuf); X< } X< X< X< usage() X< { X< std_err("Usage: head [-n] [file ...]\n"); X< exit(1); X< } X< X--- X> usage() X> { X> std_err("Usage: head [-n] [file ...]\n"); X> exit(1); X> } X> + END-OF-FILE head.diff chmod 'u=rw,g=r,o=r' \h\e\a\d\.\d\i\f\f set `sum \h\e\a\d\.\d\i\f\f` sum=$1 case $sum in 26082) :;; *) echo 'Bad sum in '\h\e\a\d\.\d\i\f\f >&2 esac echo Extracting \l\n\.\d\i\f\f sed 's/^X//' > \l\n\.\d\i\f\f << '+ END-OF-FILE '\l\n\.\d\i\f\f X11a12 X> char *last_comp(); + END-OF-FILE ln.diff chmod 'u=rw,g=r,o=r' \l\n\.\d\i\f\f set `sum \l\n\.\d\i\f\f` sum=$1 case $sum in 44606) :;; *) echo 'Bad sum in '\l\n\.\d\i\f\f >&2 esac echo Extracting \l\o\g\i\n\.\d\i\f\f sed 's/^X//' > \l\o\g\i\n\.\d\i\f\f << '+ END-OF-FILE '\l\o\g\i\n\.\d\i\f\f X55,57c55,57 X< execl(pwd->pw_shell, "-", 0); X< } X< execl("/bin/sh", "-", 0); X--- X> execl(pwd->pw_shell, "-", (char *) 0); X> } X> execl("/bin/sh", "-", (char *) 0); + END-OF-FILE login.diff chmod 'u=rw,g=r,o=r' \l\o\g\i\n\.\d\i\f\f set `sum \l\o\g\i\n\.\d\i\f\f` sum=$1 case $sum in 14607) :;; *) echo 'Bad sum in '\l\o\g\i\n\.\d\i\f\f >&2 esac echo Extracting \l\s\.\d\i\f\f sed 's/^X//' > \l\s\.\d\i\f\f << '+ END-OF-FILE '\l\s\.\d\i\f\f X359c359,366 X< fprintf(stdout, "%s\n",fp->name); X--- X> m = 0; X> p1 = fp->name; X> while (*p1 != 0 && (m < DIRNAMELEN || *p1 == '/') ) { X> fprintf(stdout, "%c", *p1); X> m = (*p1 == '/' ? 0 : m + 1); X> p1++; X> } X> fprintf(stdout, "\n"); + END-OF-FILE ls.diff chmod 'u=rw,g=r,o=r' \l\s\.\d\i\f\f set `sum \l\s\.\d\i\f\f` sum=$1 case $sum in 63056) :;; *) echo 'Bad sum in '\l\s\.\d\i\f\f >&2 esac echo Extracting \m\a\k\e\.\d\i\f\f sed 's/^X//' > \m\a\k\e\.\d\i\f\f << '+ END-OF-FILE '\m\a\k\e\.\d\i\f\f X153c153 X< /* sysV and MONIX and LATTICE */ X--- X> /* sysV and MINIX and LATTICE */ X1899c1899 X< execl(SHELL,"sh","-c",cmd,0); X--- X> execl(SHELL, "sh", "-c", cmd, (char *) 0); + END-OF-FILE make.diff chmod 'u=rw,g=r,o=r' \m\a\k\e\.\d\i\f\f set `sum \m\a\k\e\.\d\i\f\f` sum=$1 case $sum in 25797) :;; *) echo 'Bad sum in '\m\a\k\e\.\d\i\f\f >&2 esac echo Extracting \m\k\f\s\.\d\i\f\f sed 's/^X//' > \m\k\f\s\.\d\i\f\f << '+ END-OF-FILE '\m\k\f\s\.\d\i\f\f X5c5 X< * with blocksize = zonesize. During the course of action the X--- X> * with blocksize = zonesize. During the course of time the X10,12c10,12 X< * To compile this program for MS-DOS, say cc -DDOS mkfs.c diskio.asm X< * To compile this program for UNIX, say cc -DUNIX mkfs.c X< * To compile this program for MINIX, say cc mkfs.c X--- X> * To compile this program for MS-DOS, use: cc -DDOS mkfs.c diskio.asm X> * To compile this program for UNIX, use: cc -DUNIX mkfs.c X> * To compile this program for MINIX, use: cc mkfs.c X32a33,34 X> #undef major X> #undef minor X73,75c75,77 X< nrinodes, lct=1, disk, fd, print=0, file=0, override=0, simple=0; X< X< long current_time; X--- X> nrinodes, lct=1, disk, fd, print=0, file=0, override=0, simple=0, dflag; X> X> long current_time, bin_time; X106,108c108,119 X< /* process parameters and switches */ X< X< current_time = time(0L); X--- X> X> /* Get two times, the current time and the mod time of the binary of X> * mkfs itself. When the -d flag is used, the later time is put into X> * the i_modtimes of all the files. This feature is useful when producing X> * a set of file systems, and one wants all the times to be identical. X> * First you set the time of the mkfs binary to what you want, then go. X> */ X> current_time = time(0L); /* time mkfs is being run */ X> stat(argv[0], &statbuf); X> bin_time = statbuf.st_mtime; /* time when mkfs binary was last modified */ X> X> /* process parameters and switches */ X128c139,140 X< default : X--- X> case 'd' : current_time = bin_time; dflag=1; break; X> default : X364a377 X> long timeval; X375c388,389 X< if (ct) add_zone (inode, z, (long) j, file_time(f) ); X--- X> timeval = (dflag ? current_time : file_time(f) ); X> if (ct) add_zone (inode, z, (long) j, timeval ); X448c462,463 X< int b, off, blk[INTS_PER_BLOCK], indir, i; X--- X> int b, off, indir, i; X> zone_nr blk[NR_INDIRECTS]; X472,474c487,489 X< for (i = 0; i < INTS_PER_BLOCK; i++) X< if (blk[i] == 0) { X< blk[i] = z; X--- X> for (i = 0; i < NR_INDIRECTS; i++) X> if (blk[i] == 0) { X> blk[i] = (zone_nr) z; X622c637 X< for (k = 0; k < MAX_TOKEN; k++) parse[k] = 0; X--- X> for (k = 0; k < MAX_TOKENS; k++) parse[k] = 0; + END-OF-FILE mkfs.diff chmod 'u=rw,g=r,o=r' \m\k\f\s\.\d\i\f\f set `sum \m\k\f\s\.\d\i\f\f` sum=$1 case $sum in 07826) :;; *) echo 'Bad sum in '\m\k\f\s\.\d\i\f\f >&2 esac echo Extracting \m\v\.\d\i\f\f sed 's/^X//' > \m\v\.\d\i\f\f << '+ END-OF-FILE '\m\v\.\d\i\f\f X1c1,4 X< /* mv - move files Author: Adri Koppes */ X--- X> /* mv - move files Author: Adri Koppes X> * X> * 4/25/87 - J. Paradis Bug fixes for directory handling X> */ X7c10 X< struct stat st; X--- X> struct stat st, st1; X26,37c29,32 X< if ((st.st_mode & S_IFMT) == S_IFDIR) { X< if (!stat(argv[2], &st) && (st.st_mode & S_IFMT) == S_IFDIR) { X< std_err ("mv: target "); X< std_err (argv[2]); X< std_err (" exists\n"); X< exit (1); X< } X< } X< else { X< setgid (getgid ()); X< setuid (getuid ()); X< } X--- X> X> setgid (getgid ()); X> setuid (getuid ()); X> X67a63,73 X> char name[64]; X> X> /* It's too dangerous to fool with "." or ".." ! */ X> if((strcmp(old, ".") == 0) || (strcmp(old, "..") == 0)) { X> cant(old); X> } X> X> /* Don't move a file to itself. */ X> if (stat(old, &st)==0 && stat(new, &st1)==0 && st.st_dev == st1.st_dev && X> st.st_ino == st1.st_ino) X> cant(old); X73c79 X< char name[64], *p, *rindex(); X--- X> char *p, *rindex(); X91c97 X< execl ("/bin/cp", "cp", old, new, 0); X--- X> execl ("/bin/cp", "cp", old, new, (char *) 0); X103,114c109,164 X< utime (new, &st.st_atime); X< unlink(old); X< } X< X< cant(name) X< char *name; X< { X< std_err("mv: can't move "); X< std_err (name); X< std_err ("\n"); X< exit (1); X< } X--- X> X> /* If this was a directory that we moved, then we have X> ** to update its ".." entry (in case it was moved some- X> ** where else in the tree...) X> */ X> if ((st.st_mode & S_IFMT) == S_IFDIR) { X> int i; X> char parent[64], dotdot[64]; X> X> strcpy(parent, new); X> X> /* Determine the name for the parent of X> ** the new name by counting back until we X> ** hit a '/' or the begining of the string X> */ X> X> for(i = (strlen(parent) - 1); i > 0; i--) { X> if(parent[i] == '/') break; X> } X> X> /* If there are no slashes, then the name is X> ** in the current directory, so its parent X> ** is ".". Otherwise, the parent is the name X> ** up to the last slash. X> */ X> if(i == 0) { X> strcpy(parent, "."); X> } X> else { X> /* null-terminate name at last slash */ X> parent[i] = '\0'; X> } X> X> /* Unlink the ".." entry */ X> strcpy(dotdot, new); X> strcat(dotdot, "/.."); X> unlink(dotdot); X> X> /* Now link it to its parent */ X> link(parent, dotdot); X> } X> X> utime (new, &st.st_atime); X> unlink(old); X> } X> X> cant(name) X> char *name; X> { X> std_err("mv: can't move "); X> std_err (name); X> std_err ("\n"); X> exit (1); X> } X> X> + END-OF-FILE mv.diff chmod 'u=rw,g=r,o=r' \m\v\.\d\i\f\f set `sum \m\v\.\d\i\f\f` sum=$1 case $sum in 56999) :;; *) echo 'Bad sum in '\m\v\.\d\i\f\f >&2 esac echo Extracting \o\d\.\d\i\f\f sed 's/^X//' > \o\d\.\d\i\f\f << '+ END-OF-FILE '\o\d\.\d\i\f\f X26c26 X< if (*p == '-') { X--- X> if (argc > 1 && *p == '-') { X168,169c168,169 X< bdump(words, k, c) X< int words[8]; X--- X> bdump(bytes, k, c) X> char bytes[16]; X174,186c174,176 X< int c1, c2; X< X< i = 0; X< if (linenr++ != 1) printf(" "); X< while (i < k) { X< c1 = words[i>>1] & 0377; X< c2 = (words[i>>1]>>8) & 0377; X< byte(c1, c); X< i++; X< if (i == k) {printf("\n"); return;} X< byte(c2, c); X< i++; X< } X--- X> X> if (linenr++ != 1) printf(" "); X> for (i = 0; i < k; i++) byte(bytes[i] & 0377, c); + END-OF-FILE od.diff chmod 'u=rw,g=r,o=r' \o\d\.\d\i\f\f set `sum \o\d\.\d\i\f\f` sum=$1 case $sum in 27139) :;; *) echo 'Bad sum in '\o\d\.\d\i\f\f >&2 esac echo Extracting \p\a\s\s\w\d\.\d\i\f\f sed 's/^X//' > \p\a\s\s\w\d\.\d\i\f\f << '+ END-OF-FILE '\p\a\s\s\w\d\.\d\i\f\f X50a51,54 X> if (password[0] == '\0') { X> std_err("password cannot be null\n"); X> exit(1); X> } + END-OF-FILE passwd.diff chmod 'u=rw,g=r,o=r' \p\a\s\s\w\d\.\d\i\f\f set `sum \p\a\s\s\w\d\.\d\i\f\f` sum=$1 case $sum in 08089) :;; *) echo 'Bad sum in '\p\a\s\s\w\d\.\d\i\f\f >&2 esac echo Extracting \p\r\.\d\i\f\f sed 's/^X//' > \p\r\.\d\i\f\f << '+ END-OF-FILE '\p\r\.\d\i\f\f X257,259c257,260 X< do { X< putchar(c); X< } while ((c = getc(filep)) != '\n' && c != EOF); X--- X> while (c != '\n' && c != EOF) { X> putchar(c); X> c = getc(filep); X> } + END-OF-FILE pr.diff chmod 'u=rw,g=r,o=r' \p\r\.\d\i\f\f set `sum \p\r\.\d\i\f\f` sum=$1 case $sum in 02036) :;; *) echo 'Bad sum in '\p\r\.\d\i\f\f >&2 esac echo Extracting \p\w\d\.\d\i\f\f sed 's/^X//' > \p\w\d\.\d\i\f\f << '+ END-OF-FILE '\p\w\d\.\d\i\f\f X12c12,13 X< register char name[128], *n; X--- X> register *n; X> char name[128]; + END-OF-FILE pwd.diff chmod 'u=rw,g=r,o=r' \p\w\d\.\d\i\f\f set `sum \p\w\d\.\d\i\f\f` sum=$1 case $sum in 20465) :;; *) echo 'Bad sum in '\p\w\d\.\d\i\f\f >&2 esac echo Extracting \r\m\d\i\r\.\d\i\f\f sed 's/^X//' > \r\m\d\i\r\.\d\i\f\f << '+ END-OF-FILE '\r\m\d\i\r\.\d\i\f\f X1c1,3 X< /* rmdir - remove a directory Author: Adri Koppes */ X--- X> /* rmdir - remove a directory Author: Adri Koppes X> * (modified by Paul Polderman) X> */ X29a32,33 X> extern char *rindex(); X> X37a42 X> register char *p; X49,55c54,60 X< strcpy (dots, dirname); X< while (dirname[fd]) X< if (dirname[fd++] == '/') X< sl = fd; X< dots[sl] = '\0'; X< if (access (dots, 2)) { X< stderr2(dirname, " no permission\n"); X--- X> if (p = rindex(dirname, '/')) X> p++; X> else X> p = dirname; X> X> if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) { X> stderr2(dirname, " will not remove \".\" or \"..\"\n"); X59,61c64,71 X< stat ("", &cwd); X< if ((s.st_ino == cwd.st_ino) && (s.st_dev == cwd.st_dev)) { X< std_err ("rmdir: can't remove current directory\n"); X--- X> X> strcpy (dots, dirname); X> while (dirname[fd]) X> if (dirname[fd++] == '/') X> sl = fd; X> dots[sl] = '\0'; X> if (access (dots, 2)) { X> stderr2(dirname, " no permission\n"); X65,67c75,77 X< if ((fd = open (dirname, 0)) < 0) { X< stderr2("can't read ", dirname); X< std_err("\n"); X--- X> stat ("", &cwd); X> if ((s.st_ino == cwd.st_ino) && (s.st_dev == cwd.st_dev)) { X> std_err ("rmdir: can't remove current directory\n"); X70a81,86 X> if ((fd = open (dirname, 0)) < 0) { X> stderr2("can't read ", dirname); X> std_err("\n"); X> error++; X> return; X> } X81,86c97,106 X< strcat (dots, "/."); X< unlink (dots); X< strcat (dots, "."); X< unlink (dots); X< if (unlink (dirname)) { X< stderr2("can't remove ", dirname); X--- X> strcat (dots, "/.."); X> patch_path(dots); X> for (p = dots; *p; p++) /* find end of dots */ X> ; X> unlink(dots); /* dirname/.. */ X> *(p - 1) = '\0'; X> unlink(dots); /* dirname/. */ X> *(p - 3) = '\0'; X> if (unlink(dots)) { /* dirname */ X> stderr2("can't remove ", dots); X99a120,148 X> X> patch_path(dir) X> char *dir; /* pathname ending with "/.." */ X> { X> register char *p, *s; X> struct stat pst, st; X> X> if (stat(dir, &pst) < 0) X> return; X> p = dir; X> while (*p == '/') p++; X> while (1) { X> s = p; /* remember start of new pathname part */ X> while (*p && *p != '/') X> p++; /* find next slash */ X> if (*p == '\0') X> return; /* if end of pathname, return */ X> X> /* check if this part of pathname == the original pathname */ X> *p = '\0'; X> stat(dir, &st); X> if (st.st_ino == pst.st_ino && st.st_dev == pst.st_dev X> && strcmp(s, "..") == 0) X> return; X> /* if not, try next part */ X> *p++ = '/'; X> while (*p == '/') p++; X> } X> } + END-OF-FILE rmdir.diff chmod 'u=rw,g=r,o=r' \r\m\d\i\r\.\d\i\f\f set `sum \r\m\d\i\r\.\d\i\f\f` sum=$1 case $sum in 26410) :;; *) echo 'Bad sum in '\r\m\d\i\r\.\d\i\f\f >&2 esac echo Extracting \r\o\f\f\.\d\i\f\f sed 's/^X//' > \r\o\f\f\.\d\i\f\f << '+ END-OF-FILE '\r\o\f\f\.\d\i\f\f X1c1,16 X< /* roff - text justifier Author: George Sicherman */ X--- X> /* roff - text justifier Author: George L. Sicherman */ X> X> /* X> * roff - C version. X> * the Colonel. 19 May 1983. X> * X> * Copyright 1983 by G. L. Sicherman. X> * You may use and alter this software freely for noncommercial ends X> * so long as you leave this message alone. X> * X> * Fix by Tim Maroney, 31 Dec 1984. X> * .hc implemented, 8 Feb 1985. X> * Fix to hyphenating with underlining, 12 Feb 1985. X> * Fixes to long-line hang and .bp by Dave Tutelman, 30 Mar 1985. X> * Fix to centering valve with long input lines, 4 May 1987. X> */ X14,16c29,32 X< #define UNDERL 0200 X< X< char cumbuf[BUFSIZ]; X--- X> #define UNDERL '\200' X> X> char cumbuf[BUFSIZ]; X> X48d63 X< int center = 0; X67d81 X< X120d133 X< done(0); X128,130c141,143 X< char *ttyname(); X< X< /* This routine is not needed -- X--- X> /* This routine is not needed. X> char *ttyname(); X> X138c151 X< */ X--- X> * ------- end of mesg */ X145,147c158,161 X< if (center || !o_fi) { X< if (assylen) writeline(0,1); X< else blankline(); X--- X> if (o_ce || !o_fi) { X> if (assylen) writeline(0,1); X> else blankline(); X> if (o_ce) o_ce--; X213,214d226 X< center=o_ce; X< if (o_ce) o_ce--; X227a240,243 X> * Tutelman's fix #1, modified by the Colonel. X> */ X> if (!o_fi || o_ce) goto giveup; X> /* X242c258 X< if (*hc!=o_hc) continue; X--- X> if ((*hc&~UNDERL)!=o_hc) continue; X293c309 X< for (t=s; *s; s++) if (*s != o_hc) *t++ = *s; X--- X> for (t=s; *s; s++) if ((*s&~UNDERL) != o_hc) *t++ = *s; X307c323 X< while (*s) n += (o_hc != *s++); X--- X> while (*s) n += (o_hc != (~UNDERL & *s++)); X372,373c388,392 X< if (s>0) o_bp=page_no-r; X< else if (s<0) o_bp=page_no+r; X--- X> /* X> * Tutelman's fix #2 - the signs were reversed! X> */ X> if (s>0) o_bp=page_no+r; X> else if (s<0) o_bp=page_no-r; X388,389c407,412 X< nread(&o_ce); X< writebreak(); X--- X> /* X> * Fix to centering. Set counter _after_ breaking! --G.L.S. X> */ X> nread(&r); X> writebreak(); X> o_ce = r; X735c758 X< if (c==EOF || c=='\n') break;; X--- X> if (c==EOF || c=='\n') break; X836c859 X< if (center) for (j=0; j<(o_ll-assylen+1)/2; j++) spit(' '); X--- X> if (o_ce) for (j=0; j<(o_ll-assylen+1)/2; j++) spit(' '); X1085c1108,1111 X< c = *t; X--- X> /* X> * fix - last char translates to space. X> */ X> c = *t? *t: ' '; X1123,1125c1149 X< * strhas - does string have character? X< * USG and BSD both have this in their libraries. Now, if X< * they could just agree on the name of the function ... X--- X> * strhas - does string have character? Allow UNDERL flag. X1132c1156 X< for (; *p; p++) if (*p==c) return p; X--- X> for (; *p; p++) if ((*p&~UNDERL)==c) return p; + END-OF-FILE roff.diff chmod 'u=rw,g=r,o=r' \r\o\f\f\.\d\i\f\f set `sum \r\o\f\f\.\d\i\f\f` sum=$1 case $sum in 00785) :;; *) echo 'Bad sum in '\r\o\f\f\.\d\i\f\f >&2 esac echo Extracting \s\p\l\i\t\.\d\i\f\f sed 's/^X//' > \s\p\l\i\t\.\d\i\f\f << '+ END-OF-FILE '\s\p\l\i\t\.\d\i\f\f X66c66 X< if (write(fd, base, index-base) != index-base) X--- X> if (write(fd,base,(int)(index-base)) != (int)(index-base)) X73c73 X< if (write(fd, base, index - base) != index - base) quit(); X--- X> if (write(fd, base, (int) (index-base)) != (int) (index-base)) quit(); + END-OF-FILE split.diff chmod 'u=rw,g=r,o=r' \s\p\l\i\t\.\d\i\f\f set `sum \s\p\l\i\t\.\d\i\f\f` sum=$1 case $sum in 15949) :;; *) echo 'Bad sum in '\s\p\l\i\t\.\d\i\f\f >&2 esac echo Extracting \t\a\r\.\d\i\f\f sed 's/^X//' > \t\a\r\.\d\i\f\f << '+ END-OF-FILE '\t\a\r\.\d\i\f\f X60a61,62 X> char path[NAME_SIZE]; X> char pathname[NAME_SIZE]; X111,112c113,116 X< for (i = 3; i < argc; i++) X< add_file(argv[i]); X--- X> for (i = 3; i < argc; i++) { X> add_file(argv[i]); X> path[0] = '\0'; X> } X248c252 X< execl(MKDIR, "mkdir", dir_name, 0); X--- X> execl(MKDIR, "mkdir", dir_name, (char *) 0); X281,283c285 X< char path[NAME_SIZE]; X< X< char pathname[NAME_SIZE]; X--- X> + END-OF-FILE tar.diff chmod 'u=rw,g=r,o=r' \t\a\r\.\d\i\f\f set `sum \t\a\r\.\d\i\f\f` sum=$1 case $sum in 59243) :;; *) echo 'Bad sum in '\t\a\r\.\d\i\f\f >&2 esac echo Extracting \w\c\.\d\i\f\f sed 's/^X//' > \w\c\.\d\i\f\f << '+ END-OF-FILE '\w\c\.\d\i\f\f X55c55 X< if (*cp++ == '-') { X--- X> if (argc >1 && *cp++ == '-') { + END-OF-FILE wc.diff chmod 'u=rw,g=r,o=r' \w\c\.\d\i\f\f set `sum \w\c\.\d\i\f\f` sum=$1 case $sum in 34156) :;; *) echo 'Bad sum in '\w\c\.\d\i\f\f >&2 esac echo Extracting \d\i\f\f\.\c sed 's/^X//' > \d\i\f\f\.\c << '+ END-OF-FILE '\d\i\f\f\.\c X/* diff - print differences between 2 files Author: Erik Baalbergen */ X X/* Poor man's implementation of diff(1) X - no options available X - may give more output than other diffs, due to the straight-forward algorithm X - runs out of memory if the differing chunks become too large X - input line length should not exceed LINELEN; longer lines are truncated, X while only the first LINELEN characters are compared X X Please report bugs and suggestions to erikb@cs.vu.nl X*/ X#include "stdio.h" XFILE *fopen(); X X#define LINELEN 128 X Xchar *prog; Xint diffs = 0; X Xmain(argc, argv) X char **argv; X{ X FILE *fp1 = NULL, *fp2 = NULL; X X prog = *argv++; X if (argc != 3) X fatal("use: %s file1 file2", prog); X if (strcmp(argv[0], "-") == 0) X fp1 = stdin; X else X if (strcmp(argv[1], "-") == 0) X fp2 = stdin; X if (fp1 == NULL && (fp1 = fopen(argv[0], "r")) == NULL) X fatal("can't read %s", argv[0]); X if (fp2 == NULL && (fp2 = fopen(argv[1], "r")) == NULL) X fatal("can't read %s", argv[1]); X diff(fp1, fp2); X exit(diffs > 0); X} X Xfatal(fmt, s) X char *fmt, *s; X{ X fprintf(stderr, "%s: ", prog); X fprintf(stderr, fmt, s); X fprintf(stderr, "\n"); X exit(2); X} X X/* the line module */ Xchar *malloc(); Xchar *fgets(); X Xstruct line { X struct line *l_next; X char l_text[LINELEN + 2]; X}; X Xstruct line *freelist = 0; X Xstruct line * Xnew_line() X{ X register struct line *l; X X if (l = freelist) X freelist = freelist->l_next; X else X if ((l = (struct line *)malloc(sizeof(struct line))) == 0) X fatal("out of memory"); X return l; X} X Xfree_line(l) X register struct line *l; X{ X l->l_next = freelist; X freelist = l; X} X X#define equal_line(l1, l2) (strcmp((l1)->l_text, (l2)->l_text) == 0) X Xint equal_3(l1, l2) X struct line *l1, *l2; X{ X register int i; X X for (i=0; i<3 && l1 && l2; ++i, l1=l1->l_next, l2=l2->l_next) { X if (!equal_line(l1, l2)) X return 0; X } X return (i==3); X} X Xstruct line * Xread_line(fp) X FILE *fp; X{ X register struct line *l = new_line(); X register char *p; X register int c; X X (p = &(l->l_text[LINELEN]))[1] = '\377'; X if (fgets(l->l_text, LINELEN + 2, fp) == NULL) { X free_line(l); X return 0; X } X if (p[1] != '\377' && *p != '\n') { X while ((c = fgetc(fp)) != '\n' && c != EOF) {} X *p++ = '\n'; X *p = '\0'; X } X l->l_next = 0; X return l; X} X X/* file window handler */ Xstruct f { X struct line *f_bwin, *f_ewin; X struct line *f_aside; X int f_linecnt; /* line number in file of last advanced line */ X FILE *f_fp; X}; X Xadvance(f) X register struct f *f; X{ X register struct line *l; X X if (l = f->f_bwin) { X if (f->f_ewin == l) X f->f_bwin = f->f_ewin = 0; X else X f->f_bwin = l->l_next; X free_line(l); X (f->f_linecnt)++; X } X} X Xaside(f, l) X struct f *f; X struct line *l; X{ X register struct line *ll; X X if (ll = l->l_next) { X while (ll->l_next) X ll = ll->l_next; X ll->l_next = f->f_aside; X f->f_aside = l->l_next; X l->l_next = 0; X f->f_ewin = l; X } X} X Xstruct line * Xnext(f) X register struct f *f; X{ X register struct line *l; X X if (l = f->f_aside) { X f->f_aside = l->l_next; X l->l_next = 0; X } X else X l = read_line(f->f_fp); X if (l) { X if (f->f_bwin == 0) X f->f_bwin = f->f_ewin = l; X else { X f->f_ewin->l_next = l; X f->f_ewin = l; X } X } X return l; X} X Xinit_f(f, fp) X register struct f *f; X FILE *fp; X{ X f->f_bwin = f->f_ewin = f->f_aside = 0; X f->f_linecnt = 0; X f->f_fp = fp; X} X Xupdate(f, s) X register struct f *f; X char *s; X{ X while (f->f_bwin && f->f_bwin != f->f_ewin) { X printf("%s%s", s, f->f_bwin->l_text); X advance(f); X } X} X X/* diff procedure */ Xdiff(fp1, fp2) X FILE *fp1, *fp2; X{ X struct f f1, f2; X struct line *l1, *s1, *b1, *l2, *s2, *b2; X register struct line *ll; X X init_f(&f1, fp1); X init_f(&f2, fp2); X l1 = next(&f1); X l2 = next(&f2); X while (l1 && l2) { X if (equal_line(l1, l2)) { Xequal: X advance(&f1); X advance(&f2); X l1 = next(&f1); X l2 = next(&f2); X continue; X } X s1 = b1 = l1; X s2 = b2 = l2; X /* read several more lines */ X next(&f1); next(&f1); X next(&f2); next(&f2); X /* start searching */ Xsearch: X if ((l2 = next(&f2)) == 0) X continue; X ll = s1; X b2 = b2->l_next; X do { X if (equal_3(ll, b2)) { X aside(&f1, ll); X aside(&f2, b2); X differ(&f1, &f2); X goto equal; X } X } while (ll = ll->l_next); X if ((l1 = next(&f1)) == 0) X continue; X ll = s2; X b1 = b1->l_next; X do { X if (equal_3(ll, b1)) { X aside(&f2, ll); X aside(&f1, b1); X differ(&f1, &f2); X goto equal; X } X } while (ll = ll->l_next); X goto search; X } X /* one of the files reached EOF */ X if (l1) /* eof on 2 */ X while (next(&f1)) {} X if (l2) X while (next(&f2)) {} X f1.f_ewin = 0; X f2.f_ewin = 0; X differ(&f1, &f2); X} X Xdiffer(f1, f2) X register struct f *f1, *f2; X{ X int cnt1 = f1->f_linecnt, len1 = wlen(f1), cnt2 = f2->f_linecnt, X len2 = wlen(f2); X X if ((len1 = wlen(f1)) || (len2 = wlen(f2))) { X if (len1 == 0) { X printf("%da", cnt1); X range(cnt2 + 1, cnt2 + len2); X } X else X if (len2 == 0) { X range(cnt1 + 1, cnt1 + len1); X printf("d%d", cnt2); X } X else { X range(cnt1 + 1, cnt1 + len1); X putchar('c'); X range(cnt2 + 1, cnt2 + len2); X } X putchar('\n'); X if (len1) X update(f1, "< "); X if (len1 && len2) X printf("---\n"); X if (len2) X update(f2, "> "); X diffs++; X } X} X Xwlen(f) X struct f *f; X{ X register cnt = 0; X register struct line *l = f->f_bwin, *e = f->f_ewin; X X while (l && l != e) { X cnt++; X l = l->l_next; X } X return cnt; X} X Xrange(a, b) X{ X printf(((a == b) ? "%d" : "%d,%d"), a, b); X} + END-OF-FILE diff.c chmod 'u=rw,g=r,o=r' \d\i\f\f\.\c set `sum \d\i\f\f\.\c` sum=$1 case $sum in 50498) :;; *) echo 'Bad sum in '\d\i\f\f\.\c >&2 esac echo Extracting \f\i\x\.\c sed 's/^X//' > \f\i\x\.\c << '+ END-OF-FILE '\f\i\x\.\c X/* fix - combine file and diff listing Author: Erik Baalbergen */ X X/* Notes: X * files old and old.fix are equal after the following commands X diff old new > difflist X fix old difflist > old.fix X * the diff output is assumed to be produced by my diff program. X * the difflist has the following form: X difflist ::= chunk* X chunk ::= append | delete | change ; X append ::= n1 'a' n2 [',' n3]? '\n' ['> ' line '\n'](n3 - n2 + 1) X delete ::= n1 [',' n2]? 'd' n3 '\n' ['< ' line '\n'](n2 - n1 + 1) X change ::= n1 [',' n2]? 'c' n3 [',' n4]? '\n' X ['< ' line '\n'](n2 - n1 + 1) X '---\n' X ['> ' line '\n'](n4 - n3 + 1) X where X - n[1234] is an unsigned integer X - "[pat](expr)" means "(expr) occurences of pat" X - "[pat]?" means "either pat or nothing" X * the information in the diff listing is checked against the file to which X it is applied; an error is printed if there is a conflict X*/ X X#include <stdio.h> X Xextern char *fgets(); Xextern FILE *fopen(); X#define LINELEN 1024 X Xchar *prog = 0; X Xchar * Xgetline(fp, b) X FILE *fp; X char *b; X{ X if (fgets(b, LINELEN, fp) == NULL) X fatal("unexpected eof"); X return b; X} X X#define copy(str) printf("%s", str) X Xmain(argc, argv) X char **argv; X{ X char cmd, *fl, *fd, obuf[LINELEN], nbuf[LINELEN]; X int o1, o2, n1, n2, here; X FILE *fpf, *fpd; X X prog = argv[0]; X if (argc != 3) X fatal("use: %s original-file diff-list-file", prog); X if ((fpf = fopen(argv[1], "r")) == NULL) X fatal("can't read %s", argv[1]); X if ((fpd = fopen(argv[2], "r")) == NULL) X fatal("can't read %s", argv[2]); X here = 0; X while (getcommand(fpd, &o1, &o2, &cmd, &n1, &n2)) { X while (here < o1 - 1) { X here++; X copy(getline(fpf, obuf)); X } X switch (cmd) { X case 'c': X case 'd': X if (cmd == 'd' && n1 != n2) X fatal("delete count conflict"); X while (o1 <= o2) { X fl = getline(fpf, obuf); X here++; X fd = getline(fpd, nbuf); X if (strncmp(fd, "< ", 2)) X fatal("illegal delete line"); X if (strcmp(fl, fd + 2)) X fatal("delete line conflict"); X o1++; X } X if (cmd == 'd') X break; X if (strcmp(getline(fpd, nbuf), "---\n")) X fatal("illegal separator in chunk"); X /*FALLTHROUGH*/ X case 'a': X if (cmd == 'a') { X if (o1 != o2) X fatal("append count conflict"); X copy(getline(fpf, obuf)); X here++; X } X while (n1 <= n2) { X if (strncmp(getline(fpd, nbuf), "> ", 2)) X fatal("illegal append line"); X copy(nbuf + 2); X n1++; X } X break; X } X } X while (fgets(obuf, LINELEN, fpf) != NULL) X copy(obuf); X exit(0); X} X Xisdigit(c) X char c; X{ X return c >= '0' && c <= '9'; X} X Xchar * Xrange(s, p1, p2) X char *s; X int *p1, *p2; X{ X register int v1 = 0, v2; X X while (isdigit(*s)) X v1 = 10 * v1 + *s++ - '0'; X v2 = v1; X if (*s == ',') { X s++; X v2 = 0; X while (isdigit(*s)) X v2 = 10 * v2 + *s++ - '0'; X } X if (v1 == 0 || v2 == 0 || v1 > v2) X fatal("illegal range"); X *p1 = v1; X *p2 = v2; X return s; X} X Xgetcommand(fp, o1, o2, pcmd, n1, n2) X FILE *fp; X int *o1, *o2, *n1, *n2; X char *pcmd; X{ X char buf[LINELEN]; X register char *s; X char cmd; X X if ((s = fgets(buf, LINELEN, fp)) == NULL) X return 0; X s = range(s, o1, o2); X if ((cmd = *s++) != 'a' && cmd != 'c' && cmd != 'd') X fatal("illegal command"); X s = range(s, n1, n2); X if (*s != '\n' && s[1] != '\0') X fatal("extra characters at end of command: %s", s); X *pcmd = cmd; X return 1; X} X Xfatal(s, a) X char *s, *a; X{ X fprintf(stderr, "%s: fatal: ", prog); X fprintf(stderr, s, a); X fprintf(stderr, "\n"); X exit(1); X} X X X X + END-OF-FILE fix.c chmod 'u=rw,g=r,o=r' \f\i\x\.\c set `sum \f\i\x\.\c` sum=$1 case $sum in 06970) :;; *) echo 'Bad sum in '\f\i\x\.\c >&2 esac ec =exp