mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Refactor new b_hash(); better hash table clear (re: d8428a83)
The b_hash() function duplicated much of its code from b_alias(), while b_alias() retained some code to support being called as 'hash'. There is no reason why 'hash' and 'alias' can't be handled with a single function, as is the case several other builtins. Note that option parsing can easily be made dependent on the name the command was invoked with (in this case, argv[0]=='h'). The new hash builtin's -r option cleared the hash table by assigning to PATH its existing value, triggering its associated discipline function (put_restricted() in init.c) which then actually cleared the hash table. That's a bit of a hack. It's nicer if we can just do that directly. This requires taking a static handler function rehash() from init.c, which invalidates one hash table entry, and making it available to the builtin. src/cmd/ksh93/bltins/typeset.c, src/cmd/ksh93/include/builtins.h, src/cmd/ksh93/include/nval.h, src/cmd/ksh93/sh/init.c, src/cmd/ksh93/sh/name.c: - Merge b_hash() into b_alias(). - The -x option was still uselessly setting the NV_EXPORT flag. Exported aliases were in ksh88 but were removed in ksh93. - Rename rehash() handler function from init.c to nv_rehash (avoiding a possible conflict with another rehash() in cd_pwd.c) and move it to name.c just above nv_scan(), which it's meant to be used with. Make it an extern so typeset.c can use it. - b_alias(): Replace the PATH assignment by an nv_scan() call to clear the hash table directly using the nv_rehash() handler. src/cmd/ksh93/data/builtins.c: - POSIX compliance fix: Remove BLT_SPC (special builtin) flag from "alias" definition. 'alias' is specified as a regular builtin. - sh_optalias[]: Fix uninformative -t option documentation. - sh_opthash[]: Edit for conciseness and clarity. src/cmd/ksh93/sh.1: - Edit the 'alias -t' and 'hash' documentation. - Remove the -- prefix from the 'alias' entry, which indicated that it was supposed to be a declaration builtin like 'typeset', with assignment-arguments expanding tildes and not being subject to field splitting. However, my testing shows that 'alias' has never actually behaved that way on ksh93. Even adding the BLT_DCL flag in data/builtins.c doesn't seem to change that. (cherry picked from commit afa68dca5c786daa13213973e8b0f9bf3a1dadf6)
This commit is contained in:
parent
74b4162178
commit
80d9ae2b1c
8 changed files with 68 additions and 98 deletions
|
@ -78,8 +78,8 @@ const struct shtable3 shtab_builtins[] =
|
|||
#if _bin_newgrp || _usr_bin_newgrp
|
||||
"newgrp", NV_BLTIN|BLT_ENV|BLT_SPC, Bltin(login),
|
||||
#endif /* _bin_newgrp || _usr_bin_newgrp */
|
||||
"alias", NV_BLTIN|BLT_SPC, bltin(alias),
|
||||
"hash", NV_BLTIN, bltin(hash),
|
||||
"alias", NV_BLTIN, bltin(alias),
|
||||
"hash", NV_BLTIN, bltin(alias),
|
||||
"enum", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(enum),
|
||||
"eval", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_EXIT,bltin(eval),
|
||||
"exit", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(return),
|
||||
|
@ -339,7 +339,7 @@ USAGE_LICENSE
|
|||
|
||||
const char sh_optalarm[] = "r [varname seconds]";
|
||||
const char sh_optalias[] =
|
||||
"[-1c?\n@(#)$Id: alias (AT&T Research) 1999-07-07 $\n]"
|
||||
"[-1c?\n@(#)$Id: alias (AT&T Research/ksh community) 2020-06-10 $\n]"
|
||||
USAGE_LICENSE
|
||||
"[+NAME?alias - define or display aliases]"
|
||||
"[+DESCRIPTION?\balias\b creates or redefines alias definitions "
|
||||
|
@ -363,10 +363,9 @@ USAGE_LICENSE
|
|||
"environment. It does not effect scripts run by this shell.]"
|
||||
"[p?Causes the output to be in the form of alias commands that can be used "
|
||||
"as input to the shell to recreate the current aliases.]"
|
||||
"[t?Used for tracked aliases. These are aliases that connect a "
|
||||
"command name to the pathname of the command and are reset "
|
||||
"when the \bPATH\b variable is unset. The tracked aliases feature is "
|
||||
"now obsolete.]"
|
||||
"[t?Each \aname\a is looked up as a command in \b$PATH\b and its path is "
|
||||
"added to the hash table as a 'tracked alias'. If no \aname\a is "
|
||||
"given, this prints the hash table. See \bhash(1)\b.]"
|
||||
"[x?Ignored, this option is obsolete.]"
|
||||
"\n"
|
||||
"\n[name[=value]...]\n"
|
||||
|
@ -932,13 +931,12 @@ _JOB_
|
|||
const char sh_opthash[] =
|
||||
"[-1c?\n@(#)$Id: hash (ksh community) 2020-06-10 $\n]"
|
||||
"[+NAME?hash - display the locations of recently used programs]"
|
||||
"[+DESCRIPTION?The \bhash\b utility is used to display or modify "
|
||||
"the hash table, which contains the locations of "
|
||||
"recently used programs. When \bhash\b is given no arguments, "
|
||||
"it will list all commands in the hash table. If \autility\a is "
|
||||
"supplied, \bhash\b will add that utility to the hash table.]"
|
||||
"[r?This option will empty the hash table. The effect of "
|
||||
"this flag can also be achieved by resetting the value of \bPATH\b.]"
|
||||
"[+DESCRIPTION?\bhash\b displays or modifies the hash table with the "
|
||||
"locations of recently used programs. If given no arguments, it lists "
|
||||
"all command/path associations (a.k.a. 'tracked aliases') in the hash "
|
||||
"table. Otherwise, \bhash\b performs a \bPATH\b search for each "
|
||||
"\autility\a supplied and adds the result to the hash table.]"
|
||||
"[r?Empty the hash table. This can also be achieved by resetting \bPATH\b.]"
|
||||
"\n"
|
||||
"\n[utility...]\n"
|
||||
"\n"
|
||||
|
@ -946,7 +944,6 @@ const char sh_opthash[] =
|
|||
"[+0?Successful completion.]"
|
||||
"[+>0?An error occured.]"
|
||||
"}"
|
||||
|
||||
"[+SEE ALSO?\bsh\b(1), \balias\b(1)]"
|
||||
;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue