diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Completion/Zsh/Command/_read | 1 | ||||
-rw-r--r-- | Doc/Zsh/builtins.yo | 8 | ||||
-rw-r--r-- | Src/builtin.c | 39 |
4 files changed, 42 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog index 331fceba5..2047d689a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-02-17 Oliver Kiddle <opk@zsh.org> + + * 18242: Src/builtin.c, Completion/Zsh/Command/_read, + Doc/Zsh/builtins.yo: add -d option to read for specifying + delimiter to terminate input instead of newline + 2003-02-14 Peter Stephenson <pws@csr.com> * 18243: Src/Zle/zle_main.c: On Solaris, poll the tty for diff --git a/Completion/Zsh/Command/_read b/Completion/Zsh/Command/_read index 46fdb2de6..acf356a44 100644 --- a/Completion/Zsh/Command/_read +++ b/Completion/Zsh/Command/_read @@ -11,6 +11,7 @@ _arguments -s -A "-*" -S \ '(-p -k -s -u -z)-q[read y or n character from terminal]' \ '(-q)-k+[specify number of characters to read]:: :_guard "[0-9]#" "number of characters"' \ '(-q -z)-t+[test if input is available before reading]:: :_guard "[0-9.]#" "timeout (seconds)"' \ + '(-q)-d[specify delimiter to terminate input instead of newline]:delimiter' \ '(-q -s -u -p -t)-z[read entry from editor buffer stack]' \ '(-E)-e[input read is echoed and not assigned]' \ '(-e)-E[input read is echoed]' \ diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo index 333fec64a..899bc96d8 100644 --- a/Doc/Zsh/builtins.yo +++ b/Doc/Zsh/builtins.yo @@ -824,8 +824,8 @@ contain symbolic links. alias(r)(fc -e -) findex(read) vindex(IFS, use of) -ifzman(xitem(tt(read) [ tt(-rszpqAclneE) ] [ tt(-t) [ var(num) ] ] [ tt(-k) [ var(num) ] ])) -item(ifnzman(tt(read) [ tt(-rszpqAclneE) ] [ tt(-t) [ var(num) ] ] [ tt(-k) [ var(num) ] ]) [ tt(-u)var(n) ] [ var(name)[tt(?)var(prompt)] ] [ var(name) ... ])( +ifzman(xitem(tt(read) [ tt(-rszpqAclneE) ] [ tt(-t) [ var(num) ] ] [ tt(-k) [ var(num) ] ] [ tt(-d) var(delim) ])) +item(ifnzman(tt(read) [ tt(-rszpqAclneE) ] [ tt(-t) [ var(num) ] ] [ tt(-k) [ var(num) ] ] [ tt(-d) var(delim) ]) [ tt(-u)var(n) ] [ var(name)[tt(?)var(prompt)] ] [ var(name) ... ])( vindex(REPLY, use of) vindex(reply, use of) Read one line and break it into fields using the characters @@ -899,6 +899,10 @@ Input is read from file descriptor var(n). item(tt(-p))( Input is read from the coprocess. ) +item(tt(-d) var(delim))( +Input is terminated by the first character of var(delim) instead of +by newline. +) item(tt(-t) [ var(num) ])( Test if input is available before attempting to read. If var(num) is present, it must begin with a digit and will be evaluated diff --git a/Src/builtin.c b/Src/builtin.c index 09e0805ce..3c07ee59a 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -106,7 +106,7 @@ static struct builtin builtins[] = BUILTIN("pushln", BINF_PRINTOPTS, bin_print, 0, -1, BIN_PRINT, NULL, "-nz"), BUILTIN("pwd", 0, bin_pwd, 0, 0, 0, "rLP", NULL), BUILTIN("r", 0, bin_fc, 0, -1, BIN_R, "nrl", NULL), - BUILTIN("read", 0, bin_read, 0, -1, 0, "cek:%lnpqrst:%zu:AE", NULL), + BUILTIN("read", 0, bin_read, 0, -1, 0, "cd:ek:%lnpqrst:%zu:AE", NULL), BUILTIN("readonly", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%lptux", "r"), BUILTIN("rehash", 0, bin_hash, 0, 0, 0, "df", "r"), BUILTIN("return", BINF_PSPECIAL, bin_break, 0, 1, BIN_RETURN, NULL, NULL), @@ -4120,9 +4120,9 @@ bin_read(char *name, char **args, Options ops, int func) int readchar = -1, val, resettty = 0; struct ttyinfo saveti; char d; + char delim = '\n'; - - if ((OPT_HASARG(ops,c='k') || OPT_HASARG(ops,c='b'))) { + if (OPT_HASARG(ops,c='k')) { char *eptr, *optarg = OPT_ARG(ops,c); nchars = (int)zstrtol(optarg, &eptr, 10); if (*eptr) { @@ -4223,17 +4223,36 @@ bin_read(char *name, char **args, Options ops, int func) return 1; } } + if (OPT_ISSET(ops,'d')) { + delim = *OPT_ARG(ops,'d'); + if (SHTTY != -1) { + struct ttyinfo ti; + gettyinfo(&ti); + saveti = ti; + resettty = 1; +#ifdef HAS_TIO + ti.tio.c_lflag &= ~ICANON; + ti.tio.c_cc[VMIN] = 1; + ti.tio.c_cc[VTIME] = 0; +#else + ti.sgttyb.sg_flags |= CBREAK; +#endif + settyinfo(&ti); + } + } if (OPT_ISSET(ops,'s') && SHTTY != -1) { struct ttyinfo ti; gettyinfo(&ti); - saveti = ti; + if (! resettty) { + saveti = ti; + resettty = 1; + } #ifdef HAS_TIO ti.tio.c_lflag &= ~ECHO; #else ti.sgttyb.sg_flags &= ~ECHO; #endif settyinfo(&ti); - resettty = 1; } /* handle prompt */ @@ -4352,11 +4371,11 @@ bin_read(char *name, char **args, Options ops, int func) c = zread(izle, &readchar); /* \ at the end of a line indicates a continuation * * line, except in raw mode (-r option) */ - if (bslash && c == '\n') { + if (bslash && c == delim) { bslash = 0; continue; } - if (c == EOF || c == '\n') + if (c == EOF || c == delim) break; /* * `first' is non-zero if any separator we encounter is a @@ -4393,7 +4412,7 @@ bin_read(char *name, char **args, Options ops, int func) } } signal_setmask(s); - if (c == '\n' || c == EOF) + if (c == delim || c == EOF) gotnl = 1; *bptr = '\0'; /* dispose of word appropriately */ @@ -4455,11 +4474,11 @@ bin_read(char *name, char **args, Options ops, int func) c = zread(izle, &readchar); /* \ at the end of a line introduces a continuation line, except in raw mode (-r option) */ - if (bslash && c == '\n') { + if (bslash && c == delim) { bslash = 0; continue; } - if (c == EOF || (c == '\n' && !zbuf)) + if (c == EOF || (c == delim && !zbuf)) break; if (!bslash && isep(c) && bptr == buf) { if (iwsep(c)) |