~ubuntu-branches/ubuntu/trusty/bash/trusty-security

« back to all changes in this revision

Viewing changes to builtins/echo.def

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2014-03-03 22:52:05 UTC
  • mfrom: (1.3.5) (2.2.6 experimental)
  • Revision ID: package-import@ubuntu.com-20140303225205-87ltrt5kspeq0g1b
Tags: 4.3-1ubuntu1
* Merge with Debian; remaining changes:
  - skel.bashrc:
    - Run lesspipe.
    - Enable ls aliases.
    - Set options in ll alias to -alF.
    - Define an alert alias.
    - Enabled colored grep aliases.
  - etc.bash.bashrc:
    - Add sudo hint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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-2009 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
 
9
it under the terms of the GNU General Public License as published by
 
10
the Free Software Foundation, either version 3 of the License, or
 
11
(at your option) any later version.
 
12
 
 
13
Bash 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
 
16
GNU General Public License for more details.
 
17
 
 
18
You should have received a copy of the GNU General Public License
 
19
along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
20
 
 
21
$PRODUCES echo.c
 
22
#include <config.h>
 
23
 
 
24
#if defined (HAVE_UNISTD_H)
 
25
#  include <unistd.h>
 
26
#endif
 
27
 
 
28
#include "../bashansi.h"
 
29
 
 
30
#include <stdio.h>
 
31
#include "../shell.h"
 
32
 
 
33
#include "common.h"
 
34
 
 
35
$BUILTIN echo
 
36
$FUNCTION echo_builtin
 
37
$DEPENDS_ON V9_ECHO
 
38
$SHORT_DOC echo [-neE] [arg ...]
 
39
Write arguments to the standard output.
 
40
 
 
41
Display the ARGs, separated by a single space character and followed by a
 
42
newline, on the standard output.
 
43
 
 
44
Options:
 
45
  -n    do not append a newline
 
46
  -e    enable interpretation of the following backslash escapes
 
47
  -E    explicitly suppress interpretation of backslash escapes
 
48
 
 
49
`echo' interprets the following backslash-escaped characters:
 
50
  \a    alert (bell)
 
51
  \b    backspace
 
52
  \c    suppress further output
 
53
  \e    escape character
 
54
  \E    escape character
 
55
  \f    form feed
 
56
  \n    new line
 
57
  \r    carriage return
 
58
  \t    horizontal tab
 
59
  \v    vertical tab
 
60
  \\    backslash
 
61
  \0nnn the character whose ASCII code is NNN (octal).  NNN can be
 
62
        0 to 3 octal digits
 
63
  \xHH  the eight-bit character whose value is HH (hexadecimal).  HH
 
64
        can be one or two hex digits
 
65
 
 
66
Exit Status:
 
67
Returns success unless a write error occurs.
 
68
$END
 
69
 
 
70
$BUILTIN echo
 
71
$FUNCTION echo_builtin
 
72
$DEPENDS_ON !V9_ECHO
 
73
$SHORT_DOC echo [-n] [arg ...]
 
74
Write arguments to the standard output.
 
75
 
 
76
Display the ARGs on the standard output followed by a newline.
 
77
 
 
78
Options:
 
79
  -n    do not append a newline
 
80
 
 
81
Exit Status:
 
82
Returns success unless a write error occurs.
 
83
$END
 
84
 
 
85
#if defined (V9_ECHO)
 
86
#  define VALID_ECHO_OPTIONS "neE"
 
87
#else /* !V9_ECHO */
 
88
#  define VALID_ECHO_OPTIONS "n"
 
89
#endif /* !V9_ECHO */
 
90
 
 
91
/* System V machines already have a /bin/sh with a v9 behaviour.  We
 
92
   give Bash the identical behaviour for these machines so that the
 
93
   existing system shells won't barf.  Regrettably, the SUS v2 has
 
94
   standardized the Sys V echo behavior.  This variable is external
 
95
   so that we can have a `shopt' variable to control it at runtime. */
 
96
#if defined (DEFAULT_ECHO_TO_XPG) || defined (STRICT_POSIX)
 
97
int xpg_echo = 1;
 
98
#else
 
99
int xpg_echo = 0;
 
100
#endif /* DEFAULT_ECHO_TO_XPG */
 
101
 
 
102
extern int posixly_correct;
 
103
 
 
104
/* Print the words in LIST to standard output.  If the first word is
 
105
   `-n', then don't print a trailing newline.  We also support the
 
106
   echo syntax from Version 9 Unix systems. */
 
107
int
 
108
echo_builtin (list)
 
109
     WORD_LIST *list;
 
110
{
 
111
  int display_return, do_v9, i, len;
 
112
  char *temp, *s;
 
113
 
 
114
  do_v9 = xpg_echo;
 
115
  display_return = 1;
 
116
 
 
117
  if (posixly_correct && xpg_echo)
 
118
    goto just_echo;
 
119
 
 
120
  for (; list && (temp = list->word->word) && *temp == '-'; list = list->next)
 
121
    {
 
122
      /* If it appears that we are handling options, then make sure that
 
123
         all of the options specified are actually valid.  Otherwise, the
 
124
         string should just be echoed. */
 
125
      temp++;
 
126
 
 
127
      for (i = 0; temp[i]; i++)
 
128
        {
 
129
          if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
 
130
            break;
 
131
        }
 
132
 
 
133
      /* echo - and echo -<nonopt> both mean to just echo the arguments. */
 
134
      if (*temp == 0 || temp[i])
 
135
        break;
 
136
 
 
137
      /* All of the options in TEMP are valid options to ECHO.
 
138
         Handle them. */
 
139
      while (i = *temp++)
 
140
        {
 
141
          switch (i)
 
142
            {
 
143
            case 'n':
 
144
              display_return = 0;
 
145
              break;
 
146
#if defined (V9_ECHO)
 
147
            case 'e':
 
148
              do_v9 = 1;
 
149
              break;
 
150
            case 'E':
 
151
              do_v9 = 0;
 
152
              break;
 
153
#endif /* V9_ECHO */
 
154
            default:
 
155
              goto just_echo;   /* XXX */
 
156
            }
 
157
        }
 
158
    }
 
159
 
 
160
just_echo:
 
161
 
 
162
  clearerr (stdout);    /* clear error before writing and testing success */
 
163
 
 
164
  terminate_immediately++;
 
165
  while (list)
 
166
    {
 
167
      i = len = 0;
 
168
      temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
 
169
                   : list->word->word;
 
170
      if (temp)
 
171
        {
 
172
          if (do_v9)
 
173
            {
 
174
              for (s = temp; len > 0; len--)
 
175
                putchar (*s++);
 
176
            }
 
177
          else      
 
178
            printf ("%s", temp);
 
179
#if defined (SunOS5)
 
180
          fflush (stdout);      /* Fix for bug in SunOS 5.5 printf(3) */
 
181
#endif
 
182
        }
 
183
      if (do_v9 && temp)
 
184
        free (temp);
 
185
      list = list->next;
 
186
      if (i)
 
187
        {
 
188
          display_return = 0;
 
189
          break;
 
190
        }
 
191
      if (list)
 
192
        putchar(' ');
 
193
    }
 
194
 
 
195
  if (display_return)
 
196
    putchar ('\n');
 
197
 
 
198
  terminate_immediately--;
 
199
  return (sh_chkwrite (EXECUTION_SUCCESS));
 
200
}