Apply the BSD echo version submitted by Jonas Holmberg <jonas.holmberg@axis.com>
[oweals/busybox.git] / echo.c
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
25 #include "busybox.h"
26 #include <stdio.h>
27
28 extern int 
29 echo_main(int argc, char** argv)
30 {
31         int nflag = 0;
32         int eflag = 0;
33
34         /* Skip argv[0]. */
35         argc--;
36         argv++;
37
38         while (argc > 0 && *argv[0] == '-')
39         {
40                 register char *temp;
41                 register int index;
42
43                 /*
44                  * If it appears that we are handling options, then make sure
45                  * that all of the options specified are actually valid.
46                  * Otherwise, the string should just be echoed.
47                  */
48                 temp = argv[0] + 1;
49
50                 for (index = 0; temp[index]; index++)
51                 {
52                         if (strrchr("neE", temp[index]) == 0)
53                                 goto just_echo;
54                 }
55
56                 if (!*temp)
57                         goto just_echo;
58
59                 /*
60                  * All of the options in temp are valid options to echo.
61                  * Handle them.
62                  */
63                 while (*temp)
64                 {
65                         if (*temp == 'n')
66                                 nflag = 1;
67                         else if (*temp == 'e')
68                                 eflag = 1;
69                         else if (*temp == 'E')
70                                 eflag = 0;
71                         else
72                                 goto just_echo;
73
74                         temp++;
75                 }
76                 argc--;
77                 argv++;
78         }
79
80 just_echo:
81         while (argc > 0) {
82                 char *arg = argv[0];
83                 register int c;
84
85                 while ((c = *arg++)) {
86
87                         /* Check for escape sequence. */
88                         if (c == '\\' && eflag && *arg) {
89                                 if (*arg == 'c') {
90                                         /* '\c' means cancel newline. */
91                                         nflag = 1;
92                                         arg++;
93                                         continue;
94                                 } else {
95                                         c = process_escape_sequence(&arg);
96                                 }
97                         }
98
99                         putchar(c);
100                 }
101                 argc--;
102                 argv++;
103                 if (argc > 0)
104                         putchar(' ');
105         }
106         if (!nflag)
107                 putchar('\n');
108         fflush(stdout);
109
110         return 0;
111 }
112
113 /*-
114  * Copyright (c) 1991, 1993
115  *      The Regents of the University of California.  All rights reserved.
116  *
117  * This code is derived from software contributed to Berkeley by
118  * Kenneth Almquist.
119  *
120  * Redistribution and use in source and binary forms, with or without
121  * modification, are permitted provided that the following conditions
122  * are met:
123  * 1. Redistributions of source code must retain the above copyright
124  *    notice, this list of conditions and the following disclaimer.
125  * 2. Redistributions in binary form must reproduce the above copyright
126  *    notice, this list of conditions and the following disclaimer in the
127  *    documentation and/or other materials provided with the distribution.
128  *
129  * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change 
130  *              ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> 
131  *
132  *      California, Berkeley and its contributors.
133  * 4. Neither the name of the University nor the names of its contributors
134  *    may be used to endorse or promote products derived from this software
135  *    without specific prior written permission.
136  *
137  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
138  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
139  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
140  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
141  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
142  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
143  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
144  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
145  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
146  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
147  * SUCH DAMAGE.
148  *
149  *      @(#)echo.c      8.1 (Berkeley) 5/31/93
150  */