53 lines
863 B
C
53 lines
863 B
C
/* vi: set sw=4 ts=4: */
|
|
/*
|
|
* echo.c - echo supporting -n and -e.
|
|
*/
|
|
|
|
#include "toys.h"
|
|
|
|
int echo_main(void)
|
|
{
|
|
int i = 0;
|
|
char *arg, *from = "\\abfnrtv", *to = "\\\a\b\f\n\r\t\v";
|
|
|
|
for (;;) {
|
|
arg = toys.optargs[i];
|
|
if (!arg) break;
|
|
if (i++) xputc(' ');
|
|
|
|
// Handle -e
|
|
|
|
if (toys.optflags&2) {
|
|
int c, j = 0;
|
|
for (;;) {
|
|
c = arg[j++];
|
|
if (!c) break;
|
|
if (c == '\\') {
|
|
char *found;
|
|
int d = arg[j++];
|
|
|
|
// handle \escapes
|
|
|
|
if (d) {
|
|
found = strchr(from, d);
|
|
if (found) c = to[found-from];
|
|
else if (d == 'c') goto done;
|
|
else if (d == '0') {
|
|
c = 0;
|
|
while (arg[j]>='0' && arg[j]<='7')
|
|
c = (c*8)+arg[j++]-'0';
|
|
}
|
|
}
|
|
}
|
|
xputc(c);
|
|
}
|
|
} else xprintf("%s", arg);
|
|
}
|
|
|
|
// Output "\n" if no -n
|
|
if (!(toys.optflags&1)) xputc('\n');
|
|
done:
|
|
xflush();
|
|
return 0;
|
|
}
|