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