1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
28
29
30
31 /*
32 * UNIX shell
33 */
34 #include "defs.h"
35
36 #define exit(a) flushb(); return (a)
37
38 extern int exitval;
39
40 int
echo(int argc,unsigned char ** argv)41 echo(int argc, unsigned char **argv)
42 {
43 unsigned char *cp;
44 int i, wd;
45 int nflg = 0;
46 int j;
47 int len;
48 wchar_t wc;
49
50 if (ucb_builtins) {
51
52 nflg = 0;
53 if (argc > 1 && argv[1][0] == '-' &&
54 argv[1][1] == 'n' && !argv[1][2]) {
55 nflg++;
56 argc--;
57 argv++;
58 }
59
60 for (i = 1; i < argc; i++) {
61 sigchk();
62
63 for (cp = argv[i]; *cp; cp++) {
64 prc_buff(*cp);
65 }
66
67 if (i < argc-1)
68 prc_buff(' ');
69 }
70
71 if (nflg == 0)
72 prc_buff('\n');
73 exit(0);
74 } else {
75 if (--argc == 0) {
76 prc_buff('\n');
77 exit(0);
78 }
79
80 for (i = 1; i <= argc; i++) {
81 sigchk();
82 for (cp = argv[i]; *cp; cp++) {
83 if ((len = mbtowc(&wc, (char *)cp,
84 MB_LEN_MAX)) <= 0) {
85 prc_buff(*cp);
86 continue;
87 }
88
89 if (wc == '\\') {
90 switch (*++cp) {
91 case 'b':
92 prc_buff('\b');
93 continue;
94 case 'c':
95 exit(0);
96
97 case 'f':
98 prc_buff('\f');
99 continue;
100
101 case 'n':
102 prc_buff('\n');
103 continue;
104
105 case 'r':
106 prc_buff('\r');
107 continue;
108
109 case 't':
110 prc_buff('\t');
111 continue;
112
113 case 'v':
114 prc_buff('\v');
115 continue;
116
117 case '\\':
118 prc_buff('\\');
119 continue;
120 case '0':
121 j = wd = 0;
122 while ((*++cp >= '0' &&
123 *cp <= '7') && j++ < 3) {
124 wd <<= 3;
125 wd |= (*cp - '0');
126 }
127 prc_buff(wd);
128 --cp;
129 continue;
130
131 default:
132 cp--;
133 }
134 prc_buff(*cp);
135 continue;
136 } else {
137 for (; len > 0; len--)
138 prc_buff(*cp++);
139 cp--;
140 continue;
141 }
142 }
143 prc_buff(i == argc? '\n': ' ');
144 }
145 exit(0);
146 }
147 }
148