Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/coreutils/echo.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/coreutils/echo.c
r821 r1770 21 21 * trailing newline. SUSv3 specifies _no_ output after '\c'. 22 22 * 2) SUSv3 specifies that octal escapes are of the form \0{#{#{#}}}. 23 * The previous version versiondid not allow 4-digit octals.23 * The previous version did not allow 4-digit octals. 24 24 */ 25 25 26 #include "libbb.h" 26 27 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) 28 int bb_echo(char **argv) 33 29 { 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; 37 39 #else 38 40 const char *p; 39 intnflag = 1;40 inteflag = 0;41 char nflag = 1; 42 char eflag = 0; 41 43 42 while (*++argv && (**argv == '-')) { 44 while (1) { 45 arg = *++argv; 46 if (!arg) 47 goto newline_ret; 48 if (*arg != '-') 49 break; 50 43 51 /* If it appears that we are handling options, then make sure 44 52 * that all of the options specified are actually valid. 45 53 * Otherwise, the string should just be echoed. 46 54 */ 47 48 if (!* (p = *argv + 1)) {/* A single '-', so echo it. */55 p = arg + 1; 56 if (!*p) /* A single '-', so echo it. */ 49 57 goto just_echo; 50 }51 58 52 59 do { 53 if ( strrchr("neE", *p) == 0) {60 if (!strrchr("neE", *p)) 54 61 goto just_echo; 55 }56 62 } while (*++p); 57 63 58 64 /* All of the options in this arg are valid, so handle them. */ 59 p = *argv+ 1;65 p = arg + 1; 60 66 do { 61 if (*p == 'n') {67 if (*p == 'n') 62 68 nflag = 0; 63 } else if (*p == 'e') {69 if (*p == 'e') 64 70 eflag = '\\'; 65 } else {66 eflag = 0;67 }68 71 } while (*++p); 69 72 } 73 just_echo: 74 #endif 75 while (1) { 76 /* arg is already == *argv and isn't NULL */ 77 int c; 70 78 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++)) { 77 83 if (c == eflag) { /* Check for escape seq. */ 78 if (* *argv== 'c') {84 if (*arg == 'c') { 79 85 /* '\c' means cancel newline and 80 86 * ignore all subsequent chars. */ 81 return 0;87 goto ret; 82 88 } 83 #if ndef CONFIG_FEATURE_FANCY_ECHO89 #if !ENABLE_FEATURE_FANCY_ECHO 84 90 /* SUSv3 specifies that octal escapes must begin with '0'. */ 85 if ( ((unsigned int)(**argv - '1')) >= 7)91 if ( (((unsigned char)*arg) - '1') >= 7) 86 92 #endif 87 93 { 88 94 /* Since SUSv3 mandates a first digit of 0, 4-digit octals 89 95 * 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++; 92 98 } 93 99 /* bb_process_escape_sequence can handle nul correctly */ 94 c = bb_process_escape_sequence( (const char **) argv);100 c = bb_process_escape_sequence(&arg); 95 101 } 96 102 } … … 98 104 } 99 105 100 if (*++argv) { 101 putchar(' '); 102 } 106 arg = *++argv; 107 if (!arg) 108 break; 109 putchar(' '); 103 110 } 104 111 105 #ifdef CONFIG_FEATURE_FANCY_ECHO 112 newline_ret: 106 113 if (nflag) { 107 114 putchar('\n'); 108 115 } 109 #else 110 putchar('\n'); 111 #endif 112 return 0; 116 ret: 117 return fflush(stdout); 113 118 } 114 119 120 /* This is a NOFORK applet. Be very careful! */ 121 122 int echo_main(int argc, char** argv); 115 123 int echo_main(int argc, char** argv) 116 124 { 117 (void)bb_echo(argc, argv); 118 bb_fflush_stdout_and_exit(EXIT_SUCCESS); 125 return bb_echo(argv); 119 126 } 120 127
Note:
See TracChangeset
for help on using the changeset viewer.