123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- #include "libbb.h"
- int echo_main(int argc UNUSED_PARAM, char **argv)
- {
- char **pp;
- const char *arg;
- char *out;
- char *buffer;
- unsigned buflen;
- #if !ENABLE_FEATURE_FANCY_ECHO
- enum {
- eflag = 0,
- nflag = 1,
- };
- argv++;
- #else
- char nflag = 1;
- char eflag = 0;
- while ((arg = *++argv) != NULL) {
- char n, e;
- if (arg[0] != '-')
- break;
-
- arg++;
- n = nflag;
- e = eflag;
- do {
- if (*arg == 'n')
- n = 0;
- else if (*arg == 'e')
- e = '\\';
- else if (*arg != 'E') {
-
-
- goto just_echo;
- }
- } while (*++arg);
- nflag = n;
- eflag = e;
- }
- just_echo:
- #endif
- buflen = 0;
- pp = argv;
- while ((arg = *pp) != NULL) {
- buflen += strlen(arg) + 1;
- pp++;
- }
- out = buffer = xmalloc(buflen + 1);
- while ((arg = *argv) != NULL) {
- int c;
- if (!eflag) {
-
- out = stpcpy(out, arg);
- } else
- while ((c = *arg++) != '\0') {
- if (c == eflag) {
-
- if (*arg == 'c') {
-
- goto do_write;
- }
-
- if (*arg == '0') {
- if ((unsigned char)(arg[1] - '0') < 8) {
-
- arg++;
- }
- }
-
- {
-
- const char *z = arg;
- c = bb_process_escape_sequence(&z);
- arg = z;
- }
- }
- *out++ = c;
- }
- if (!*++argv)
- break;
- *out++ = ' ';
- }
- if (nflag) {
- *out++ = '\n';
- }
- do_write:
-
- errno = 0;
- full_write(STDOUT_FILENO, buffer, out - buffer);
- free(buffer);
- if ( errno) {
- bb_perror_msg(bb_msg_write_error);
- return 1;
- }
- return 0;
- }
- #ifdef VERSION_WITH_WRITEV
- int echo_main(int argc, char **argv)
- {
- struct iovec io[argc];
- struct iovec *cur_io = io;
- char *arg;
- char *p;
- #if !ENABLE_FEATURE_FANCY_ECHO
- enum {
- eflag = '\\',
- nflag = 1,
- };
- arg = *++argv;
- if (!arg)
- goto newline_ret;
- #else
- char nflag = 1;
- char eflag = 0;
- while (1) {
- arg = *++argv;
- if (!arg)
- goto newline_ret;
- if (*arg != '-')
- break;
-
- p = arg + 1;
- if (!*p)
- goto just_echo;
- do {
- if (!strchr("neE", *p))
- goto just_echo;
- } while (*++p);
-
- p = arg + 1;
- do {
- if (*p == 'n')
- nflag = 0;
- if (*p == 'e')
- eflag = '\\';
- } while (*++p);
- }
- just_echo:
- #endif
- while (1) {
-
- int c;
- cur_io->iov_base = p = arg;
- if (!eflag) {
-
- p += strlen(arg);
- } else while ((c = *arg++)) {
- if (c == eflag) {
-
- if (*arg == 'c') {
-
- cur_io->iov_len = p - (char*)cur_io->iov_base;
- cur_io++;
- goto ret;
- }
-
- if (*arg == '0' && (unsigned char)(arg[1] - '0') < 8) {
- arg++;
- }
-
- c = bb_process_escape_sequence( (void*) &arg);
- }
- *p++ = c;
- }
- arg = *++argv;
- if (arg)
- *p++ = ' ';
- cur_io->iov_len = p - (char*)cur_io->iov_base;
- cur_io++;
- if (!arg)
- break;
- }
- newline_ret:
- if (nflag) {
- cur_io->iov_base = (char*)"\n";
- cur_io->iov_len = 1;
- cur_io++;
- }
- ret:
-
- return writev(1, io, (cur_io - io)) >= 0;
- }
- #endif
|