diff options
Diffstat (limited to 'usr/src/cmd/sh/echo.c')
| -rw-r--r-- | usr/src/cmd/sh/echo.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/usr/src/cmd/sh/echo.c b/usr/src/cmd/sh/echo.c new file mode 100644 index 0000000000..84d1836a82 --- /dev/null +++ b/usr/src/cmd/sh/echo.c @@ -0,0 +1,174 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + + +/* Portions Copyright (c) 1988, Sun Microsystems, Inc. */ +/* All Rights Reserved. */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * UNIX shell + */ +#include "defs.h" + +#define exit(a) flushb(); return (a) + +extern int exitval; + +echo(argc, argv) +unsigned char **argv; +{ + register unsigned char *cp; + register int i, wd; + int nflg = 0; + int j; + int len; + wchar_t wc; + +#ifdef _iBCS2 /* SCO compatibility support */ + struct namnod *sysv3; + int do_sysv3 = 0; + + sysv3 = findnam("SYSV3"); + if (sysv3 && (sysv3->namflg & (N_EXPORT | N_ENVNAM))) + do_sysv3 = 1; + + /* Do the -n parsing if sysv3 is set or if ucb_builtsin is set */ + if (ucb_builtins && !do_sysv3) { +#else + if (ucb_builtins) { +#endif /* _iBCS2 */ + + nflg = 0; + if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n') { + nflg++; + argc--; + argv++; + } + + for (i = 1; i < argc; i++) { + sigchk(); + + for (cp = argv[i]; *cp; cp++) { + prc_buff(*cp); + } + + if (i < argc-1) + prc_buff(' '); + } + + if (nflg == 0) + prc_buff('\n'); + exit(0); + } else { + if (--argc == 0) { + prc_buff('\n'); + exit(0); + } +#ifdef _iBCS2 + if (do_sysv3) { + if (argc > 1 && argv[1][0] == '-' && + argv[1][1] == 'n') { + nflg++; + /* Step past the -n */ + argc--; + argv++; + } + } +#endif /* _iBCS2 */ + + for (i = 1; i <= argc; i++) + { + sigchk(); + for (cp = argv[i]; *cp; cp++) { + if ((len = mbtowc(&wc, (char *)cp, + MB_LEN_MAX)) <= 0) { + prc_buff(*cp); + continue; + } + + if (wc == '\\') { + switch (*++cp) { + case 'b': + prc_buff('\b'); + continue; + case 'c': + exit(0); + + case 'f': + prc_buff('\f'); + continue; + + case 'n': + prc_buff('\n'); + continue; + + case 'r': + prc_buff('\r'); + continue; + + case 't': + prc_buff('\t'); + continue; + + case 'v': + prc_buff('\v'); + continue; + + case '\\': + prc_buff('\\'); + continue; + case '0': + j = wd = 0; + while ((*++cp >= '0' && + *cp <= '7') && j++ < 3) { + wd <<= 3; + wd |= (*cp - '0'); + } + prc_buff(wd); + --cp; + continue; + + default: + cp--; + } + prc_buff(*cp); + continue; + } else { + for (; len > 0; len--) + prc_buff(*cp++); + cp--; + continue; + } + } +#ifdef _iBCS2 + /* Don't do if don't want newlines & out of args */ + if (!(nflg && i == argc)) +#endif /* _iBCS2 */ + prc_buff(i == argc? '\n': ' '); + } + exit(0); + } +} |
