Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/comm.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/coreutils/comm.c
r1765 r2725 5 5 * Copyright (C) 2005 by Robert Sullivan <cogito.ergo.cogito@gmail.com> 6 6 * 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.7 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 8 8 */ 9 9 … … 15 15 16 16 /* writeline outputs the input given, appropriately aligned according to class */ 17 static void writeline(char *line, int class , int flags)17 static void writeline(char *line, int class) 18 18 { 19 int flags = option_mask32; 19 20 if (class == 0) { 20 21 if (flags & COMM_OPT_1) … … 33 34 putchar('\t'); 34 35 } 35 fputs(line, stdout);36 puts(line); 36 37 } 37 38 38 int comm_main(int argc, char **argv) ;39 int comm_main(int argc , char **argv)39 int comm_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 40 int comm_main(int argc UNUSED_PARAM, char **argv) 40 41 { 41 #define LINE_LEN 100 42 #define BB_EOF_0 0x1 43 #define BB_EOF_1 0x2 44 char thisline[2][LINE_LEN]; 45 FILE *streams[2]; 42 char *thisline[2]; 43 FILE *stream[2]; 46 44 int i; 47 unsigned flags;45 int order; 48 46 49 47 opt_complementary = "=2"; 50 flags =getopt32(argv, "123");48 getopt32(argv, "123"); 51 49 argv += optind; 52 50 53 51 for (i = 0; i < 2; ++i) { 54 streams[i] = (argv[i][0] == '-' && !argv[i][1]) ? stdin : xfopen(argv[i], "r"); 55 fgets(thisline[i], LINE_LEN, streams[i]); 52 stream[i] = xfopen_stdin(argv[i]); 56 53 } 57 54 58 /* This is the real core of the program - lines are compared here */ 59 60 while (*thisline[0] || *thisline[1]) { 61 int order = 0; 62 63 i = 0; 64 if (feof(streams[0])) i |= BB_EOF_0; 65 if (feof(streams[1])) i |= BB_EOF_1; 66 67 if (!*thisline[0]) 68 order = 1; 69 else if (!*thisline[1]) 70 order = -1; 71 else { 72 int tl0_len, tl1_len; 73 tl0_len = strlen(thisline[0]); 74 tl1_len = strlen(thisline[1]); 75 order = memcmp(thisline[0], thisline[1], tl0_len < tl1_len ? tl0_len : tl1_len); 76 if (!order) 77 order = tl0_len < tl1_len ? -1 : tl0_len != tl1_len; 55 order = 0; 56 thisline[1] = thisline[0] = NULL; 57 while (1) { 58 if (order <= 0) { 59 free(thisline[0]); 60 thisline[0] = xmalloc_fgetline(stream[0]); 61 } 62 if (order >= 0) { 63 free(thisline[1]); 64 thisline[1] = xmalloc_fgetline(stream[1]); 78 65 } 79 66 80 if (order == 0 && !i) 81 writeline(thisline[1], 2, flags); 82 else if (order > 0 && !(i & BB_EOF_1)) 83 writeline(thisline[1], 1, flags); 84 else if (order < 0 && !(i & BB_EOF_0)) 85 writeline(thisline[0], 0, flags); 67 i = !thisline[0] + (!thisline[1] << 1); 68 if (i) 69 break; 70 order = strcmp(thisline[0], thisline[1]); 86 71 87 if (i & BB_EOF_0 & BB_EOF_1) { 88 break; 72 if (order >= 0) 73 writeline(thisline[1], order ? 1 : 2); 74 else 75 writeline(thisline[0], 0); 76 } 89 77 90 } else if (i) { 91 i = (i & BB_EOF_0 ? 1 : 0); 92 while (!feof(streams[i])) { 93 if ((order < 0 && i) || (order > 0 && !i)) 94 writeline(thisline[i], i, flags); 95 fgets(thisline[i], LINE_LEN, streams[i]); 96 } 97 break; 98 99 } else { 100 if (order >= 0) 101 fgets(thisline[1], LINE_LEN, streams[1]); 102 if (order <= 0) 103 fgets(thisline[0], LINE_LEN, streams[0]); 78 /* EOF at least on one of the streams */ 79 i &= 1; 80 if (thisline[i]) { 81 /* stream[i] is not at EOF yet */ 82 /* we did not print thisline[i] yet */ 83 char *p = thisline[i]; 84 writeline(p, i); 85 while (1) { 86 free(p); 87 p = xmalloc_fgetline(stream[i]); 88 if (!p) 89 break; 90 writeline(p, i); 104 91 } 105 92 } 106 93 107 94 if (ENABLE_FEATURE_CLEAN_UP) { 108 fclose(stream s[0]);109 fclose(stream s[1]);95 fclose(stream[0]); 96 fclose(stream[1]); 110 97 } 111 98
Note:
See TracChangeset
for help on using the changeset viewer.