diff options
author | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
---|---|---|
committer | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
commit | 5fd83771641d15c418f747bd343ba6738d3875f7 (patch) | |
tree | 5abf0f78f680d9837dbd93d4d4c3933bb7509599 /shell_cmds/echo | |
download | apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.gz apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.zst apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.zip |
Import macOS userland
adv_cmds-176
basic_cmds-55
bootstrap_cmds-116.100.1
developer_cmds-66
diskdev_cmds-667.40.1
doc_cmds-53.60.1
file_cmds-321.40.3
mail_cmds-35
misc_cmds-34
network_cmds-606.40.1
patch_cmds-17
remote_cmds-63
shell_cmds-216.60.1
system_cmds-880.60.2
text_cmds-106
Diffstat (limited to 'shell_cmds/echo')
-rw-r--r-- | shell_cmds/echo/echo.1 | 101 | ||||
-rw-r--r-- | shell_cmds/echo/echo.c | 182 |
2 files changed, 283 insertions, 0 deletions
diff --git a/shell_cmds/echo/echo.1 b/shell_cmds/echo/echo.1 new file mode 100644 index 0000000..87bcc34 --- /dev/null +++ b/shell_cmds/echo/echo.1 @@ -0,0 +1,101 @@ +.\"- +.\" Copyright (c) 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)echo.1 8.1 (Berkeley) 7/22/93 +.\" $FreeBSD: src/bin/echo/echo.1,v 1.19 2005/01/16 16:41:56 ru Exp $ +.\" +.Dd April 12, 2003 +.Dt ECHO 1 +.Os +.Sh NAME +.Nm echo +.Nd write arguments to the standard output +.Sh SYNOPSIS +.Nm +.Op Fl n +.Op Ar string ... +.Sh DESCRIPTION +The +.Nm +utility writes any specified operands, separated by single blank +.Pq Ql "\ " +characters and followed by a newline +.Pq Ql \en +character, to the standard +output. +.Pp +The following option is available: +.Bl -tag -width flag +.It Fl n +Do not print the trailing newline character. +This may also be achieved by appending +.Ql \ec +to the end of the string, as is done +by iBCS2 compatible systems. +Note that this option as well as the effect of +.Ql \ec +are implementation-defined in +.St -p1003.1-2001 +as amended by Cor.\& 1-2002. +Applications aiming for maximum +portability are strongly encouraged to use +.Xr printf 1 +to suppress the newline character. +.El +.Pp +Some shells may provide a builtin +.Nm +command which is similar or identical to this utility. +.\" 4874742 +Most notably, the builtin +.Nm +in +.Xr sh 1 +does not accept the +.Fl n +option. +.\" 4874742 +Consult the +.Xr builtin 1 +manual page. +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Xr builtin 1 , +.Xr csh 1 , +.Xr printf 1 , +.Xr sh 1 +.Sh STANDARDS +The +.Nm +utility conforms to +.St -p1003.1-2001 +as amended by Cor.\& 1-2002. diff --git a/shell_cmds/echo/echo.c b/shell_cmds/echo/echo.c new file mode 100644 index 0000000..a994e6d --- /dev/null +++ b/shell_cmds/echo/echo.c @@ -0,0 +1,182 @@ +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +#ifndef lint +static char const copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)echo.c 8.1 (Berkeley) 5/31/93"; +#endif /* not lint */ +#endif +#include <sys/cdefs.h> +__FBSDID("$FreeBSD: src/bin/echo/echo.c,v 1.18 2005/01/10 08:39:22 imp Exp $"); + +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +static void +flush_and_exit(void) +{ + if (fflush(stdout) != 0) + err(1, "fflush"); + exit(0); +} + +static char * +print_one_char(char *cur, int posix, int *bytes_len_out) +{ + char *next; + wchar_t wc; + int bytes_len = mbtowc(&wc, cur, MB_CUR_MAX); + if (bytes_len <= 0) { + putchar(*cur); + bytes_len = 1; + goto out; + } + + /* If this is not an escape sequence, just print the character */ + if (wc != '\\') { + putwchar(wc); + goto out; + } + + next = cur + bytes_len; + + if (!posix) { + /* In non-POSIX mode, the only valid escape sequence is \c */ + if (*next == 'c') { + flush_and_exit(); + } else { + putchar(wc); + goto out; + } + } else { + cur = next; + bytes_len = 1; + } + + switch (*cur) { + case 'a': + putchar('\a'); + goto out; + + case 'b': + putchar('\b'); + goto out; + + case 'c': + flush_and_exit(); + + case 'f': + putchar('\f'); + goto out; + + case 'n': + putchar('\n'); + goto out; + + case 'r': + putchar('\r'); + goto out; + + case 't': + putchar('\t'); + goto out; + + case 'v': + putchar('\v'); + goto out; + + case '\\': + putchar('\\'); + goto out; + + case '0': { + int j = 0, num = 0; + while ((*++cur >= '0' && *cur <= '7') && + j++ < 3) { + num <<= 3; + num |= (*cur - '0'); + } + putchar(num); + --cur; + goto out; + } + default: + --cur; + putchar(*cur); + goto out; + } + + out: + if (bytes_len_out) + *bytes_len_out = bytes_len; + return cur; +} + +int +main(int argc, char *argv[]) +{ + int nflag = 0; + int posix = (getenv("POSIXLY_CORRECT") != NULL || getenv("POSIX_PEDANTIC") != NULL); + + if (!posix && argv[1] && strcmp(argv[1], "-n") == 0) + nflag = 1; + + for (int i = 0; i < argc; i++) { + /* argv[0] == progname */ + int ignore_arg = (i == 0 || (i == 1 && nflag == 1)); + int last_arg = (i == (argc - 1)); + if (!ignore_arg) { + char *cur = argv[i]; + size_t arg_len = strlen(cur); + int bytes_len = 0; + + for (const char *end = cur + arg_len; cur < end; cur += bytes_len) { + cur = print_one_char(cur, posix, &bytes_len); + } + } + if (last_arg && !nflag) + putchar('\n'); + else if (!last_arg && !ignore_arg) + putchar(' '); + + if (fflush(stdout) != 0) + err(1, "fflush"); + } + + return 0; +} |