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
38extern int exitval;
39
40int
41echo(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