implement print -N: set output word and line separator to NUL

This commit is contained in:
tg
2016-11-11 19:18:40 +00:00
parent 8c2eda2f0f
commit 6a9dae2144

37
funcs.c
View File

@ -38,7 +38,7 @@
#endif #endif
#endif #endif
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.311 2016/11/11 19:12:52 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.312 2016/11/11 19:18:40 tg Exp $");
#if HAVE_KILLPG #if HAVE_KILLPG
/* /*
@ -292,9 +292,9 @@ c_print(const char **wp)
/* temporary storage for a multibyte character */ /* temporary storage for a multibyte character */
char ts[4]; char ts[4];
/* output word separator */ /* output word separator */
char ows; char ws;
/* print trailing newline? */ /* output line separator ('!' to not print any) */
bool nl; char nl;
/* expand backslash sequences? */ /* expand backslash sequences? */
bool exp; bool exp;
/* print to history instead of file descriptor / stdout? */ /* print to history instead of file descriptor / stdout? */
@ -309,8 +309,8 @@ c_print(const char **wp)
} po; } po;
po.fd = 1; po.fd = 1;
po.ows = ' '; po.ws = ' ';
po.nl = true; po.nl = '\n';
po.exp = true; po.exp = true;
po.hist = false; po.hist = false;
po.chars = false; po.chars = false;
@ -336,13 +336,14 @@ c_print(const char **wp)
/* Debian Policy 10.4 compliant "echo" builtin */ /* Debian Policy 10.4 compliant "echo" builtin */
if (*wp && !strcmp(*wp, "-n")) { if (*wp && !strcmp(*wp, "-n")) {
/* recognise "-n" only as the first arg */ /* recognise "-n" only as the first arg */
po.nl = false; po.nl = '!';
++wp; ++wp;
} }
/* print everything as-is */ /* print everything as-is */
po.exp = false; po.exp = false;
} else { } else {
bool new_exp = po.exp, new_nl = po.nl; bool new_exp = po.exp;
char new_nl = po.nl;
/** /**
* a compromise between sysV and BSD echo commands: * a compromise between sysV and BSD echo commands:
@ -366,7 +367,7 @@ c_print(const char **wp)
new_exp = true; new_exp = true;
goto print_tradparse_ch; goto print_tradparse_ch;
case 'n': case 'n':
new_nl = false; new_nl = '!';
goto print_tradparse_ch; goto print_tradparse_ch;
case '\0': case '\0':
po.exp = new_exp; po.exp = new_exp;
@ -378,7 +379,7 @@ c_print(const char **wp)
} }
} else { } else {
/* "print" builtin */ /* "print" builtin */
const char *opts = "AlnpRrsu,"; const char *opts = "AlNnpRrsu,";
const char *emsg; const char *emsg;
po.pminusminus = false; po.pminusminus = false;
@ -392,10 +393,14 @@ c_print(const char **wp)
po.exp = true; po.exp = true;
break; break;
case 'l': case 'l':
po.ows = '\n'; po.ws = '\n';
break;
case 'N':
po.ws = '\0';
po.nl = '\0';
break; break;
case 'n': case 'n':
po.nl = false; po.nl = '!';
break; break;
case 'p': case 'p':
if ((po.fd = coproc_getfd(W_OK, &emsg)) < 0) { if ((po.fd = coproc_getfd(W_OK, &emsg)) < 0) {
@ -471,7 +476,7 @@ c_print(const char **wp)
/* rejected by generic function */ /* rejected by generic function */
switch ((c = *s++)) { switch ((c = *s++)) {
case 'c': case 'c':
po.nl = false; po.nl = '!';
/* AT&T brain damage */ /* AT&T brain damage */
continue; continue;
case '\0': case '\0':
@ -495,12 +500,12 @@ c_print(const char **wp)
} }
} }
if (*wp != NULL) { if (*wp != NULL) {
Xput(xs, xp, po.ows); Xput(xs, xp, po.ws);
goto print_read_arg; goto print_read_arg;
} }
print_no_arg: print_no_arg:
if (po.nl) if (po.nl != '!')
Xput(xs, xp, '\n'); Xput(xs, xp, po.nl);
c = 0; c = 0;
if (po.hist) { if (po.hist) {