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