X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fcomm.c;h=772dafc4dfda1b32ee480f1fc05a3133c908291f;hb=843c5ef0f95e0a6f61f4e27d0355aca5e09ee6b1;hp=f390490e2a45a51eee4a64c213cb8f9cb9fa0126;hpb=3ba93c04383e8ede9608fa91ed3058db1d213244;p=oweals%2Fbusybox.git diff --git a/coreutils/comm.c b/coreutils/comm.c index f390490e2..772dafc4d 100644 --- a/coreutils/comm.c +++ b/coreutils/comm.c @@ -38,119 +38,107 @@ static int only_file_2; static int both; /* writeline outputs the input given, appropriately aligned according to class */ -static void writeline (char *line, int class) +static void writeline(char *line, int class) { - switch (class) { - case 1: - if (!only_file_1) - return; - break; - case 2: - if (!only_file_2) - return; - if (only_file_1) - putchar('\t'); - break; - case 3: - if (!both) - return; - if (only_file_1) - putchar('\t'); - if (only_file_2) - putchar('\t'); - break; + if (class == 0) { + if (!only_file_1) + return; + } else if (class == 1) { + if (!only_file_2) + return; + if (only_file_1) + putchar('\t'); + } + else /*if (class == 2)*/ { + if (!both) + return; + if (only_file_1) + putchar('\t'); + if (only_file_2) + putchar('\t'); } fputs(line, stdout); } /* This is the real core of the program - lines are compared here */ -static int cmp_files(char **infiles) +static void cmp_files(char **infiles) { - char thisline[2][100]; +#define LINE_LEN 100 +#define BB_EOF_0 0x1 +#define BB_EOF_1 0x2 + char thisline[2][LINE_LEN]; FILE *streams[2]; - int i = 0; + int i; - for (i = 0; i < 2; i++) { - streams[i] = (strcmp(infiles[i], "=") == 0 ? stdin : fopen(infiles[i], "r")); - fgets(thisline[i], 100, streams[i]); + for (i = 0; i < 2; ++i) { + streams[i] = ((infiles[i][0] == '=' && infiles[i][1]) ? stdin : bb_xfopen(infiles[i], "r")); + fgets(thisline[i], LINE_LEN, streams[i]); } while (thisline[0] || thisline[1]) { int order = 0; - int tl0_len = strlen(thisline[0]); - int tl1_len = strlen(thisline[1]); + + i = 0; + if (feof(streams[0])) i |= BB_EOF_0; + if (feof(streams[1])) i |= BB_EOF_1; if (!thisline[0]) order = 1; else if (!thisline[1]) order = -1; else { + int tl0_len, tl1_len; + tl0_len = strlen(thisline[0]); + tl1_len = strlen(thisline[1]); order = memcmp(thisline[0], thisline[1], tl0_len < tl1_len ? tl0_len : tl1_len); if (!order) order = tl0_len < tl1_len ? -1 : tl0_len != tl1_len; } - if ((order == 0) && (!feof(streams[0])) && (!feof(streams[1]))) - writeline(thisline[1], 3); - else if ((order > 0) && (!feof(streams[1]))) + if (order == 0 && !i) writeline(thisline[1], 2); - else if ((order < 0) && (!feof(streams[0]))) - writeline(thisline[0], 1); - - if (feof(streams[0]) && feof(streams[1])) { - fclose(streams[0]); - fclose(streams[1]); - break; + else if (order > 0 && !(i & BB_EOF_1)) + writeline(thisline[1], 1); + else if (order < 0 && !(i & BB_EOF_0)) + writeline(thisline[0], 0); - } else if (feof(streams[0])) { - while (!feof(streams[1])) { - if (order < 0) - writeline(thisline[1], 2); - fgets(thisline[1], 100, streams[1]); - } - fclose(streams[0]); - fclose(streams[1]); + if (i & BB_EOF_0 & BB_EOF_1) { break; - } else if (feof(streams[1])) { - while (!feof(streams[0])) { - if (order > 0) - writeline(thisline[0], 1); - fgets(thisline[0], 100, streams[0]); + } else if (i) { + i = (i & BB_EOF_0 ? 1 : 0); + while (!feof(streams[i])) { + if ((order < 0 && i) || (order > 0 && !i)) + writeline(thisline[i], i); + fgets(thisline[i], LINE_LEN, streams[i]); } - fclose(streams[0]); - fclose(streams[1]); break; } else { if (order >= 0) - fgets(thisline[1], 100, streams[1]); + fgets(thisline[1], LINE_LEN, streams[1]); if (order <= 0) - fgets(thisline[0], 100, streams[0]); + fgets(thisline[0], LINE_LEN, streams[0]); } } - return 0; + fclose(streams[0]); + fclose(streams[1]); } -int comm_main (int argc, char **argv) +int comm_main(int argc, char **argv) { - unsigned long opt; - only_file_1 = 1; - only_file_2 = 1; - both = 1; + unsigned long flags; - opt = bb_getopt_ulflags(argc, argv, "123"); + flags = bb_getopt_ulflags(argc, argv, "123"); - if (optind != argc + 2) + if (optind + 2 != argc) bb_show_usage(); - if (opt & COMM_OPT_1) - only_file_1 = 0; - if (opt & COMM_OPT_2) - only_file_2 = 0; - if (opt & COMM_OPT_3) - both = 0; + only_file_1 = !(flags & COMM_OPT_1); + only_file_2 = !(flags & COMM_OPT_2); + both = !(flags & COMM_OPT_3); - exit(cmp_files(argv + optind) == 0 ? EXIT_SUCCESS : EXIT_FAILURE); + cmp_files(argv + optind); + exit(EXIT_SUCCESS); }