diff options
| -rw-r--r-- | editors/cmp.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/editors/cmp.c b/editors/cmp.c index e106d814e..9eaff2b8e 100644 --- a/editors/cmp.c +++ b/editors/cmp.c | |||
| @@ -18,12 +18,13 @@ | |||
| 18 | //kbuild:lib-$(CONFIG_CMP) += cmp.o | 18 | //kbuild:lib-$(CONFIG_CMP) += cmp.o |
| 19 | 19 | ||
| 20 | //usage:#define cmp_trivial_usage | 20 | //usage:#define cmp_trivial_usage |
| 21 | //usage: "[-ls] FILE1 [FILE2" IF_DESKTOP(" [SKIP1 [SKIP2]]") "]" | 21 | //usage: "[-ls] [-n NUM] FILE1 [FILE2" IF_DESKTOP(" [SKIP1 [SKIP2]]") "]" |
| 22 | //usage:#define cmp_full_usage "\n\n" | 22 | //usage:#define cmp_full_usage "\n\n" |
| 23 | //usage: "Compare FILE1 with FILE2 (or stdin)\n" | 23 | //usage: "Compare FILE1 with FILE2 (or stdin)\n" |
| 24 | //usage: "\n -l Write the byte numbers (decimal) and values (octal)" | 24 | //usage: "\n -l Write the byte numbers (decimal) and values (octal)" |
| 25 | //usage: "\n for all differing bytes" | 25 | //usage: "\n for all differing bytes" |
| 26 | //usage: "\n -s Quiet" | 26 | //usage: "\n -s Quiet" |
| 27 | //usage: "\n -n NUM Compare at most NUM bytes" | ||
| 27 | 28 | ||
| 28 | /* BB_AUDIT SUSv3 (virtually) compliant -- uses nicer GNU format for -l. */ | 29 | /* BB_AUDIT SUSv3 (virtually) compliant -- uses nicer GNU format for -l. */ |
| 29 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/cmp.html */ | 30 | /* http://www.opengroup.org/onlinepubs/007904975/utilities/cmp.html */ |
| @@ -35,9 +36,10 @@ static const char fmt_differ[] ALIGN1 = "%s %s differ: char %"OFF_FMT"u, line %u | |||
| 35 | // This fmt_l_opt uses gnu-isms. SUSv3 would be "%.0s%.0s%"OFF_FMT"u %o %o\n" | 36 | // This fmt_l_opt uses gnu-isms. SUSv3 would be "%.0s%.0s%"OFF_FMT"u %o %o\n" |
| 36 | static const char fmt_l_opt[] ALIGN1 = "%.0s%.0s%"OFF_FMT"u %3o %3o\n"; | 37 | static const char fmt_l_opt[] ALIGN1 = "%.0s%.0s%"OFF_FMT"u %3o %3o\n"; |
| 37 | 38 | ||
| 38 | #define OPT_STR "sl" | 39 | #define OPT_STR "sln:" |
| 39 | #define CMP_OPT_s (1<<0) | 40 | #define CMP_OPT_s (1<<0) |
| 40 | #define CMP_OPT_l (1<<1) | 41 | #define CMP_OPT_l (1<<1) |
| 42 | #define CMP_OPT_n (1<<2) | ||
| 41 | 43 | ||
| 42 | int cmp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 44 | int cmp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 43 | int cmp_main(int argc UNUSED_PARAM, char **argv) | 45 | int cmp_main(int argc UNUSED_PARAM, char **argv) |
| @@ -50,13 +52,15 @@ int cmp_main(int argc UNUSED_PARAM, char **argv) | |||
| 50 | int c1, c2; | 52 | int c1, c2; |
| 51 | unsigned opt; | 53 | unsigned opt; |
| 52 | int retval = 0; | 54 | int retval = 0; |
| 55 | int max_count = -1; | ||
| 53 | 56 | ||
| 54 | opt = getopt32(argv, "^" | 57 | opt = getopt32(argv, "^" |
| 55 | OPT_STR | 58 | OPT_STR |
| 56 | "\0" "-1" | 59 | "\0" "-1:n+" |
| 57 | IF_DESKTOP(":?4") | 60 | IF_DESKTOP(":?4") |
| 58 | IF_NOT_DESKTOP(":?2") | 61 | IF_NOT_DESKTOP(":?2") |
| 59 | ":l--s:s--l" | 62 | ":l--s:s--l", |
| 63 | &max_count | ||
| 60 | ); | 64 | ); |
| 61 | argv += optind; | 65 | argv += optind; |
| 62 | 66 | ||
| @@ -95,6 +99,8 @@ int cmp_main(int argc UNUSED_PARAM, char **argv) | |||
| 95 | while (skip2) { getc(fp2); skip2--; } | 99 | while (skip2) { getc(fp2); skip2--; } |
| 96 | } | 100 | } |
| 97 | do { | 101 | do { |
| 102 | if (max_count >= 0 && --max_count < 0) | ||
| 103 | break; | ||
| 98 | c1 = getc(fp1); | 104 | c1 = getc(fp1); |
| 99 | c2 = getc(fp2); | 105 | c2 = getc(fp2); |
| 100 | ++char_pos; | 106 | ++char_pos; |
