diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2007-01-07 15:56:09 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2007-01-07 15:56:09 +0000 |
commit | 7ae93f0fe7783518e59e425e6fbc44271520a2a2 (patch) | |
tree | 69bd16b7f5818b1dfb725ac9e50361a09113264c | |
parent | 5568b722d46157867959685ee2b35649c6ab16df (diff) | |
download | busybox-w32-7ae93f0fe7783518e59e425e6fbc44271520a2a2.tar.gz busybox-w32-7ae93f0fe7783518e59e425e6fbc44271520a2a2.tar.bz2 busybox-w32-7ae93f0fe7783518e59e425e6fbc44271520a2a2.zip |
- FIXME: someone broke diff -r
- minor shrinkage i had lying around
text data bss dec hex filename
7002 8 88 7098 1bba diff.o.orig
6936 8 81 7025 1b71 diff.o
-rw-r--r-- | coreutils/diff.c | 96 |
1 files changed, 48 insertions, 48 deletions
diff --git a/coreutils/diff.c b/coreutils/diff.c index 872b78830..f9865e971 100644 --- a/coreutils/diff.c +++ b/coreutils/diff.c | |||
@@ -67,6 +67,7 @@ | |||
67 | 67 | ||
68 | /* XXX: FIXME: the following variables should be static, but gcc currently | 68 | /* XXX: FIXME: the following variables should be static, but gcc currently |
69 | * creates a much bigger object if we do this. [which version of gcc? --vda] */ | 69 | * creates a much bigger object if we do this. [which version of gcc? --vda] */ |
70 | /* 4.x, IIRC also 3.x --bernhard */ | ||
70 | /* This is the default number of lines of context. */ | 71 | /* This is the default number of lines of context. */ |
71 | int context = 3; | 72 | int context = 3; |
72 | int status; | 73 | int status; |
@@ -75,7 +76,7 @@ const char *label1; | |||
75 | const char *label2; | 76 | const char *label2; |
76 | struct stat stb1, stb2; | 77 | struct stat stb1, stb2; |
77 | char **dl; | 78 | char **dl; |
78 | USE_FEATURE_DIFF_DIR(static int dl_count;) | 79 | USE_FEATURE_DIFF_DIR(int dl_count;) |
79 | 80 | ||
80 | struct cand { | 81 | struct cand { |
81 | int x; | 82 | int x; |
@@ -108,7 +109,7 @@ static int clen; | |||
108 | static int len[2]; | 109 | static int len[2]; |
109 | static int pref, suff; /* length of prefix and suffix */ | 110 | static int pref, suff; /* length of prefix and suffix */ |
110 | static int slen[2]; | 111 | static int slen[2]; |
111 | static int anychange; | 112 | static smallint anychange; |
112 | static long *ixnew; /* will be overlaid on file[1] */ | 113 | static long *ixnew; /* will be overlaid on file[1] */ |
113 | static long *ixold; /* will be overlaid on klist */ | 114 | static long *ixold; /* will be overlaid on klist */ |
114 | static struct cand *clist; /* merely a free storage pot for candidates */ | 115 | static struct cand *clist; /* merely a free storage pot for candidates */ |
@@ -129,9 +130,9 @@ static void print_only(const char *path, size_t dirlen, const char *entry) | |||
129 | 130 | ||
130 | static void print_status(int val, char *path1, char *path2, char *entry) | 131 | static void print_status(int val, char *path1, char *path2, char *entry) |
131 | { | 132 | { |
132 | const char *const _entry = entry ? entry : ""; | 133 | const char * const _entry = entry ? entry : ""; |
133 | char *_path1 = entry ? concat_path_file(path1, _entry) : path1; | 134 | char * const _path1 = entry ? concat_path_file(path1, _entry) : path1; |
134 | char *_path2 = entry ? concat_path_file(path2, _entry) : path2; | 135 | char * const _path2 = entry ? concat_path_file(path2, _entry) : path2; |
135 | 136 | ||
136 | switch (val) { | 137 | switch (val) { |
137 | case D_ONLY: | 138 | case D_ONLY: |
@@ -173,8 +174,10 @@ static void print_status(int val, char *path1, char *path2, char *entry) | |||
173 | free(_path2); | 174 | free(_path2); |
174 | } | 175 | } |
175 | } | 176 | } |
176 | 177 | static void fiddle_sum(int *sum, int t) | |
177 | 178 | { | |
179 | *sum = (int)(*sum * 127 + t); | ||
180 | } | ||
178 | /* | 181 | /* |
179 | * Hash function taken from Robert Sedgewick, Algorithms in C, 3d ed., p 578. | 182 | * Hash function taken from Robert Sedgewick, Algorithms in C, 3d ed., p 578. |
180 | */ | 183 | */ |
@@ -186,23 +189,14 @@ static int readhash(FILE * f) | |||
186 | sum = 1; | 189 | sum = 1; |
187 | space = 0; | 190 | space = 0; |
188 | if (!(option_mask32 & FLAG_b) && !(option_mask32 & FLAG_w)) { | 191 | if (!(option_mask32 & FLAG_b) && !(option_mask32 & FLAG_w)) { |
189 | if (FLAG_i) | 192 | for (i = 0; (t = getc(f)) != '\n'; i++) { |
190 | for (i = 0; (t = getc(f)) != '\n'; i++) { | 193 | if (t == EOF) { |
191 | if (t == EOF) { | 194 | if (i == 0) |
192 | if (i == 0) | 195 | return 0; |
193 | return 0; | 196 | break; |
194 | break; | ||
195 | } | ||
196 | sum = sum * 127 + t; | ||
197 | } else | ||
198 | for (i = 0; (t = getc(f)) != '\n'; i++) { | ||
199 | if (t == EOF) { | ||
200 | if (i == 0) | ||
201 | return 0; | ||
202 | break; | ||
203 | } | ||
204 | sum = sum * 127 + t; | ||
205 | } | 197 | } |
198 | fiddle_sum(&sum, t); | ||
199 | } | ||
206 | } else { | 200 | } else { |
207 | for (i = 0;;) { | 201 | for (i = 0;;) { |
208 | switch (t = getc(f)) { | 202 | switch (t = getc(f)) { |
@@ -218,7 +212,7 @@ static int readhash(FILE * f) | |||
218 | i++; | 212 | i++; |
219 | space = 0; | 213 | space = 0; |
220 | } | 214 | } |
221 | sum = sum * 127 + t; | 215 | fiddle_sum(&sum, t); |
222 | i++; | 216 | i++; |
223 | continue; | 217 | continue; |
224 | case EOF: | 218 | case EOF: |
@@ -298,10 +292,12 @@ static void prune(void) | |||
298 | int i, j; | 292 | int i, j; |
299 | 293 | ||
300 | for (pref = 0; pref < len[0] && pref < len[1] && | 294 | for (pref = 0; pref < len[0] && pref < len[1] && |
301 | file[0][pref + 1].value == file[1][pref + 1].value; pref++); | 295 | file[0][pref + 1].value == file[1][pref + 1].value; pref++) |
296 | ; | ||
302 | for (suff = 0; suff < len[0] - pref && suff < len[1] - pref && | 297 | for (suff = 0; suff < len[0] - pref && suff < len[1] - pref && |
303 | file[0][len[0] - suff].value == file[1][len[1] - suff].value; | 298 | file[0][len[0] - suff].value == file[1][len[1] - suff].value; |
304 | suff++); | 299 | suff++) |
300 | ; | ||
305 | for (j = 0; j < 2; j++) { | 301 | for (j = 0; j < 2; j++) { |
306 | sfile[j] = file[j] + pref; | 302 | sfile[j] = file[j] + pref; |
307 | slen[j] = len[j] - pref - suff; | 303 | slen[j] = len[j] - pref - suff; |
@@ -621,12 +617,12 @@ static void uni_range(int a, int b) | |||
621 | } | 617 | } |
622 | 618 | ||
623 | 619 | ||
624 | static int fetch(long *f, int a, int b, FILE * lb, int ch) | 620 | static void fetch(long *f, int a, int b, FILE * lb, int ch) |
625 | { | 621 | { |
626 | int i, j, c, lastc, col, nc; | 622 | int i, j, c, lastc, col, nc; |
627 | 623 | ||
628 | if (a > b) | 624 | if (a > b) |
629 | return 0; | 625 | return; |
630 | for (i = a; i <= b; i++) { | 626 | for (i = a; i <= b; i++) { |
631 | fseek(lb, f[i - 1], SEEK_SET); | 627 | fseek(lb, f[i - 1], SEEK_SET); |
632 | nc = f[i] - f[i - 1]; | 628 | nc = f[i] - f[i - 1]; |
@@ -638,8 +634,8 @@ static int fetch(long *f, int a, int b, FILE * lb, int ch) | |||
638 | col = 0; | 634 | col = 0; |
639 | for (j = 0, lastc = '\0'; j < nc; j++, lastc = c) { | 635 | for (j = 0, lastc = '\0'; j < nc; j++, lastc = c) { |
640 | if ((c = getc(lb)) == EOF) { | 636 | if ((c = getc(lb)) == EOF) { |
641 | puts("\n\\ No newline at end of file"); | 637 | printf("\n\\ No newline at end of file\n"); |
642 | return 0; | 638 | return; |
643 | } | 639 | } |
644 | if (c == '\t' && (option_mask32 & FLAG_t)) { | 640 | if (c == '\t' && (option_mask32 & FLAG_t)) { |
645 | do { | 641 | do { |
@@ -651,7 +647,7 @@ static int fetch(long *f, int a, int b, FILE * lb, int ch) | |||
651 | } | 647 | } |
652 | } | 648 | } |
653 | } | 649 | } |
654 | return 0; | 650 | return; |
655 | } | 651 | } |
656 | 652 | ||
657 | 653 | ||
@@ -695,12 +691,11 @@ static void dump_unified_vec(FILE * f1, FILE * f2) | |||
695 | lowc = MAX(1, cvp->c - context); | 691 | lowc = MAX(1, cvp->c - context); |
696 | upd = MIN(len[1], context_vec_ptr->d + context); | 692 | upd = MIN(len[1], context_vec_ptr->d + context); |
697 | 693 | ||
698 | fputs("@@ -", stdout); | 694 | printf("@@ -"); |
699 | uni_range(lowa, upb); | 695 | uni_range(lowa, upb); |
700 | fputs(" +", stdout); | 696 | printf(" +"); |
701 | uni_range(lowc, upd); | 697 | uni_range(lowc, upd); |
702 | fputs(" @@", stdout); | 698 | printf(" @@\n"); |
703 | putchar('\n'); | ||
704 | 699 | ||
705 | /* | 700 | /* |
706 | * Output changes in "unified" diff format--the old and new lines | 701 | * Output changes in "unified" diff format--the old and new lines |
@@ -894,13 +889,12 @@ static void output(char *file1, FILE * f1, char *file2, FILE * f2) | |||
894 | * 3*(number of k-candidates installed), typically about | 889 | * 3*(number of k-candidates installed), typically about |
895 | * 6n words for files of length n. | 890 | * 6n words for files of length n. |
896 | */ | 891 | */ |
897 | static int diffreg(char *ofile1, char *ofile2, int flags) | 892 | static unsigned diffreg(char * ofile1, char * ofile2, int flags) |
898 | { | 893 | { |
899 | char *file1 = ofile1; | 894 | char *file1 = ofile1; |
900 | char *file2 = ofile2; | 895 | char *file2 = ofile2; |
901 | FILE *f1 = stdin; | 896 | FILE *f1 = stdin, *f2 = stdin; |
902 | FILE *f2 = stdin; | 897 | unsigned rval; |
903 | int rval = D_SAME; | ||
904 | int i; | 898 | int i; |
905 | 899 | ||
906 | anychange = 0; | 900 | anychange = 0; |
@@ -908,6 +902,9 @@ static int diffreg(char *ofile1, char *ofile2, int flags) | |||
908 | 902 | ||
909 | if (S_ISDIR(stb1.st_mode) != S_ISDIR(stb2.st_mode)) | 903 | if (S_ISDIR(stb1.st_mode) != S_ISDIR(stb2.st_mode)) |
910 | return (S_ISDIR(stb1.st_mode) ? D_MISMATCH1 : D_MISMATCH2); | 904 | return (S_ISDIR(stb1.st_mode) ? D_MISMATCH1 : D_MISMATCH2); |
905 | |||
906 | rval = D_SAME; | ||
907 | |||
911 | if (LONE_DASH(file1) && LONE_DASH(file2)) | 908 | if (LONE_DASH(file1) && LONE_DASH(file2)) |
912 | goto closem; | 909 | goto closem; |
913 | 910 | ||
@@ -980,10 +977,8 @@ static int diffreg(char *ofile1, char *ofile2, int flags) | |||
980 | if (rval == D_SAME) | 977 | if (rval == D_SAME) |
981 | rval = D_DIFFER; | 978 | rval = D_DIFFER; |
982 | } | 979 | } |
983 | if (f1 != NULL) | 980 | fclose_if_not_stdin(f1); |
984 | fclose(f1); | 981 | fclose_if_not_stdin(f2); |
985 | if (f2 != NULL) | ||
986 | fclose(f2); | ||
987 | if (file1 != ofile1) | 982 | if (file1 != ofile1) |
988 | free(file1); | 983 | free(file1); |
989 | if (file2 != ofile2) | 984 | if (file2 != ofile2) |
@@ -998,19 +993,23 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2) | |||
998 | int flags = D_HEADER; | 993 | int flags = D_HEADER; |
999 | int val; | 994 | int val; |
1000 | 995 | ||
1001 | char *fullpath1 = xasprintf("%s/%s", dir1, path1); | 996 | char *fullpath1 = concat_path_file(dir1, path1); |
1002 | char *fullpath2 = xasprintf("%s/%s", dir2, path2); | 997 | char *fullpath2 = concat_path_file(dir2, path2); |
1003 | 998 | ||
1004 | if (stat(fullpath1, &stb1) != 0) { | 999 | if (stat(fullpath1, &stb1) != 0) { |
1005 | flags |= D_EMPTY1; | 1000 | flags |= D_EMPTY1; |
1006 | memset(&stb1, 0, sizeof(stb1)); | 1001 | memset(&stb1, 0, sizeof(stb1)); |
1007 | fullpath1 = xasprintf("%s/%s", dir1, path2); | 1002 | if (ENABLE_FEATURE_CLEAN_UP) |
1003 | free(fullpath1); | ||
1004 | fullpath1 = concat_path_file(dir1, path2); | ||
1008 | } | 1005 | } |
1009 | if (stat(fullpath2, &stb2) != 0) { | 1006 | if (stat(fullpath2, &stb2) != 0) { |
1010 | flags |= D_EMPTY2; | 1007 | flags |= D_EMPTY2; |
1011 | memset(&stb2, 0, sizeof(stb2)); | 1008 | memset(&stb2, 0, sizeof(stb2)); |
1012 | stb2.st_mode = stb1.st_mode; | 1009 | stb2.st_mode = stb1.st_mode; |
1013 | fullpath2 = xasprintf("%s/%s", dir2, path1); | 1010 | if (ENABLE_FEATURE_CLEAN_UP) |
1011 | free(fullpath2); | ||
1012 | fullpath2 = concat_path_file(dir2, path1); | ||
1014 | } | 1013 | } |
1015 | 1014 | ||
1016 | if (stb1.st_mode == 0) | 1015 | if (stb1.st_mode == 0) |
@@ -1173,7 +1172,7 @@ static void diffdir(char *p1, char *p2) | |||
1173 | 1172 | ||
1174 | int diff_main(int argc, char **argv) | 1173 | int diff_main(int argc, char **argv) |
1175 | { | 1174 | { |
1176 | int gotstdin = 0; | 1175 | smallint gotstdin = 0; |
1177 | char *U_opt; | 1176 | char *U_opt; |
1178 | char *f1, *f2; | 1177 | char *f1, *f2; |
1179 | llist_t *L_arg = NULL; | 1178 | llist_t *L_arg = NULL; |
@@ -1234,6 +1233,7 @@ int diff_main(int argc, char **argv) | |||
1234 | f2 = concat_path_file(f2, f1); | 1233 | f2 = concat_path_file(f2, f1); |
1235 | xstat(f2, &stb2); | 1234 | xstat(f2, &stb2); |
1236 | } | 1235 | } |
1236 | /* XXX: FIXME: */ | ||
1237 | /* We can't diff e.g. stdin supplied by a pipe - we use rewind(), fseek(). | 1237 | /* We can't diff e.g. stdin supplied by a pipe - we use rewind(), fseek(). |
1238 | * This can be fixed (volunteers?) */ | 1238 | * This can be fixed (volunteers?) */ |
1239 | if (!S_ISREG(stb1.st_mode) || !S_ISREG(stb2.st_mode)) | 1239 | if (!S_ISREG(stb1.st_mode) || !S_ISREG(stb2.st_mode)) |