]> git.ipfire.org Git - thirdparty/bash.git/blob - builtins/echo.def
a91c8e4cb6e799ec91783079d9f9e99c47eb0c0d
[thirdparty/bash.git] / builtins / echo.def
1 This file is echo.def, from which is created echo.c.
2 It implements the builtin "echo" in Bash.
3
4 Copyright (C) 1987-2002 Free Software Foundation, Inc.
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
8 Bash is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
21
22 $PRODUCES echo.c
23 #include <config.h>
24
25 #if defined (HAVE_UNISTD_H)
26 # include <unistd.h>
27 #endif
28
29 #include "../bashansi.h"
30
31 #include <stdio.h>
32 #include "../shell.h"
33
34 $BUILTIN echo
35 $FUNCTION echo_builtin
36 $DEPENDS_ON V9_ECHO
37 $SHORT_DOC echo [-neE] [arg ...]
38 Output the ARGs. If -n is specified, the trailing newline is
39 suppressed. If the -e option is given, interpretation of the
40 following backslash-escaped characters is turned on:
41 \a alert (bell)
42 \b backspace
43 \c suppress trailing newline
44 \E escape character
45 \f form feed
46 \n new line
47 \r carriage return
48 \t horizontal tab
49 \v vertical tab
50 \\ backslash
51 \num the character whose ASCII code is NUM (octal).
52
53 You can explicitly turn off the interpretation of the above characters
54 with the -E option.
55 $END
56
57 $BUILTIN echo
58 $FUNCTION echo_builtin
59 $DEPENDS_ON !V9_ECHO
60 $SHORT_DOC echo [-n] [arg ...]
61 Output the ARGs. If -n is specified, the trailing newline is suppressed.
62 $END
63
64 #if defined (V9_ECHO)
65 # define VALID_ECHO_OPTIONS "neE"
66 #else /* !V9_ECHO */
67 # define VALID_ECHO_OPTIONS "n"
68 #endif /* !V9_ECHO */
69
70 /* System V machines already have a /bin/sh with a v9 behaviour. We
71 give Bash the identical behaviour for these machines so that the
72 existing system shells won't barf. Regrettably, the SUS v2 has
73 standardized the Sys V echo behavior. This variable is external
74 so that we can have a `shopt' variable to control it at runtime. */
75 #if defined (DEFAULT_ECHO_TO_XPG)
76 int xpg_echo = 1;
77 #else
78 int xpg_echo = 0;
79 #endif /* DEFAULT_ECHO_TO_XPG */
80
81 /* Print the words in LIST to standard output. If the first word is
82 `-n', then don't print a trailing newline. We also support the
83 echo syntax from Version 9 Unix systems. */
84 int
85 echo_builtin (list)
86 WORD_LIST *list;
87 {
88 int display_return, do_v9, i, len;
89 char *temp, *s;
90
91 do_v9 = xpg_echo;
92 display_return = 1;
93
94 for (; list && (temp = list->word->word) && *temp == '-'; list = list->next)
95 {
96 /* If it appears that we are handling options, then make sure that
97 all of the options specified are actually valid. Otherwise, the
98 string should just be echoed. */
99 temp++;
100
101 for (i = 0; temp[i]; i++)
102 {
103 if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
104 break;
105 }
106
107 /* echo - and echo -<nonopt> both mean to just echo the arguments. */
108 if (*temp == 0 || temp[i])
109 break;
110
111 /* All of the options in TEMP are valid options to ECHO.
112 Handle them. */
113 while (i = *temp++)
114 {
115 switch (i)
116 {
117 case 'n':
118 display_return = 0;
119 break;
120 #if defined (V9_ECHO)
121 case 'e':
122 do_v9 = 1;
123 break;
124 case 'E':
125 do_v9 = 0;
126 break;
127 #endif /* V9_ECHO */
128 default:
129 goto just_echo; /* XXX */
130 }
131 }
132 }
133
134 just_echo:
135
136 clearerr (stdout); /* clear error before writing and testing success */
137
138 while (list)
139 {
140 i = len = 0;
141 temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
142 : list->word->word;
143 if (temp)
144 {
145 if (do_v9)
146 {
147 for (s = temp; len > 0; len--)
148 putchar (*s++);
149 }
150 else
151 printf ("%s", temp);
152 #if defined (SunOS5)
153 fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */
154 #endif
155 }
156 if (do_v9 && temp)
157 free (temp);
158 list = list->next;
159 if (i)
160 {
161 display_return = 0;
162 break;
163 }
164 if (list)
165 putchar(' ');
166 }
167
168 if (display_return)
169 putchar ('\n');
170 fflush (stdout);
171 if (ferror (stdout))
172 {
173 clearerr (stdout);
174 return (EXECUTION_FAILURE);
175 }
176 return (EXECUTION_SUCCESS);
177 }