diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2003-06-25 01:20:53 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2003-06-25 01:20:53 +0000 |
commit | e05edc6c22b8df9867ca93031a94a18910e2bfbf (patch) | |
tree | 2f05c40bd06943ff93f46c8156c842e9e45f4962 /usr.bin/diff/diff.c | |
parent | 87fbad9497b86c2a8876f24bbdddaa18deec5376 (diff) |
4.3reno diff. This is free because of the Caldera license. Nasty, but a
place to start.
Diffstat (limited to 'usr.bin/diff/diff.c')
-rw-r--r-- | usr.bin/diff/diff.c | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/usr.bin/diff/diff.c b/usr.bin/diff/diff.c new file mode 100644 index 00000000000..ddab61fac1f --- /dev/null +++ b/usr.bin/diff/diff.c @@ -0,0 +1,212 @@ +static char sccsid[] = "@(#)diff.c 4.7 5/11/89"; + +#include "diff.h" +#include "pathnames.h" + +/* + * diff - driver and subroutines + */ + +char diff[] = _PATH_DIFF; +char diffh[] = _PATH_DIFFH; +char pr[] = _PATH_PR; + +main(argc, argv) + int argc; + char **argv; +{ + register char *argp; + + ifdef1 = "FILE1"; ifdef2 = "FILE2"; + status = 2; + diffargv = argv; + argc--, argv++; + while (argc > 2 && argv[0][0] == '-') { + argp = &argv[0][1]; + argv++, argc--; + while (*argp) switch(*argp++) { + +#ifdef notdef + case 'I': + opt = D_IFDEF; + wantelses = 0; + continue; + case 'E': + opt = D_IFDEF; + wantelses = 1; + continue; + case '1': + opt = D_IFDEF; + ifdef1 = argp; + *--argp = 0; + continue; +#endif + case 'D': + /* -Dfoo = -E -1 -2foo */ + wantelses = 1; + ifdef1 = ""; + /* fall through */ +#ifdef notdef + case '2': +#endif + opt = D_IFDEF; + ifdef2 = argp; + *--argp = 0; + continue; + case 'e': + opt = D_EDIT; + continue; + case 'f': + opt = D_REVERSE; + continue; + case 'n': + opt = D_NREVERSE; + continue; + case 'b': + bflag = 1; + continue; + case 'w': + wflag = 1; + continue; + case 'i': + iflag = 1; + continue; + case 't': + tflag = 1; + continue; + case 'c': + opt = D_CONTEXT; + if (isdigit(*argp)) { + context = atoi(argp); + while (isdigit(*argp)) + argp++; + if (*argp) { + fprintf(stderr, + "diff: -c: bad count\n"); + done(); + } + argp = ""; + } else + context = 3; + continue; + case 'h': + hflag++; + continue; + case 'S': + if (*argp == 0) { + fprintf(stderr, "diff: use -Sstart\n"); + done(); + } + start = argp; + *--argp = 0; /* don't pass it on */ + continue; + case 'r': + rflag++; + continue; + case 's': + sflag++; + continue; + case 'l': + lflag++; + continue; + default: + fprintf(stderr, "diff: -%s: unknown option\n", + --argp); + done(); + } + } + if (argc != 2) { + fprintf(stderr, "diff: two filename arguments required\n"); + done(); + } + file1 = argv[0]; + file2 = argv[1]; + if (hflag && opt) { + fprintf(stderr, + "diff: -h doesn't support -e, -f, -n, -c, or -I\n"); + done(); + } + if (!strcmp(file1, "-")) + stb1.st_mode = S_IFREG; + else if (stat(file1, &stb1) < 0) { + fprintf(stderr, "diff: "); + perror(file1); + done(); + } + if (!strcmp(file2, "-")) + stb2.st_mode = S_IFREG; + else if (stat(file2, &stb2) < 0) { + fprintf(stderr, "diff: "); + perror(file2); + done(); + } + if ((stb1.st_mode & S_IFMT) == S_IFDIR && + (stb2.st_mode & S_IFMT) == S_IFDIR) { + diffdir(argv); + } else + diffreg(); + done(); +} + +char * +savestr(cp) + register char *cp; +{ + register char *dp = malloc(strlen(cp)+1); + + if (dp == 0) { + fprintf(stderr, "diff: ran out of memory\n"); + done(); + } + strcpy(dp, cp); + return (dp); +} + +min(a,b) + int a,b; +{ + + return (a < b ? a : b); +} + +max(a,b) + int a,b; +{ + + return (a > b ? a : b); +} + +done() +{ + if (tempfile) + unlink(tempfile); + exit(status); +} + +char * +talloc(n) +{ + register char *p; + + if ((p = malloc((unsigned)n)) != NULL) + return(p); + noroom(); +} + +char * +ralloc(p,n) +char *p; +{ + register char *q; + char *realloc(); + + if ((q = realloc(p, (unsigned)n)) == NULL) + noroom(); + return(q); +} + +noroom() +{ + fprintf(stderr, "diff: files too big, try -h\n"); + done(); +} |