xref: /illumos-gate/usr/src/cmd/sh/echo.c (revision 1007fd6fd24227460e77ce89f5ca85641a85a576)
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
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