added -n flag from rcs diff
[unix-history] / usr / src / usr.bin / diff / diff / diff.c
CommitLineData
a3e88724 1static char sccsid[] = "@(#)diff.c 4.5 %G%";
ac1f8a08
BJ
2
3#include "diff.h"
4/*
5 * diff - driver and subroutines
6 */
7
8char diff[] = DIFF;
9char diffh[] = DIFFH;
10char pr[] = PR;
ac1f8a08
BJ
11
12main(argc, argv)
13 int argc;
14 char **argv;
15{
16 register char *argp;
17
18 ifdef1 = "FILE1"; ifdef2 = "FILE2";
19 status = 2;
20 diffargv = argv;
ac1f8a08
BJ
21 argc--, argv++;
22 while (argc > 2 && argv[0][0] == '-') {
23 argp = &argv[0][1];
24 argv++, argc--;
25 while (*argp) switch(*argp++) {
26
27#ifdef notdef
28 case 'I':
29 opt = D_IFDEF;
30 wantelses = 0;
31 continue;
32 case 'E':
33 opt = D_IFDEF;
34 wantelses = 1;
35 continue;
36 case '1':
37 opt = D_IFDEF;
38 ifdef1 = argp;
39 *--argp = 0;
40 continue;
41#endif
42 case 'D':
43 /* -Dfoo = -E -1 -2foo */
44 wantelses = 1;
45 ifdef1 = "";
46 /* fall through */
47#ifdef notdef
48 case '2':
49#endif
50 opt = D_IFDEF;
51 ifdef2 = argp;
52 *--argp = 0;
53 continue;
54 case 'e':
55 opt = D_EDIT;
56 continue;
57 case 'f':
58 opt = D_REVERSE;
59 continue;
a3e88724
VJ
60 case 'n':
61 opt = D_NREVERSE;
62 continue;
ac1f8a08
BJ
63 case 'b':
64 bflag = 1;
65 continue;
c470b1f1
VJ
66 case 'w':
67 wflag = 1;
68 continue;
69 case 'i':
70 iflag = 1;
71 continue;
72 case 't':
73 tflag = 1;
74 continue;
ac1f8a08
BJ
75 case 'c':
76 opt = D_CONTEXT;
77 if (isdigit(*argp)) {
78 context = atoi(argp);
79 while (isdigit(*argp))
80 argp++;
81 if (*argp) {
82 fprintf(stderr,
83 "diff: -c: bad count\n");
84 done();
85 }
86 argp = "";
87 } else
88 context = 3;
89 continue;
90 case 'h':
91 hflag++;
92 continue;
93 case 'S':
94 if (*argp == 0) {
95 fprintf(stderr, "diff: use -Sstart\n");
96 done();
97 }
98 start = argp;
99 *--argp = 0; /* don't pass it on */
100 continue;
101 case 'r':
102 rflag++;
103 continue;
104 case 's':
105 sflag++;
106 continue;
107 case 'l':
108 lflag++;
109 continue;
110 default:
111 fprintf(stderr, "diff: -%s: unknown option\n",
112 --argp);
113 done();
114 }
115 }
116 if (argc != 2) {
117 fprintf(stderr, "diff: two filename arguments required\n");
118 done();
119 }
120 file1 = argv[0];
121 file2 = argv[1];
122 if (hflag && opt) {
123 fprintf(stderr,
a3e88724 124 "diff: -h doesn't support -e, -f, -n, -c, or -I\n");
ac1f8a08
BJ
125 done();
126 }
127 if (!strcmp(file1, "-"))
128 stb1.st_mode = S_IFREG;
129 else if (stat(file1, &stb1) < 0) {
130 fprintf(stderr, "diff: ");
131 perror(file1);
132 done();
133 }
134 if (!strcmp(file2, "-"))
135 stb2.st_mode = S_IFREG;
136 else if (stat(file2, &stb2) < 0) {
137 fprintf(stderr, "diff: ");
138 perror(file2);
139 done();
140 }
141 if ((stb1.st_mode & S_IFMT) == S_IFDIR &&
142 (stb2.st_mode & S_IFMT) == S_IFDIR) {
143 diffdir(argv);
144 } else
145 diffreg();
146 done();
147}
148
149char *
150savestr(cp)
151 register char *cp;
152{
153 register char *dp = malloc(strlen(cp)+1);
154
155 if (dp == 0) {
156 fprintf(stderr, "diff: ran out of memory\n");
157 done();
158 }
159 strcpy(dp, cp);
160 return (dp);
161}
162
163min(a,b)
164 int a,b;
165{
166
167 return (a < b ? a : b);
168}
169
170max(a,b)
171 int a,b;
172{
173
174 return (a > b ? a : b);
175}
176
177done()
178{
179 unlink(tempfile);
180 exit(status);
181}
182
183char *
184talloc(n)
185{
186 register char *p;
cb47fa51
JL
187
188 if ((p = malloc((unsigned)n)) != NULL)
ac1f8a08
BJ
189 return(p);
190 noroom();
191}
192
193char *
cb47fa51 194ralloc(p,n)
ac1f8a08
BJ
195char *p;
196{
197 register char *q;
198 char *realloc();
cb47fa51
JL
199
200 if ((q = realloc(p, (unsigned)n)) == NULL)
ac1f8a08
BJ
201 noroom();
202 return(q);
203}
204
205noroom()
206{
207 fprintf(stderr, "diff: files too big, try -h\n");
208 done();
209}