xref: /titanic_52/usr/src/cmd/echo/echo.c (revision cc22b130832529204c03214239a57aaadd05101f)
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   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
23   */
24  
25  /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
26  /*	  All Rights Reserved  	*/
27  
28  
29  #include <stdio.h>
30  #include <stdlib.h>
31  #include <wchar.h>
32  #include <string.h>
33  #include <locale.h>
34  
35  int
36  main(int argc, char *argv[])
37  {
38  
39  	register char	*cp;
40  	register int	i, wd;
41  	int	j;
42  	wchar_t		wc;
43  	int		b_len;
44  	char		*ep;
45  
46  	(void) setlocale(LC_ALL, "");
47  
48  	if (--argc == 0) {
49  		(void) putchar('\n');
50  		if (fflush(stdout) != 0)
51  			return (1);
52  		return (0);
53  	}
54  
55  	for (i = 1; i <= argc; i++) {
56  		for (cp = argv[i], ep = cp + (int)strlen(cp);
57  		    cp < ep; cp += b_len) {
58  		if ((b_len = mbtowc(&wc, cp, MB_CUR_MAX)) <= 0) {
59  			(void) putchar(*cp);
60  			b_len = 1;
61  			continue;
62  		}
63  
64  		if (wc != '\\') {
65  			(void) putwchar(wc);
66  			continue;
67  		}
68  
69  			cp += b_len;
70  			b_len = 1;
71  			switch (*cp) {
72  				case 'a':	/* alert - XCU4 */
73  					(void) putchar('\a');
74  					continue;
75  
76  				case 'b':
77  					(void) putchar('\b');
78  					continue;
79  
80  				case 'c':
81  					if (fflush(stdout) != 0)
82  						return (1);
83  					return (0);
84  
85  				case 'f':
86  					(void) putchar('\f');
87  					continue;
88  
89  				case 'n':
90  					(void) putchar('\n');
91  					continue;
92  
93  				case 'r':
94  					(void) putchar('\r');
95  					continue;
96  
97  				case 't':
98  					(void) putchar('\t');
99  					continue;
100  
101  				case 'v':
102  					(void) putchar('\v');
103  					continue;
104  
105  				case '\\':
106  					(void) putchar('\\');
107  					continue;
108  				case '0':
109  					j = wd = 0;
110  					while ((*++cp >= '0' && *cp <= '7') &&
111  					    j++ < 3) {
112  						wd <<= 3;
113  						wd |= (*cp - '0');
114  					}
115  					(void) putchar(wd);
116  					--cp;
117  					continue;
118  
119  				default:
120  					cp--;
121  					(void) putchar(*cp);
122  			}
123  		}
124  		(void) putchar(i == argc? '\n': ' ');
125  		if (fflush(stdout) != 0)
126  			return (1);
127  	}
128  	return (0);
129  }
130