summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2008-02-18 03:18:03 +0000
committerBart Schaefer <barts@users.sourceforge.net>2008-02-18 03:18:03 +0000
commit5994edfc88a168e65e9b7b6b5a8ec214bed24b1c (patch)
treed3ecf5503d2477e0cc2f43e0fbb20e69f261477a
parent65520f1901cee7bcad2871d47f62df2bbeac0126 (diff)
downloadzsh-5994edfc88a168e65e9b7b6b5a8ec214bed24b1c.tar.gz
zsh-5994edfc88a168e65e9b7b6b5a8ec214bed24b1c.zip
zsh-users/12600: reorder handling of -s/-d/-t options so that terminal
input modes are set before attempting a read-poll. Also display any prompt before read-polling. Unposted: remove trailing whitespace from all lines that had it.
-rw-r--r--Src/builtin.c183
1 files changed, 93 insertions, 90 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 048d6c625..2002339e2 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -143,7 +143,7 @@ static struct builtin builtins[] =
/**/
mod_export HashTable builtintab;
-
+
/**/
void
createbuiltintable(void)
@@ -198,7 +198,7 @@ static void
freebuiltinnode(HashNode hn)
{
Builtin bn = (Builtin) hn;
-
+
if(!(bn->node.flags & BINF_ADDED)) {
zsfree(bn->node.nam);
zsfree(bn->optstr);
@@ -218,7 +218,7 @@ new_optarg(Options ops)
if (ops->argscount == 63)
return 1;
if (ops->argsalloc == ops->argscount) {
- char **newptr =
+ char **newptr =
(char **)zhalloc((ops->argsalloc + OPT_ALLOC_CHUNK) *
sizeof(char *));
if (ops->argsalloc)
@@ -361,7 +361,7 @@ execbuiltin(LinkList args, Builtin bn)
}
if (argptr) {
if (new_optarg(&ops)) {
- zwarnnam(name,
+ zwarnnam(name,
"too many option arguments");
return 1;
}
@@ -669,10 +669,10 @@ bin_pwd(UNUSED(char *name), UNUSED(char **argv), Options ops, UNUSED(int func))
}
/* the directory stack */
-
+
/**/
mod_export LinkList dirstack;
-
+
/* dirs: list the directory stack, or replace it with a provided list */
/**/
@@ -683,7 +683,7 @@ bin_dirs(UNUSED(char *name), char **argv, Options ops, UNUSED(int func))
queue_signals();
/* with -v, -p or no arguments display the directory stack */
- if (!(*argv || OPT_ISSET(ops,'c')) || OPT_ISSET(ops,'v') ||
+ if (!(*argv || OPT_ISSET(ops,'c')) || OPT_ISSET(ops,'v') ||
OPT_ISSET(ops,'p')) {
LinkNode node;
char *fmt;
@@ -779,7 +779,7 @@ bin_cd(char *nam, char **argv, Options ops, int func)
}
doprintdir = (doprintdir == -1);
- chasinglinks = OPT_ISSET(ops,'P') ||
+ chasinglinks = OPT_ISSET(ops,'P') ||
(isset(CHASELINKS) && !OPT_ISSET(ops,'L'));
queue_signals();
zpushnode(dirstack, ztrdup(pwd));
@@ -836,13 +836,13 @@ cd_get_dest(char *nam, char **argv, int hard, int func)
doprintdir++;
if (argv[0][1] && (argv[0][0] == '+' || argv[0][0] == '-')) {
- dd = zstrtol(argv[0] + 1, &end, 10);
+ dd = zstrtol(argv[0] + 1, &end, 10);
if (*end == '\0') {
if ((argv[0][0] == '+') ^ isset(PUSHDMINUS))
for (dir = firstnode(dirstack); dir && dd; dd--, incnode(dir));
else
for (dir = lastnode(dirstack); dir != (LinkNode) dirstack && dd;
- dd--, dir = prevnode(dir));
+ dd--, dir = prevnode(dir));
if (!dir || dir == (LinkNode) dirstack) {
zwarnnam(nam, "no such entry in dir stack");
return NULL;
@@ -1107,7 +1107,7 @@ cd_new_pwd(int func, LinkNode dir)
zsfree(s);
}
if (isset(PUSHDIGNOREDUPS)) {
- LinkNode n;
+ LinkNode n;
for (n = firstnode(dirstack); n; incnode(n)) {
if (!strcmp(new_pwd, getdata(n))) {
zsfree(remnode(dirstack, n));
@@ -1360,7 +1360,7 @@ bin_fc(char *nam, char **argv, Options ops, int func)
}
if (OPT_ISSET(ops,'A')) {
/* append history to a file */
- savehistfile(*argv, 1, HFILE_APPEND |
+ savehistfile(*argv, 1, HFILE_APPEND |
(OPT_ISSET(ops,'I') ? HFILE_SKIPOLD : 0));
unqueue_signals();
return 0;
@@ -1840,7 +1840,7 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
* may be special when it is loaded; we can't tell yet).
*/
if ((readonly =
- ((usepm || newspecial != NS_NONE) &&
+ ((usepm || newspecial != NS_NONE) &&
(off & pm->node.flags & PM_READONLY))) ||
tc) {
if (pm->node.flags & PM_SPECIAL) {
@@ -2091,7 +2091,7 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func),
"%s: array elements must be scalar", pname);
return NULL;
}
- }
+ }
/*
* As we can hide existing parameters, we allow a name if
* it's not a normal identifier but is one of the special
@@ -2274,7 +2274,7 @@ bin_typeset(char *name, char **argv, Options ops, int func)
return 0;
}
- if (!(OPT_ISSET(ops,'g') || OPT_ISSET(ops,'x') || OPT_ISSET(ops,'m')) ||
+ if (!(OPT_ISSET(ops,'g') || OPT_ISSET(ops,'x') || OPT_ISSET(ops,'m')) ||
OPT_PLUS(ops,'g') || *name == 'l' ||
(!isset(GLOBALEXPORT) && !OPT_ISSET(ops,'g')))
on |= PM_LOCAL;
@@ -2426,7 +2426,7 @@ bin_typeset(char *name, char **argv, Options ops, int func)
* Bad news: if the parameter gets altered, e.g. by
* a type conversion, then paramtab can be shifted around,
* so we need to store the parameters to alter on a separate
- * list for later use.
+ * list for later use.
*/
for (i = 0; i < paramtab->hsize; i++) {
for (pm = (Param) paramtab->nodes[i]; pm;
@@ -2485,7 +2485,7 @@ eval_autoload(Shfunc shf, char *name, Options ops, int func)
return bin_eval(name, fargv, ops, func);
}
- return !loadautofn(shf, (OPT_ISSET(ops,'k') ? 2 :
+ return !loadautofn(shf, (OPT_ISSET(ops,'k') ? 2 :
(OPT_ISSET(ops,'z') ? 0 : 1)), 1);
}
@@ -2780,7 +2780,7 @@ bin_functions(char *name, char **argv, Options ops, int func)
if (on|off) {
/* turn on/off the given flags */
shf->node.flags = (shf->node.flags | (on & ~PM_UNDEFINED)) & ~off;
- if (OPT_ISSET(ops,'X') &&
+ if (OPT_ISSET(ops,'X') &&
eval_autoload(shf, shf->node.nam, ops, func))
returnval = 1;
} else
@@ -3423,7 +3423,7 @@ bin_alias(char *name, char **argv, Options ops, UNUSED(int func))
} else if ((a = (Alias) ht->getnode(ht, asg->name))) {
/* display alias if appropriate */
if (!type_opts || ht == sufaliastab ||
- (OPT_ISSET(ops,'r') &&
+ (OPT_ISSET(ops,'r') &&
!(a->node.flags & (ALIAS_GLOBAL|ALIAS_SUFFIX))) ||
(OPT_ISSET(ops,'g') && (a->node.flags & ALIAS_GLOBAL)))
ht->printnode(&a->node, printflags);
@@ -3456,7 +3456,7 @@ bin_false(UNUSED(char *name), UNUSED(char **argv), UNUSED(Options ops), UNUSED(i
}
/* the zle buffer stack */
-
+
/**/
mod_export LinkList bufstack;
@@ -3491,14 +3491,14 @@ bin_print(char *name, char **args, Options ops, int func)
#endif
FILE *fout = stdout;
Histent ent;
-
+
mnumber mnumval;
double doubleval;
int intval;
zlong zlongval;
zulong zulongval;
char *stringval;
-
+
if (func == BIN_PRINTF) {
if (!strcmp(*args, "--") && !*++args) {
zwarnnam(name, "not enough arguments");
@@ -3514,7 +3514,7 @@ bin_print(char *name, char **args, Options ops, int func)
GETKEYS_PRINTF_FMT, &fmttrunc);
first = args;
-
+
/* -m option -- treat the first argument as a pattern and remove
* arguments not matching */
if (OPT_ISSET(ops,'m')) {
@@ -3543,8 +3543,8 @@ bin_print(char *name, char **args, Options ops, int func)
len = (int *) hcalloc(argc * sizeof(int));
for(n = 0; n < argc; n++) {
/* first \ sequences */
- if (fmt ||
- (!OPT_ISSET(ops,'e') &&
+ if (fmt ||
+ (!OPT_ISSET(ops,'e') &&
(OPT_ISSET(ops,'R') || OPT_ISSET(ops,'r') || OPT_ISSET(ops,'E'))))
unmetafy(args[n], &len[n]);
else {
@@ -3577,7 +3577,7 @@ bin_print(char *name, char **args, Options ops, int func)
/* -D option -- interpret as a directory, and use ~ */
if(OPT_ISSET(ops,'D')) {
Nameddir d;
-
+
queue_signals();
d = finddir(args[n]);
if(d) {
@@ -3590,7 +3590,7 @@ bin_print(char *name, char **args, Options ops, int func)
unqueue_signals();
}
}
-
+
/* -u and -p -- output to other than standard output */
if (OPT_HASARG(ops,'u') || OPT_ISSET(ops,'p')) {
int fd;
@@ -3782,7 +3782,7 @@ bin_print(char *name, char **args, Options ops, int func)
}
return ret;
}
-
+
/* normal output */
if (!fmt) {
if (OPT_ISSET(ops, 'z') || OPT_ISSET(ops, 's')) {
@@ -3831,7 +3831,7 @@ bin_print(char *name, char **args, Options ops, int func)
for (; *args; args++, len++) {
fwrite(*args, *len, 1, fout);
if (args[1])
- fputc(OPT_ISSET(ops,'l') ? '\n' :
+ fputc(OPT_ISSET(ops,'l') ? '\n' :
OPT_ISSET(ops,'N') ? '\0' : ' ', fout);
}
if (!(OPT_ISSET(ops,'n') || nnl))
@@ -3844,7 +3844,7 @@ bin_print(char *name, char **args, Options ops, int func)
}
return ret;
}
-
+
/*
* All the remaining code in this function is for printf-style
* output (printf itself, or print -f). We still have to handle
@@ -3863,8 +3863,8 @@ bin_print(char *name, char **args, Options ops, int func)
zwarnnam(name, "can't open temp file: %e", errno);
unlink(tmpf);
#endif
- }
-
+ }
+
/* printf style output */
*spec = '%';
argp = args;
@@ -3912,7 +3912,7 @@ bin_print(char *name, char **args, Options ops, int func)
}
}
}
-
+
/* copy only one of each flag as spec has finite size */
memset(flags, 0, sizeof(flags));
while (*c && (flag = strchr(flagch, *c))) {
@@ -3973,7 +3973,7 @@ bin_print(char *name, char **args, Options ops, int func)
}
}
}
-
+
if (*argp) {
prec = (int)mathevali(*argp++);
if (errflag) {
@@ -4255,12 +4255,12 @@ bin_shift(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
{
int num = 1, l, ret = 0;
char **s;
-
+
/* optional argument can be either numeric or an array */
queue_signals();
if (*argv && !getaparam(*argv))
num = mathevali(*argv++);
-
+
if (num < 0) {
unqueue_signals();
zwarnnam(name, "argument to shift must be non-negative");
@@ -4474,10 +4474,10 @@ bin_break(char *name, char **argv, UNUSED(Options ops), int func)
}
/* we have printed a 'you have stopped (running) jobs.' message */
-
+
/**/
mod_export int stopmsg;
-
+
/* check to see if user has jobs running/stopped */
/**/
@@ -4768,7 +4768,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
if(OPT_ISSET(ops,'l') || OPT_ISSET(ops,'c'))
return compctlreadptr(name, args, ops, reply);
- if ((OPT_ISSET(ops,'k') && !OPT_ISSET(ops,'u') &&
+ if ((OPT_ISSET(ops,'k') && !OPT_ISSET(ops,'u') &&
!OPT_ISSET(ops,'p')) || OPT_ISSET(ops,'q')) {
if (!zleactive) {
if (SHTTY == -1) {
@@ -4822,32 +4822,32 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
} else
readfd = izle = 0;
- if (OPT_ISSET(ops,'t')) {
- zlong timeout = 0;
- if (OPT_HASARG(ops,'t')) {
- mnumber mn = zero_mnumber;
- mn = matheval(OPT_ARG(ops,'t'));
- if (errflag)
- return 1;
- if (mn.type == MN_FLOAT) {
- mn.u.d *= 1e6;
- timeout = (zlong)mn.u.d;
- } else {
- timeout = (zlong)mn.u.l * (zlong)1000000;
- }
- }
- if (readfd == -1 ||
- !read_poll(readfd, &readchar, keys && !zleactive, timeout)) {
- if (OPT_ISSET(ops,'k') && !zleactive && !isem)
- settyinfo(&shttyinfo);
- if (haso) {
- fclose(shout);
- shout = oshout;
- SHTTY = -1;
+ if (OPT_ISSET(ops,'s') && SHTTY != -1) {
+ struct ttyinfo ti;
+ gettyinfo(&ti);
+ saveti = ti;
+ resettty = 1;
+#ifdef HAS_TIO
+ ti.tio.c_lflag &= ~ECHO;
+#else
+ ti.sgttyb.sg_flags &= ~ECHO;
+#endif
+ settyinfo(&ti);
+ }
+
+ /* handle prompt */
+ if (firstarg) {
+ for (readpmpt = firstarg;
+ *readpmpt && *readpmpt != '?'; readpmpt++);
+ if (*readpmpt++) {
+ if (keys || isatty(0)) {
+ zputs(readpmpt, (shout ? shout : stderr));
+ fflush(shout ? shout : stderr);
}
- return 1;
+ readpmpt[-1] = '\0';
}
}
+
if (OPT_ISSET(ops,'d')) {
char *delimstr = OPT_ARG(ops,'d');
#ifdef MULTIBYTE_SUPPORT
@@ -4870,8 +4870,10 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
if (SHTTY != -1) {
struct ttyinfo ti;
gettyinfo(&ti);
- saveti = ti;
- resettty = 1;
+ if (! resettty) {
+ saveti = ti;
+ resettty = 1;
+ }
#ifdef HAS_TIO
ti.tio.c_lflag &= ~ICANON;
ti.tio.c_cc[VMIN] = 1;
@@ -4882,31 +4884,32 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
settyinfo(&ti);
}
}
- if (OPT_ISSET(ops,'s') && SHTTY != -1) {
- struct ttyinfo ti;
- gettyinfo(&ti);
- if (! resettty) {
- saveti = ti;
- resettty = 1;
+ if (OPT_ISSET(ops,'t')) {
+ zlong timeout = 0;
+ if (OPT_HASARG(ops,'t')) {
+ mnumber mn = zero_mnumber;
+ mn = matheval(OPT_ARG(ops,'t'));
+ if (errflag)
+ return 1;
+ if (mn.type == MN_FLOAT) {
+ mn.u.d *= 1e6;
+ timeout = (zlong)mn.u.d;
+ } else {
+ timeout = (zlong)mn.u.l * (zlong)1000000;
+ }
}
-#ifdef HAS_TIO
- ti.tio.c_lflag &= ~ECHO;
-#else
- ti.sgttyb.sg_flags &= ~ECHO;
-#endif
- settyinfo(&ti);
- }
-
- /* handle prompt */
- if (firstarg) {
- for (readpmpt = firstarg;
- *readpmpt && *readpmpt != '?'; readpmpt++);
- if (*readpmpt++) {
- if (keys || isatty(0)) {
- zputs(readpmpt, (shout ? shout : stderr));
- fflush(shout ? shout : stderr);
+ if (readfd == -1 ||
+ !read_poll(readfd, &readchar, keys && !zleactive, timeout)) {
+ if (OPT_ISSET(ops,'k') && !zleactive && !isem)
+ settyinfo(&shttyinfo);
+ else if (resettty && SHTTY != -1)
+ settyinfo(&saveti);
+ if (haso) {
+ fclose(shout);
+ shout = oshout;
+ SHTTY = -1;
}
- readpmpt[-1] = '\0';
+ return 1;
}
}
@@ -4989,7 +4992,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
bptr += val;
}
} while (nchars > 0);
-
+
if (!izle && !OPT_ISSET(ops,'u') && !OPT_ISSET(ops,'p')) {
/* dispose of result appropriately, etc. */
if (isem)
@@ -5022,7 +5025,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
/* set up the buffer */
readbuf[1] = '\0';
-
+
/* get, and store, reply */
if (izle) {
#ifdef MULTIBYTE_SUPPORT
@@ -5090,7 +5093,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
/* not waiting to be completed any more */
ret = 0;
break;
- }
+ }
*bptr = (char)c;
if (isset(MULTIBYTE)) {
ret = mbrtowc(&wc, bptr, 1, &mbs);