#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
#ifndef lint
static char sccsid[] = "@(#)echo.c 8.1 (Berkeley) 5/31/93";
#endif
#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 char *
print_one_char(char *cur, int *bytes_len_out)
{
wchar_t wc;
int bytes_len = mbtowc(&wc, cur, MB_CUR_MAX);
if (bytes_len <= 0) {
putchar(*cur);
bytes_len = 1;
goto out;
}
if (wc != '\\') {
putwchar(wc);
goto out;
}
cur += bytes_len;
bytes_len = 1;
switch (*cur) {
case 'a':
putchar('\a');
goto out;
case 'b':
putchar('\b');
goto out;
case 'c':
if (fflush(stdout) != 0)
err(1, "fflush");
exit(0);
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++) {
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, &bytes_len);
}
}
if (last_arg && !nflag)
putchar('\n');
else if (!last_arg && !ignore_arg)
putchar(' ');
if (fflush(stdout) != 0)
err(1, "fflush");
}
return 0;
}