From fa8a0e241c8ac9eb48ab9fc2d8bb3105088e0db9 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Wed, 7 Mar 2012 06:10:42 +0000 Subject: 30320: "emulate" accepts invocation-time flags; other small doc tweaks. --- Src/builtin.c | 57 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 25 deletions(-) (limited to 'Src/builtin.c') diff --git a/Src/builtin.c b/Src/builtin.c index b43c08235..c32b1c023 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -58,7 +58,7 @@ static struct builtin builtins[] = BUILTIN("disable", 0, bin_enable, 0, -1, BIN_DISABLE, "afmrs", NULL), BUILTIN("disown", 0, bin_fg, 0, -1, BIN_DISOWN, NULL, NULL), BUILTIN("echo", BINF_SKIPINVALID, bin_print, 0, -1, BIN_ECHO, "neE", "-"), - BUILTIN("emulate", 0, bin_emulate, 0, 3, 0, "LR", NULL), + BUILTIN("emulate", 0, bin_emulate, 0, -1, 0, "LR", NULL), BUILTIN("enable", 0, bin_enable, 0, -1, BIN_ENABLE, "afmrs", NULL), BUILTIN("eval", BINF_PSPECIAL, bin_eval, 0, -1, BIN_EVAL, NULL, NULL), BUILTIN("exit", BINF_PSPECIAL, bin_break, 0, 1, BIN_EXIT, NULL, NULL), @@ -4958,14 +4958,14 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func)) { int opt_L = OPT_ISSET(ops, 'L'); int opt_R = OPT_ISSET(ops, 'R'); - int saveemulation, savesticky_emulation; - int ret; + int saveemulation, savesticky_emulation, savehackchar; + int ret = 1; char saveopts[OPT_SIZE]; + char *cmd = 0; + const char *shname = *argv; /* without arguments just print current emulation */ - if (!*argv) { - const char *shname; - + if (!shname) { if (opt_L || opt_R) { zwarnnam("emulate", "not enough arguments"); return 1; @@ -4995,39 +4995,46 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func)) /* with single argument set current emulation */ if (!argv[1]) { - emulate(*argv, OPT_ISSET(ops,'R')); + emulate(shname, OPT_ISSET(ops,'R')); if (OPT_ISSET(ops,'L')) opts[LOCALOPTIONS] = opts[LOCALTRAPS] = 1; return 0; } - /* If "-c command" is given, evaluate command using specified - * emulation mode. - */ - if (strcmp(argv[1], "-c")) { - zwarnnam("emulate", "unknown argument %s", argv[1]); - return 1; - } + argv++; + memcpy(saveopts, opts, sizeof(opts)); + savehackchar = keyboardhackchar; + cmd = parseopts("emulate", &argv); - if (!argv[2]) { - zwarnnam("emulate", "not enough arguments"); - return 1; + /* parseopts() has consumed anything that looks like an option */ + if (*argv) { + zwarnnam("emulate", "unknown argument %s", *argv); + goto restore; } - if (opt_L) { - zwarnnam("emulate", "option -L incompatible with -c"); - return 1; - } + /* If "-c command" is given, evaluate command using specified + * emulation mode. + */ + if (cmd) { + if (opt_L) { + zwarnnam("emulate", "option -L incompatible with -c"); + goto restore; + } + *--argv = cmd; /* on stack, never free()d, see execbuiltin() */ + } else + return 0; - memcpy(saveopts, opts, sizeof(opts)); saveemulation = emulation; savesticky_emulation = sticky_emulation; - emulate(*argv, OPT_ISSET(ops,'R')); + emulate(shname, OPT_ISSET(ops,'R')); sticky_emulation = emulation; - ret = eval(argv+2); - memcpy(opts, saveopts, sizeof(opts)); + ret = eval(argv); sticky_emulation = savesticky_emulation; emulation = saveemulation; + restore: + memcpy(opts, saveopts, sizeof(opts)); + keyboardhackchar = savehackchar; + inittyptab(); /* restore banghist */ return ret; } -- cgit 1.4.1