xref: /illumos-gate/usr/src/cmd/sh/echo.c (revision 4f5c01f9a280183d32b11a58cc2701be45f1a8aa)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 
23 /*
24  * Copyright 1996 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27 
28 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
29 /*	  All Rights Reserved  	*/
30 
31 
32 #pragma ident	"%Z%%M%	%I%	%E% SMI"
33 
34 /*
35  *	UNIX shell
36  */
37 #include	"defs.h"
38 
39 #define	exit(a)	flushb(); return (a)
40 
41 extern int exitval;
42 
43 int
44 echo(int argc, unsigned char **argv)
45 {
46 	unsigned char	*cp;
47 	int	i, wd;
48 	int	nflg = 0;
49 	int	j;
50 	int	len;
51 	wchar_t	wc;
52 
53 #ifdef	_iBCS2		/* SCO compatibility support */
54 	struct namnod   *sysv3;
55 	int	do_sysv3 = 0;
56 
57 	sysv3 = findnam("SYSV3");
58 	if (sysv3 && (sysv3->namflg & (N_EXPORT | N_ENVNAM)))
59 		do_sysv3 = 1;
60 
61 	/* Do the -n parsing if sysv3 is set or if ucb_builtsin is set */
62 	if (ucb_builtins && !do_sysv3) {
63 #else
64 	if (ucb_builtins) {
65 #endif /* _iBCS2 */
66 
67 		nflg = 0;
68 		if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n') {
69 			nflg++;
70 			argc--;
71 			argv++;
72 		}
73 
74 		for (i = 1; i < argc; i++) {
75 			sigchk();
76 
77 			for (cp = argv[i]; *cp; cp++) {
78 				prc_buff(*cp);
79 			}
80 
81 			if (i < argc-1)
82 				prc_buff(' ');
83 		}
84 
85 		if (nflg == 0)
86 			prc_buff('\n');
87 		exit(0);
88 	} else {
89 		if (--argc == 0) {
90 			prc_buff('\n');
91 			exit(0);
92 		}
93 #ifdef  _iBCS2
94 		if (do_sysv3) {
95 			if (argc > 1 && argv[1][0] == '-' &&
96 					argv[1][1] == 'n') {
97 				nflg++;
98 				/* Step past the -n */
99 				argc--;
100 				argv++;
101 			}
102 		}
103 #endif /* _iBCS2 */
104 
105 		for (i = 1; i <= argc; i++) {
106 			sigchk();
107 			for (cp = argv[i]; *cp; cp++) {
108 				if ((len = mbtowc(&wc, (char *)cp,
109 						MB_LEN_MAX)) <= 0) {
110 					prc_buff(*cp);
111 					continue;
112 				}
113 
114 				if (wc == '\\') {
115 					switch (*++cp) {
116 					case 'b':
117 						prc_buff('\b');
118 						continue;
119 					case 'c':
120 						exit(0);
121 
122 					case 'f':
123 						prc_buff('\f');
124 						continue;
125 
126 					case 'n':
127 						prc_buff('\n');
128 						continue;
129 
130 					case 'r':
131 						prc_buff('\r');
132 						continue;
133 
134 					case 't':
135 						prc_buff('\t');
136 						continue;
137 
138 					case 'v':
139 						prc_buff('\v');
140 						continue;
141 
142 					case '\\':
143 						prc_buff('\\');
144 						continue;
145 					case '0':
146 						j = wd = 0;
147 						while ((*++cp >= '0' &&
148 						*cp <= '7') && j++ < 3) {
149 							wd <<= 3;
150 							wd |= (*cp - '0');
151 						}
152 						prc_buff(wd);
153 						--cp;
154 						continue;
155 
156 					default:
157 						cp--;
158 					}
159 					prc_buff(*cp);
160 					continue;
161 				} else {
162 					for (; len > 0; len--)
163 						prc_buff(*cp++);
164 					cp--;
165 					continue;
166 				}
167 			}
168 #ifdef	_iBCS2
169 			/* Don't do if don't want newlines & out of args */
170 			if (!(nflg && i == argc))
171 #endif /* _iBCS2 */
172 				prc_buff(i == argc? '\n': ' ');
173 		}
174 		exit(0);
175 	}
176 }
177