Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/coreutils/echo.c

    r821 r1765  
    2121 *     trailing newline.  SUSv3 specifies _no_ output after '\c'.
    2222 * 2) SUSv3 specifies that octal escapes are of the form \0{#{#{#}}}.
    23  *    The previous version version did not allow 4-digit octals.
     23 *    The previous version did not allow 4-digit octals.
    2424 */
    2525
     26#include "libbb.h"
    2627
    27 #include <stdio.h>
    28 #include <string.h>
    29 #include <stdlib.h>
    30 #include "busybox.h"
    31 
    32 int bb_echo(int ATTRIBUTE_UNUSED argc, char **argv)
     28int bb_echo(char **argv)
    3329{
    34 #ifndef CONFIG_FEATURE_FANCY_ECHO
    35 #define eflag '\\'
    36     ++argv;
     30    const char *arg;
     31#if !ENABLE_FEATURE_FANCY_ECHO
     32    enum {
     33        eflag = '\\',
     34        nflag = 1,  /* 1 -- print '\n' */
     35    };
     36    arg = *++argv;
     37    if (!arg)
     38        goto newline_ret;
    3739#else
    3840    const char *p;
    39     int nflag = 1;
    40     int eflag = 0;
     41    char nflag = 1;
     42    char eflag = 0;
    4143
    42     while (*++argv && (**argv == '-')) {
     44    while (1) {
     45        arg = *++argv;
     46        if (!arg)
     47            goto newline_ret;
     48        if (*arg != '-')
     49            break;
     50
    4351        /* If it appears that we are handling options, then make sure
    4452         * that all of the options specified are actually valid.
    4553         * Otherwise, the string should just be echoed.
    4654         */
    47 
    48         if (!*(p = *argv + 1)) {    /* A single '-', so echo it. */
     55        p = arg + 1;
     56        if (!*p)    /* A single '-', so echo it. */
    4957            goto just_echo;
    50         }
    5158
    5259        do {
    53             if (strrchr("neE", *p) == 0) {
     60            if (!strrchr("neE", *p))
    5461                goto just_echo;
    55             }
    5662        } while (*++p);
    5763
    5864        /* All of the options in this arg are valid, so handle them. */
    59         p = *argv + 1;
     65        p = arg + 1;
    6066        do {
    61             if (*p == 'n') {
     67            if (*p == 'n')
    6268                nflag = 0;
    63             } else if (*p == 'e') {
     69            if (*p == 'e')
    6470                eflag = '\\';
    65             } else {
    66                 eflag = 0;
    67             }
    6871        } while (*++p);
    6972    }
     73 just_echo:
     74#endif
     75    while (1) {
     76        /* arg is already == *argv and isn't NULL */
     77        int c;
    7078
    71 just_echo:
    72 #endif
    73     while (*argv) {
    74         register int c;
    75 
    76         while ((c = *(*argv)++)) {
     79        if (!eflag) {
     80            /* optimization for very common case */
     81            fputs(arg, stdout);
     82        } else while ((c = *arg++)) {
    7783            if (c == eflag) {   /* Check for escape seq. */
    78                 if (**argv == 'c') {
     84                if (*arg == 'c') {
    7985                    /* '\c' means cancel newline and
    8086                     * ignore all subsequent chars. */
    81                     return 0;
     87                    goto ret;
    8288                }
    83 #ifndef CONFIG_FEATURE_FANCY_ECHO
     89#if !ENABLE_FEATURE_FANCY_ECHO
    8490                /* SUSv3 specifies that octal escapes must begin with '0'. */
    85                 if (((unsigned int)(**argv - '1')) >= 7)
     91                if ( (((unsigned char)*arg) - '1') >= 7)
    8692#endif
    8793                {
    8894                    /* Since SUSv3 mandates a first digit of 0, 4-digit octals
    8995                    * of the form \0### are accepted. */
    90                     if ((**argv == '0') && (((unsigned int)(argv[0][1] - '0')) < 8)) {
    91                         (*argv)++;
     96                    if (*arg == '0' && ((unsigned char)(arg[1]) - '0') < 8) {
     97                        arg++;
    9298                    }
    9399                    /* bb_process_escape_sequence can handle nul correctly */
    94                     c = bb_process_escape_sequence((const char **) argv);
     100                    c = bb_process_escape_sequence(&arg);
    95101                }
    96102            }
     
    98104        }
    99105
    100         if (*++argv) {
    101             putchar(' ');
    102         }
     106        arg = *++argv;
     107        if (!arg)
     108            break;
     109        putchar(' ');
    103110    }
    104111
    105 #ifdef CONFIG_FEATURE_FANCY_ECHO
     112 newline_ret:
    106113    if (nflag) {
    107114        putchar('\n');
    108115    }
    109 #else
    110     putchar('\n');
    111 #endif
    112     return 0;
     116 ret:
     117    return fflush(stdout);
    113118}
    114119
     120/* This is a NOFORK applet. Be very careful! */
     121
     122int echo_main(int argc, char** argv);
    115123int echo_main(int argc, char** argv)
    116124{
    117     (void)bb_echo(argc, argv);
    118     bb_fflush_stdout_and_exit(EXIT_SUCCESS);
     125    return bb_echo(argv);
    119126}
    120127
Note: See TracChangeset for help on using the changeset viewer.