remove duplicated code and rework algorithms to end up with smaller code

This commit is contained in:
Mike Frysinger
2005-05-13 00:57:30 +00:00
parent dad4cf7e63
commit 867a6080fe

View File

@@ -40,15 +40,16 @@ static int both;
/* writeline outputs the input given, appropriately aligned according to class */ /* writeline outputs the input given, appropriately aligned according to class */
static void writeline(char *line, int class) static void writeline(char *line, int class)
{ {
if (class == 1 && !only_file_1) if (class == 0) {
if (!only_file_1)
return; return;
else if (class == 2) { } else if (class == 1) {
if (!only_file_2) if (!only_file_2)
return; return;
if (only_file_1) if (only_file_1)
putchar('\t'); putchar('\t');
} }
else if (class == 3) { else /*if (class == 2)*/ {
if (!both) if (!both)
return; return;
if (only_file_1) if (only_file_1)
@@ -60,73 +61,69 @@ static void writeline(char *line, int class)
} }
/* This is the real core of the program - lines are compared here */ /* 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]; FILE *streams[2];
int i = 0; int i;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; ++i) {
streams[i] = (strcmp(infiles[i], "=") == 0 ? stdin : bb_xfopen(infiles[i], "r")); streams[i] = ((infiles[i][0] == '=' && infiles[1][1]) ? stdin : bb_xfopen(infiles[i], "r"));
fgets(thisline[i], 100, streams[i]); fgets(thisline[i], LINE_LEN, streams[i]);
} }
while (thisline[0] || thisline[1]) { while (thisline[0] || thisline[1]) {
int order = 0; 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]) if (!thisline[0])
order = 1; order = 1;
else if (!thisline[1]) else if (!thisline[1])
order = -1; order = -1;
else { 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); order = memcmp(thisline[0], thisline[1], tl0_len < tl1_len ? tl0_len : tl1_len);
if (!order) if (!order)
order = tl0_len < tl1_len ? -1 : tl0_len != tl1_len; order = tl0_len < tl1_len ? -1 : tl0_len != tl1_len;
} }
if ((order == 0) && (!feof(streams[0])) && (!feof(streams[1]))) if (order == 0 && !i)
writeline(thisline[1], 3);
else if ((order > 0) && (!feof(streams[1])))
writeline(thisline[1], 2); writeline(thisline[1], 2);
else if ((order < 0) && (!feof(streams[0]))) else if (order > 0 && !(i & BB_EOF_1))
writeline(thisline[0], 1); writeline(thisline[1], 1);
else if (order < 0 && !(i & BB_EOF_0))
writeline(thisline[0], 0);
if (feof(streams[0]) && feof(streams[1])) { if (i & BB_EOF_0 & BB_EOF_1) {
fclose(streams[0]);
fclose(streams[1]);
break; break;
} else if (feof(streams[0])) { } else if (i) {
while (!feof(streams[1])) { i = (i & BB_EOF_0 ? 1 : 0);
if (order < 0) while (!feof(streams[i])) {
writeline(thisline[1], 2); if ((order < 0 && i) || (order > 0 && !i))
fgets(thisline[1], 100, streams[1]); writeline(thisline[i], i);
fgets(thisline[i], LINE_LEN, streams[i]);
} }
fclose(streams[0]);
fclose(streams[1]);
break;
} else if (feof(streams[1])) {
while (!feof(streams[0])) {
if (order > 0)
writeline(thisline[0], 1);
fgets(thisline[0], 100, streams[0]);
}
fclose(streams[0]);
fclose(streams[1]);
break; break;
} else { } else {
if (order >= 0) if (order >= 0)
fgets(thisline[1], 100, streams[1]); fgets(thisline[1], LINE_LEN, streams[1]);
if (order <= 0) 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)
@@ -142,5 +139,6 @@ int comm_main(int argc, char **argv)
only_file_2 = !(flags & COMM_OPT_2); only_file_2 = !(flags & COMM_OPT_2);
both = !(flags & COMM_OPT_3); both = !(flags & COMM_OPT_3);
exit(cmp_files(argv + optind) == 0 ? EXIT_SUCCESS : EXIT_FAILURE); cmp_files(argv + optind);
exit(EXIT_SUCCESS);
} }