summaryrefslogtreecommitdiff
path: root/usr/src/cmd/sh/echo.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/sh/echo.c')
-rw-r--r--usr/src/cmd/sh/echo.c174
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);
+ }
+}