summaryrefslogtreecommitdiff
path: root/usr.bin/diff/diff.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2003-06-25 01:20:53 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2003-06-25 01:20:53 +0000
commite05edc6c22b8df9867ca93031a94a18910e2bfbf (patch)
tree2f05c40bd06943ff93f46c8156c842e9e45f4962 /usr.bin/diff/diff.c
parent87fbad9497b86c2a8876f24bbdddaa18deec5376 (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.c212
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();
+}