mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
31444: Basic code for enable/disable -p
This commit is contained in:
parent
e36e7d9ade
commit
fdf2867e5f
8 changed files with 313 additions and 12 deletions
|
@ -291,8 +291,8 @@ enditem()
|
||||||
findex(disable)
|
findex(disable)
|
||||||
cindex(disabling commands)
|
cindex(disabling commands)
|
||||||
cindex(commands, disabling)
|
cindex(commands, disabling)
|
||||||
item(tt(disable) [ tt(-afmrs) ] var(name) ...)(
|
item(tt(disable) [ tt(-afmprs) ] var(name) ...)(
|
||||||
Temporarily disable the var(name)d hash table elements. The default
|
Temporarily disable the var(name)d hash table elements or patterns. The default
|
||||||
is to disable builtin commands. This allows you to use an external
|
is to disable builtin commands. This allows you to use an external
|
||||||
command with the same name as a builtin command. The tt(-a) option
|
command with the same name as a builtin command. The tt(-a) option
|
||||||
causes tt(disable) to act on regular or global aliases. The tt(-s)
|
causes tt(disable) to act on regular or global aliases. The tt(-s)
|
||||||
|
@ -305,6 +305,80 @@ quoted to prevent them from undergoing filename expansion), and all hash
|
||||||
table elements from the corresponding hash table matching these patterns
|
table elements from the corresponding hash table matching these patterns
|
||||||
are disabled. Disabled objects can be enabled with the tt(enable)
|
are disabled. Disabled objects can be enabled with the tt(enable)
|
||||||
command.
|
command.
|
||||||
|
|
||||||
|
With the option tt(-p), var(name) ... refer to elements of the
|
||||||
|
shell's pattern syntax as described in noderef(Filename Generation).
|
||||||
|
Certain elements can be disabled separately, as given below.
|
||||||
|
|
||||||
|
Note that patterns
|
||||||
|
not allowed by the current settings for the options tt(EXTENDED_GLOB),
|
||||||
|
tt(KSH_GLOB) and tt(SH_GLOB) are never enabled, regardless of the
|
||||||
|
setting here. For example, if tt(EXTENDED_GLOB) is not active,
|
||||||
|
the pattern tt(^) is ineffective even if `tt(disable -p "^")' has
|
||||||
|
not been issued. The list below indicates any option settings
|
||||||
|
that restrict the use of the pattern. It should be noted that
|
||||||
|
setting tt(SH_GLOB) has a wider effect then merely disabling patterns
|
||||||
|
as certain expressions, in particular those involving parentheses,
|
||||||
|
are parsed differently.
|
||||||
|
|
||||||
|
The following patterns may be disabled; all
|
||||||
|
the strings need quoting on the command line to prevent them from
|
||||||
|
being interpreted immediately as patterns and the patterns are
|
||||||
|
shown below in single quotes as a reminder.
|
||||||
|
startitem()
|
||||||
|
item(tt('?'))(
|
||||||
|
The pattern character tt(?) wherever it occurs, including when preceding
|
||||||
|
a parenthesis with tt(KSH_GLOB).
|
||||||
|
)
|
||||||
|
item(tt('*'))(
|
||||||
|
The pattern character tt(*) wherever it occurs, including recursive
|
||||||
|
globbing and when preceding a parenthesis with tt(KSH_GLOB).
|
||||||
|
)
|
||||||
|
item('LSQUARE()')(
|
||||||
|
Character classes.
|
||||||
|
)
|
||||||
|
item(tt('<') (tt(NO_SH_GLOB)))(
|
||||||
|
Numeric ranges.
|
||||||
|
)
|
||||||
|
item(tt('|') (tt(NO_SH_GLOB)))(
|
||||||
|
Alternation in grouped patterns, case statements, or KSH_GLOB
|
||||||
|
parenthesised expressions.
|
||||||
|
)
|
||||||
|
item(tt('LPAR()') (tt(NO_SH_GLOB)))(
|
||||||
|
Grouping using single parentheses. Disabling this does not disable the
|
||||||
|
use of parentheses for tt(KSH_GLOB) where they are introduced by a
|
||||||
|
special character, nor for glob qualifiers (use `tt(setopt
|
||||||
|
NO_BARE_GLOB_QUAL)' to disable glob qualifiers that use parentheses
|
||||||
|
only).
|
||||||
|
)
|
||||||
|
item(tt('~') (tt(EXTENDED_GLOB)))(
|
||||||
|
Exclusion in the form var(A)tt(~)var(B).
|
||||||
|
)
|
||||||
|
item(tt('^') (tt(EXTENDED_GLOB)))(
|
||||||
|
Exclusion in the form var(A)tt(^)var(B).
|
||||||
|
)
|
||||||
|
item(tt('#') (tt(EXTENDED_GLOB)))(
|
||||||
|
The pattern character tt(#) wherever it occurs, both for
|
||||||
|
repetition of a previous pattern and for indicating globbing flags.
|
||||||
|
)
|
||||||
|
item(tt('?LPAR()') (tt(KSH_GLOB)))(
|
||||||
|
The grouping form tt(?LPAR())var(...)tt(RPAR()). Note this is also
|
||||||
|
disabled if tt('?') is disabled.
|
||||||
|
)
|
||||||
|
item(tt('*LPAR()') (tt(KSH_GLOB)))(
|
||||||
|
The grouping form tt(*LPAR())var(...)tt(RPAR()). Note this is also
|
||||||
|
disabled if tt('*') is disabled.
|
||||||
|
)
|
||||||
|
item(tt('PLUS()LPAR()') (tt(KSH_GLOB)))(
|
||||||
|
The grouping form tt(PLUS()LPAR())var(...)tt(RPAR()).
|
||||||
|
)
|
||||||
|
item(tt('!LPAR()') (tt(KSH_GLOB)))(
|
||||||
|
The grouping form tt(!LPAR())var(...)tt(RPAR()).
|
||||||
|
)
|
||||||
|
item(tt('@LPAR()') (tt(KSH_GLOB)))(
|
||||||
|
The grouping form tt(@LPAR())var(...)tt(RPAR()).
|
||||||
|
)
|
||||||
|
enditem()
|
||||||
)
|
)
|
||||||
findex(disown)
|
findex(disown)
|
||||||
cindex(jobs, disowning)
|
cindex(jobs, disowning)
|
||||||
|
@ -376,7 +450,9 @@ the section COMPATIBILITY in zmanref(zsh)
|
||||||
ifnzman(\
|
ifnzman(\
|
||||||
noderef(Compatibility)
|
noderef(Compatibility)
|
||||||
)\
|
)\
|
||||||
.
|
. In addition to setting shell options, the command also restores
|
||||||
|
the pristine state of pattern enables, as if all patterns had been
|
||||||
|
enabled using tt(enable -p).
|
||||||
|
|
||||||
If the tt(emulate) command occurs inside a function that has been
|
If the tt(emulate) command occurs inside a function that has been
|
||||||
marked for execution tracing with tt(functions -t) then the tt(xtrace)
|
marked for execution tracing with tt(functions -t) then the tt(xtrace)
|
||||||
|
@ -390,9 +466,11 @@ are reset to their default value corresponding to the specified emulation
|
||||||
mode, except for certain options describing the interactive
|
mode, except for certain options describing the interactive
|
||||||
environment; otherwise, only those options likely to cause portability
|
environment; otherwise, only those options likely to cause portability
|
||||||
problems in scripts and functions are altered. If the tt(-L) switch is given,
|
problems in scripts and functions are altered. If the tt(-L) switch is given,
|
||||||
the options tt(LOCAL_OPTIONS) and tt(LOCAL_TRAPS) will be set as
|
the options tt(LOCAL_OPTIONS), tt(LOCAL_PATTERNS) and tt(LOCAL_TRAPS)
|
||||||
well, causing the effects of the tt(emulate) command and any tt(setopt) and
|
will be set as
|
||||||
tt(trap) commands to be local to the immediately surrounding shell
|
well, causing the effects of the tt(emulate) command and any tt(setopt),
|
||||||
|
tt(disable -p) or tt(enable -b), and tt(trap) commands to be local to
|
||||||
|
the immediately surrounding shell
|
||||||
function, if any; normally these options are turned off in all emulation
|
function, if any; normally these options are turned off in all emulation
|
||||||
modes except tt(ksh). The tt(-L) switch is mutually exclusive with the
|
modes except tt(ksh). The tt(-L) switch is mutually exclusive with the
|
||||||
use of tt(-c) in var(flags).
|
use of tt(-c) in var(flags).
|
||||||
|
@ -414,7 +492,8 @@ Use of tt(-c) enables `sticky' emulation mode for functions defined
|
||||||
within the evaluated expression: the emulation mode is associated
|
within the evaluated expression: the emulation mode is associated
|
||||||
thereafter with the function so that whenever the function is executed
|
thereafter with the function so that whenever the function is executed
|
||||||
the emulation (respecting the tt(-R) switch, if present) and all
|
the emulation (respecting the tt(-R) switch, if present) and all
|
||||||
options are set before entry to the function, and restored after exit.
|
options are set (and pattern disables cleared)
|
||||||
|
before entry to the function, and the state is restored after exit.
|
||||||
If the function is called when the sticky emulation is already in
|
If the function is called when the sticky emulation is already in
|
||||||
effect, either within an `tt(emulate) var(shell) tt(-c)' expression or
|
effect, either within an `tt(emulate) var(shell) tt(-c)' expression or
|
||||||
within another function with the same sticky emulation, entry and exit
|
within another function with the same sticky emulation, entry and exit
|
||||||
|
@ -471,7 +550,7 @@ endsitem()
|
||||||
findex(enable)
|
findex(enable)
|
||||||
cindex(enabling commands)
|
cindex(enabling commands)
|
||||||
cindex(commands, enabling)
|
cindex(commands, enabling)
|
||||||
item(tt(enable) [ tt(-afmrs) ] var(name) ...)(
|
item(tt(enable) [ tt(-afmprs) ] var(name) ...)(
|
||||||
Enable the var(name)d hash table elements, presumably disabled
|
Enable the var(name)d hash table elements, presumably disabled
|
||||||
earlier with tt(disable). The default is to enable builtin commands.
|
earlier with tt(disable). The default is to enable builtin commands.
|
||||||
The tt(-a) option causes tt(enable) to act on regular or global aliases.
|
The tt(-a) option causes tt(enable) to act on regular or global aliases.
|
||||||
|
@ -483,6 +562,13 @@ printed. With the tt(-m) flag the arguments are taken as patterns
|
||||||
(should be quoted) and all hash table elements from the corresponding
|
(should be quoted) and all hash table elements from the corresponding
|
||||||
hash table matching these patterns are enabled. Enabled objects can be
|
hash table matching these patterns are enabled. Enabled objects can be
|
||||||
disabled with the tt(disable) builtin command.
|
disabled with the tt(disable) builtin command.
|
||||||
|
|
||||||
|
tt(enable -p) reenables patterns disabled with tt(disable -p). Note
|
||||||
|
that it does not override globbing options; for example, `tt(enable -p
|
||||||
|
"~")' does not cause the pattern character tt(~) to be active unless
|
||||||
|
the tt(EXTENDED_GLOB) option is also set. To enable all possible
|
||||||
|
patterns (so that they may be invidually disabled with tt(disable -p)),
|
||||||
|
use `tt(setopt EXTENDED_GLOB KSH_GLOB NO_SH_GLOB)'.
|
||||||
)
|
)
|
||||||
findex(eval)
|
findex(eval)
|
||||||
cindex(evaluating arguments as commands)
|
cindex(evaluating arguments as commands)
|
||||||
|
|
|
@ -1618,6 +1618,19 @@ A shell function can also guarantee itself a known shell configuration
|
||||||
with a formulation like `tt(emulate -L zsh)'; the tt(-L) activates
|
with a formulation like `tt(emulate -L zsh)'; the tt(-L) activates
|
||||||
tt(LOCAL_OPTIONS).
|
tt(LOCAL_OPTIONS).
|
||||||
)
|
)
|
||||||
|
pindex(LOCAL_PATTERNS)
|
||||||
|
pindex(NO_LOCAL_PATTERNS)
|
||||||
|
pindex(LOCALPATTERNS)
|
||||||
|
pindex(NOLOCALPATTERNS)
|
||||||
|
item(tt(LOCAL_PATTERNS))(
|
||||||
|
If this option is set at the point of return from a shell function,
|
||||||
|
the state of pattern disables, as set with the builtin command
|
||||||
|
`tt(disable -p)', is restored to what it was when the function was
|
||||||
|
entered. The behaviour of this option is similar to the effect
|
||||||
|
of tt(LOCAL_OPTIONS) on options; hence `tt(emulate -L sh)' (or
|
||||||
|
indeed any other emulation with the tt(-L) option) activates
|
||||||
|
tt(LOCAL_PATTERNS).
|
||||||
|
)
|
||||||
pindex(LOCAL_TRAPS)
|
pindex(LOCAL_TRAPS)
|
||||||
pindex(NO_LOCAL_TRAPS)
|
pindex(NO_LOCAL_TRAPS)
|
||||||
pindex(LOCALTRAPS)
|
pindex(LOCALTRAPS)
|
||||||
|
|
|
@ -33,6 +33,7 @@ DEFINEMACRO(RQUOTE)(0)(CHAR(39))
|
||||||
DEFINEMACRO(LPAR)(0)(CHAR(40))
|
DEFINEMACRO(LPAR)(0)(CHAR(40))
|
||||||
DEFINEMACRO(RPAR)(0)(CHAR(41))
|
DEFINEMACRO(RPAR)(0)(CHAR(41))
|
||||||
DEFINEMACRO(PLUS)(0)(CHAR(43))
|
DEFINEMACRO(PLUS)(0)(CHAR(43))
|
||||||
|
DEFINEMACRO(LSQUARE)(0)(CHAR(91))
|
||||||
|
|
||||||
DEFINEMACRO(DASH)(0)(ifztexi(--)ifnztexi(-))
|
DEFINEMACRO(DASH)(0)(ifztexi(--)ifnztexi(-))
|
||||||
|
|
||||||
|
|
|
@ -55,11 +55,11 @@ static struct builtin builtins[] =
|
||||||
BUILTIN("continue", BINF_PSPECIAL, bin_break, 0, 1, BIN_CONTINUE, NULL, NULL),
|
BUILTIN("continue", BINF_PSPECIAL, bin_break, 0, 1, BIN_CONTINUE, NULL, NULL),
|
||||||
BUILTIN("declare", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%klmprtuxz", NULL),
|
BUILTIN("declare", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%klmprtuxz", NULL),
|
||||||
BUILTIN("dirs", 0, bin_dirs, 0, -1, 0, "clpv", NULL),
|
BUILTIN("dirs", 0, bin_dirs, 0, -1, 0, "clpv", NULL),
|
||||||
BUILTIN("disable", 0, bin_enable, 0, -1, BIN_DISABLE, "afmrs", NULL),
|
BUILTIN("disable", 0, bin_enable, 0, -1, BIN_DISABLE, "afmprs", NULL),
|
||||||
BUILTIN("disown", 0, bin_fg, 0, -1, BIN_DISOWN, NULL, NULL),
|
BUILTIN("disown", 0, bin_fg, 0, -1, BIN_DISOWN, NULL, NULL),
|
||||||
BUILTIN("echo", BINF_SKIPINVALID, bin_print, 0, -1, BIN_ECHO, "neE", "-"),
|
BUILTIN("echo", BINF_SKIPINVALID, bin_print, 0, -1, BIN_ECHO, "neE", "-"),
|
||||||
BUILTIN("emulate", 0, bin_emulate, 0, -1, 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("enable", 0, bin_enable, 0, -1, BIN_ENABLE, "afmprs", NULL),
|
||||||
BUILTIN("eval", BINF_PSPECIAL, bin_eval, 0, -1, BIN_EVAL, NULL, 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),
|
BUILTIN("exit", BINF_PSPECIAL, bin_break, 0, 1, BIN_EXIT, NULL, NULL),
|
||||||
BUILTIN("export", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, BIN_EXPORT, "E:%F:%HL:%R:%TUZ:%afhi:%lprtu", "xg"),
|
BUILTIN("export", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, BIN_EXPORT, "E:%F:%HL:%R:%TUZ:%afhi:%lprtu", "xg"),
|
||||||
|
@ -467,7 +467,9 @@ bin_enable(char *name, char **argv, Options ops, int func)
|
||||||
int match = 0, returnval = 0;
|
int match = 0, returnval = 0;
|
||||||
|
|
||||||
/* Find out which hash table we are working with. */
|
/* Find out which hash table we are working with. */
|
||||||
if (OPT_ISSET(ops,'f'))
|
if (OPT_ISSET(ops,'p')) {
|
||||||
|
return pat_enables(name, argv, func == BIN_ENABLE);
|
||||||
|
} else if (OPT_ISSET(ops,'f'))
|
||||||
ht = shfunctab;
|
ht = shfunctab;
|
||||||
else if (OPT_ISSET(ops,'r'))
|
else if (OPT_ISSET(ops,'r'))
|
||||||
ht = reswdtab;
|
ht = reswdtab;
|
||||||
|
@ -5020,6 +5022,7 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func))
|
||||||
int opt_R = OPT_ISSET(ops, 'R');
|
int opt_R = OPT_ISSET(ops, 'R');
|
||||||
int saveemulation, savehackchar;
|
int saveemulation, savehackchar;
|
||||||
int ret = 1, new_emulation;
|
int ret = 1, new_emulation;
|
||||||
|
unsigned int savepatterns;
|
||||||
char saveopts[OPT_SIZE], new_opts[OPT_SIZE];
|
char saveopts[OPT_SIZE], new_opts[OPT_SIZE];
|
||||||
char *cmd = 0;
|
char *cmd = 0;
|
||||||
const char *shname = *argv;
|
const char *shname = *argv;
|
||||||
|
@ -5061,7 +5064,8 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func))
|
||||||
if (!argv[1]) {
|
if (!argv[1]) {
|
||||||
emulate(shname, OPT_ISSET(ops,'R'), &emulation, opts);
|
emulate(shname, OPT_ISSET(ops,'R'), &emulation, opts);
|
||||||
if (OPT_ISSET(ops,'L'))
|
if (OPT_ISSET(ops,'L'))
|
||||||
opts[LOCALOPTIONS] = opts[LOCALTRAPS] = 1;
|
opts[LOCALOPTIONS] = opts[LOCALTRAPS] = opts[LOCALPATTERNS] = 1;
|
||||||
|
clearpatterndisables();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5082,6 +5086,13 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func))
|
||||||
goto restore;
|
goto restore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
savepatterns = savepatterndisables();
|
||||||
|
/*
|
||||||
|
* All emulations start with an empty set of pattern disables,
|
||||||
|
* hence no special "sticky" behaviour is required.
|
||||||
|
*/
|
||||||
|
clearpatterndisables();
|
||||||
|
|
||||||
saveemulation = emulation;
|
saveemulation = emulation;
|
||||||
emulation = new_emulation;
|
emulation = new_emulation;
|
||||||
memcpy(opts, new_opts, sizeof(opts));
|
memcpy(opts, new_opts, sizeof(opts));
|
||||||
|
@ -5131,6 +5142,7 @@ bin_emulate(UNUSED(char *nam), char **argv, Options ops, UNUSED(int func))
|
||||||
sticky = save_sticky;
|
sticky = save_sticky;
|
||||||
emulation = saveemulation;
|
emulation = saveemulation;
|
||||||
memcpy(opts, saveopts, sizeof(opts));
|
memcpy(opts, saveopts, sizeof(opts));
|
||||||
|
restorepatterndisables(savepatterns);
|
||||||
restore:
|
restore:
|
||||||
keyboardhackchar = savehackchar;
|
keyboardhackchar = savehackchar;
|
||||||
inittyptab(); /* restore banghist */
|
inittyptab(); /* restore banghist */
|
||||||
|
|
|
@ -4627,6 +4627,7 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
|
||||||
}
|
}
|
||||||
|
|
||||||
starttrapscope();
|
starttrapscope();
|
||||||
|
startpatternscope();
|
||||||
|
|
||||||
pptab = pparams;
|
pptab = pparams;
|
||||||
if (!(flags & PM_UNDEFINED))
|
if (!(flags & PM_UNDEFINED))
|
||||||
|
@ -4674,6 +4675,8 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
|
||||||
offptr++)
|
offptr++)
|
||||||
opts[*offptr] = 0;
|
opts[*offptr] = 0;
|
||||||
}
|
}
|
||||||
|
/* All emulations start with pattern disables clear */
|
||||||
|
clearpatterndisables();
|
||||||
} else
|
} else
|
||||||
restore_sticky = 0;
|
restore_sticky = 0;
|
||||||
|
|
||||||
|
@ -4774,6 +4777,8 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
|
||||||
scriptname = oldscriptname;
|
scriptname = oldscriptname;
|
||||||
oflags = ooflags;
|
oflags = ooflags;
|
||||||
|
|
||||||
|
endpatternscope(); /* before restoring old LOCALPATTERNS */
|
||||||
|
|
||||||
if (restore_sticky) {
|
if (restore_sticky) {
|
||||||
/*
|
/*
|
||||||
* If we switched to an emulation environment just for
|
* If we switched to an emulation environment just for
|
||||||
|
|
|
@ -179,6 +179,7 @@ static struct optname optns[] = {
|
||||||
{{NULL, "listrowsfirst", 0}, LISTROWSFIRST},
|
{{NULL, "listrowsfirst", 0}, LISTROWSFIRST},
|
||||||
{{NULL, "listtypes", OPT_ALL}, LISTTYPES},
|
{{NULL, "listtypes", OPT_ALL}, LISTTYPES},
|
||||||
{{NULL, "localoptions", OPT_EMULATE|OPT_KSH}, LOCALOPTIONS},
|
{{NULL, "localoptions", OPT_EMULATE|OPT_KSH}, LOCALOPTIONS},
|
||||||
|
{{NULL, "localpatterns", OPT_EMULATE}, LOCALPATTERNS},
|
||||||
{{NULL, "localtraps", OPT_EMULATE|OPT_KSH}, LOCALTRAPS},
|
{{NULL, "localtraps", OPT_EMULATE|OPT_KSH}, LOCALTRAPS},
|
||||||
{{NULL, "login", OPT_SPECIAL}, LOGINSHELL},
|
{{NULL, "login", OPT_SPECIAL}, LOGINSHELL},
|
||||||
{{NULL, "longlistjobs", 0}, LONGLISTJOBS},
|
{{NULL, "longlistjobs", 0}, LONGLISTJOBS},
|
||||||
|
|
167
Src/pattern.c
167
Src/pattern.c
|
@ -232,6 +232,27 @@ static const char zpc_chars[ZPC_COUNT] = {
|
||||||
Hat, Pound, Bnullkeep, Quest, Star, '+', '!', '@'
|
Hat, Pound, Bnullkeep, Quest, Star, '+', '!', '@'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Corresponding strings used in enable/disable -p.
|
||||||
|
* NULL means no way of turning this on or off.
|
||||||
|
*/
|
||||||
|
static const char *zpc_strings[ZPC_COUNT] = {
|
||||||
|
NULL, NULL, "|", NULL, "~", "(", "?", "*", "[", "<",
|
||||||
|
"^", "#", NULL, "?(", "*(", "+(", "!(", "@("
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Corresponding array of pattern disables as set by the user
|
||||||
|
* using "disable -p".
|
||||||
|
*/
|
||||||
|
static char zpc_disables[ZPC_COUNT];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stack of saved (compressed) zpc_disables for function scope.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct zpc_disables_save *zpc_disables_stack;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Characters which terminate a simple string (ZPC_COUNT) or
|
* Characters which terminate a simple string (ZPC_COUNT) or
|
||||||
* an entire pattern segment (the first ZPC_SEG_COUNT).
|
* an entire pattern segment (the first ZPC_SEG_COUNT).
|
||||||
|
@ -414,7 +435,19 @@ static long rn_offs;
|
||||||
static void
|
static void
|
||||||
patcompcharsset(void)
|
patcompcharsset(void)
|
||||||
{
|
{
|
||||||
|
char *spp, *disp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Initialise enabled special characters */
|
||||||
memcpy(zpc_special, zpc_chars, ZPC_COUNT);
|
memcpy(zpc_special, zpc_chars, ZPC_COUNT);
|
||||||
|
/* Apply user disables from disable -p */
|
||||||
|
for (i = 0, spp = zpc_special, disp = zpc_disables;
|
||||||
|
i < ZPC_COUNT;
|
||||||
|
i++, spp++, disp++) {
|
||||||
|
if (*disp)
|
||||||
|
*spp = Marker;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isset(EXTENDEDGLOB)) {
|
if (!isset(EXTENDEDGLOB)) {
|
||||||
/* Extended glob characters are not active */
|
/* Extended glob characters are not active */
|
||||||
zpc_special[ZPC_TILDE] = zpc_special[ZPC_HAT] =
|
zpc_special[ZPC_TILDE] = zpc_special[ZPC_HAT] =
|
||||||
|
@ -3799,3 +3832,137 @@ freepatprog(Patprog prog)
|
||||||
if (prog && prog != dummy_patprog1 && prog != dummy_patprog2)
|
if (prog && prog != dummy_patprog1 && prog != dummy_patprog2)
|
||||||
zfree(prog, prog->size);
|
zfree(prog, prog->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disable or reenable a pattern character */
|
||||||
|
|
||||||
|
/**/
|
||||||
|
int
|
||||||
|
pat_enables(const char *cmd, char **patp, int enable)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
const char **stringp;
|
||||||
|
char *disp;
|
||||||
|
|
||||||
|
if (!*patp) {
|
||||||
|
int done = 0;
|
||||||
|
for (stringp = zpc_strings, disp = zpc_disables;
|
||||||
|
stringp < zpc_strings + ZPC_COUNT;
|
||||||
|
stringp++, disp++) {
|
||||||
|
if (!*stringp)
|
||||||
|
continue;
|
||||||
|
if (enable ? *disp : !*disp)
|
||||||
|
continue;
|
||||||
|
if (done)
|
||||||
|
putc(' ', stdout);
|
||||||
|
printf("'%s'", *stringp);
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
if (done)
|
||||||
|
putc('\n', stdout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; *patp; patp++) {
|
||||||
|
for (stringp = zpc_strings, disp = zpc_disables;
|
||||||
|
stringp < zpc_strings + ZPC_COUNT;
|
||||||
|
stringp++, disp++) {
|
||||||
|
if (*stringp && !strcmp(*stringp, *patp)) {
|
||||||
|
*disp = (char)!enable;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stringp == zpc_strings + ZPC_COUNT) {
|
||||||
|
zerrnam(cmd, "invalid pattern: %s", *patp);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save the current state of pattern disables, returning the saved value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
unsigned int
|
||||||
|
savepatterndisables(void)
|
||||||
|
{
|
||||||
|
unsigned int disables, bit;
|
||||||
|
char *disp;
|
||||||
|
|
||||||
|
disables = 0;
|
||||||
|
for (bit = 1, disp = zpc_disables;
|
||||||
|
disp < zpc_disables + ZPC_COUNT;
|
||||||
|
bit <<= 1, disp++) {
|
||||||
|
if (*disp)
|
||||||
|
disables |= bit;
|
||||||
|
}
|
||||||
|
return disables;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function scope saving pattern enables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
void
|
||||||
|
startpatternscope(void)
|
||||||
|
{
|
||||||
|
Zpc_disables_save newdis;
|
||||||
|
|
||||||
|
newdis = (Zpc_disables_save)zalloc(sizeof(*newdis));
|
||||||
|
newdis->next = zpc_disables_stack;
|
||||||
|
newdis->disables = savepatterndisables();
|
||||||
|
|
||||||
|
zpc_disables_stack = newdis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restore completely the state of pattern disables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
void
|
||||||
|
restorepatterndisables(unsigned int disables)
|
||||||
|
{
|
||||||
|
char *disp;
|
||||||
|
unsigned int bit;
|
||||||
|
|
||||||
|
for (bit = 1, disp = zpc_disables;
|
||||||
|
disp < zpc_disables + ZPC_COUNT;
|
||||||
|
bit <<= 1, disp++) {
|
||||||
|
if (disables & bit)
|
||||||
|
*disp = 1;
|
||||||
|
else
|
||||||
|
*disp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function scope to restore pattern enables if localpatterns is turned on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
void
|
||||||
|
endpatternscope(void)
|
||||||
|
{
|
||||||
|
Zpc_disables_save olddis;
|
||||||
|
|
||||||
|
olddis = zpc_disables_stack;
|
||||||
|
zpc_disables_stack = olddis->next;
|
||||||
|
|
||||||
|
if (isset(LOCALPATTERNS))
|
||||||
|
restorepatterndisables(olddis->disables);
|
||||||
|
|
||||||
|
zfree(olddis, sizeof(*olddis));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reinitialise pattern disables */
|
||||||
|
|
||||||
|
/**/
|
||||||
|
void
|
||||||
|
clearpatterndisables(void)
|
||||||
|
{
|
||||||
|
memset(zpc_disables, 0, ZPC_COUNT);
|
||||||
|
}
|
||||||
|
|
16
Src/zsh.h
16
Src/zsh.h
|
@ -1413,6 +1413,21 @@ enum zpc_chars {
|
||||||
ZPC_COUNT /* Number of special chararacters */
|
ZPC_COUNT /* Number of special chararacters */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure to save disables special characters for function scope.
|
||||||
|
*/
|
||||||
|
struct zpc_disables_save {
|
||||||
|
struct zpc_disables_save *next;
|
||||||
|
/*
|
||||||
|
* Bit vector of ZPC_COUNT disabled characters.
|
||||||
|
* We'll live dangerously and assumed ZPC_COUNT is no greater
|
||||||
|
* than the number of bits an an unsigned int.
|
||||||
|
*/
|
||||||
|
unsigned int disables;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct zpc_disables_save *Zpc_disables_save;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special match types used in character classes. These
|
* Special match types used in character classes. These
|
||||||
* are represented as tokens, with Meta added. The character
|
* are represented as tokens, with Meta added. The character
|
||||||
|
@ -2074,6 +2089,7 @@ enum {
|
||||||
LISTROWSFIRST,
|
LISTROWSFIRST,
|
||||||
LISTTYPES,
|
LISTTYPES,
|
||||||
LOCALOPTIONS,
|
LOCALOPTIONS,
|
||||||
|
LOCALPATTERNS,
|
||||||
LOCALTRAPS,
|
LOCALTRAPS,
|
||||||
LOGINSHELL,
|
LOGINSHELL,
|
||||||
LONGLISTJOBS,
|
LONGLISTJOBS,
|
||||||
|
|
Loading…
Reference in a new issue