echo.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * echo implementation for busybox
  4. *
  5. * Copyright (c) 1991, 1993
  6. * The Regents of the University of California. All rights reserved.
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *
  22. * Original copyright notice is retained at the end of this file.
  23. */
  24. /* BB_AUDIT SUSv3 compliant -- unless configured as fancy echo. */
  25. /* http://www.opengroup.org/onlinepubs/007904975/utilities/echo.html */
  26. /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
  27. *
  28. * Because of behavioral differences, implemented configurable SUSv3
  29. * or 'fancy' gnu-ish behaviors. Also, reduced size and fixed bugs.
  30. * 1) In handling '\c' escape, the previous version only suppressed the
  31. * trailing newline. SUSv3 specifies _no_ output after '\c'.
  32. * 2) SUSv3 specifies that octal escapes are of the form \0{#{#{#}}}.
  33. * The previous version version did not allow 4-digit octals.
  34. */
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <stdlib.h>
  38. #include "busybox.h"
  39. extern int echo_main(int argc, char** argv)
  40. {
  41. #ifndef CONFIG_FEATURE_FANCY_ECHO
  42. #define eflag '\\'
  43. ++argv;
  44. #else
  45. const char *p;
  46. int nflag = 1;
  47. int eflag = 0;
  48. while (*++argv && (**argv == '-')) {
  49. /* If it appears that we are handling options, then make sure
  50. * that all of the options specified are actually valid.
  51. * Otherwise, the string should just be echoed.
  52. */
  53. if (!*(p = *argv + 1)) { /* A single '-', so echo it. */
  54. goto just_echo;
  55. }
  56. do {
  57. if (strrchr("neE", *p) == 0) {
  58. goto just_echo;
  59. }
  60. } while (*++p);
  61. /* All of the options in this arg are valid, so handle them. */
  62. p = *argv + 1;
  63. do {
  64. if (*p == 'n') {
  65. nflag = 0;
  66. } else if (*p == 'e') {
  67. eflag = '\\';
  68. } else {
  69. eflag = 0;
  70. }
  71. } while (*++p);
  72. }
  73. just_echo:
  74. #endif
  75. while (*argv) {
  76. register int c;
  77. while ((c = *(*argv)++)) {
  78. if (c == eflag) { /* Check for escape seq. */
  79. if (**argv == 'c') {
  80. /* '\c' means cancel newline and
  81. * ignore all subsequent chars. */
  82. goto DONE;
  83. }
  84. #ifndef CONFIG_FEATURE_FANCY_ECHO
  85. /* SUSv3 specifies that octal escapes must begin with '0'. */
  86. if (((unsigned int)(**argv - '1')) >= 7)
  87. #endif
  88. {
  89. /* Since SUSv3 mandates a first digit of 0, 4-digit octals
  90. * of the form \0### are accepted. */
  91. if ((**argv == '0') && (((unsigned int)(argv[0][1] - '0')) < 8)) {
  92. (*argv)++;
  93. }
  94. /* bb_process_escape_sequence can handle nul correctly */
  95. c = bb_process_escape_sequence((const char **) argv);
  96. }
  97. }
  98. putchar(c);
  99. }
  100. if (*++argv) {
  101. putchar(' ');
  102. }
  103. }
  104. #ifdef CONFIG_FEATURE_FANCY_ECHO
  105. if (nflag) {
  106. putchar('\n');
  107. }
  108. #else
  109. putchar('\n');
  110. #endif
  111. DONE:
  112. bb_fflush_stdout_and_exit(EXIT_SUCCESS);
  113. }
  114. /*-
  115. * Copyright (c) 1991, 1993
  116. * The Regents of the University of California. All rights reserved.
  117. *
  118. * This code is derived from software contributed to Berkeley by
  119. * Kenneth Almquist.
  120. *
  121. * Redistribution and use in source and binary forms, with or without
  122. * modification, are permitted provided that the following conditions
  123. * are met:
  124. * 1. Redistributions of source code must retain the above copyright
  125. * notice, this list of conditions and the following disclaimer.
  126. * 2. Redistributions in binary form must reproduce the above copyright
  127. * notice, this list of conditions and the following disclaimer in the
  128. * documentation and/or other materials provided with the distribution.
  129. *
  130. * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
  131. * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
  132. *
  133. * California, Berkeley and its contributors.
  134. * 4. Neither the name of the University nor the names of its contributors
  135. * may be used to endorse or promote products derived from this software
  136. * without specific prior written permission.
  137. *
  138. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  139. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  140. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  141. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  142. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  143. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  144. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  145. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  146. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  147. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  148. * SUCH DAMAGE.
  149. *
  150. * @(#)echo.c 8.1 (Berkeley) 5/31/93
  151. */