Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/coreutils/comm.c

    r1765 r2725  
    55 * Copyright (C) 2005 by Robert Sullivan <cogito.ergo.cogito@gmail.com>
    66 *
    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.
    88 */
    99
     
    1515
    1616/* writeline outputs the input given, appropriately aligned according to class */
    17 static void writeline(char *line, int class, int flags)
     17static void writeline(char *line, int class)
    1818{
     19    int flags = option_mask32;
    1920    if (class == 0) {
    2021        if (flags & COMM_OPT_1)
     
    3334            putchar('\t');
    3435    }
    35     fputs(line, stdout);
     36    puts(line);
    3637}
    3738
    38 int comm_main(int argc, char **argv);
    39 int comm_main(int argc, char **argv)
     39int comm_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     40int comm_main(int argc UNUSED_PARAM, char **argv)
    4041{
    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];
    4644    int i;
    47     unsigned flags;
     45    int order;
    4846
    4947    opt_complementary = "=2";
    50     flags = getopt32(argv, "123");
     48    getopt32(argv, "123");
    5149    argv += optind;
    5250
    5351    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]);
    5653    }
    5754
    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]);
    7865        }
    7966
    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]);
    8671
    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    }
    8977
    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);
    10491        }
    10592    }
    10693
    10794    if (ENABLE_FEATURE_CLEAN_UP) {
    108         fclose(streams[0]);
    109         fclose(streams[1]);
     95        fclose(stream[0]);
     96        fclose(stream[1]);
    11097    }
    11198
Note: See TracChangeset for help on using the changeset viewer.