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