diff options
Diffstat (limited to 'dotfiles/system/.zsh/modules/Src/options.c')
| -rw-r--r-- | dotfiles/system/.zsh/modules/Src/options.c | 955 |
1 files changed, 0 insertions, 955 deletions
diff --git a/dotfiles/system/.zsh/modules/Src/options.c b/dotfiles/system/.zsh/modules/Src/options.c deleted file mode 100644 index 600b649..0000000 --- a/dotfiles/system/.zsh/modules/Src/options.c +++ /dev/null @@ -1,955 +0,0 @@ -/* - * options.c - shell options - * - * This file is part of zsh, the Z shell. - * - * Copyright (c) 1992-1997 Paul Falstad - * All rights reserved. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and to distribute modified versions of this software for any - * purpose, provided that the above copyright notice and the following - * two paragraphs appear in all copies of this software. - * - * In no event shall Paul Falstad or the Zsh Development Group be liable - * to any party for direct, indirect, special, incidental, or consequential - * damages arising out of the use of this software and its documentation, - * even if Paul Falstad and the Zsh Development Group have been advised of - * the possibility of such damage. - * - * Paul Falstad and the Zsh Development Group specifically disclaim any - * warranties, including, but not limited to, the implied warranties of - * merchantability and fitness for a particular purpose. The software - * provided hereunder is on an "as is" basis, and Paul Falstad and the - * Zsh Development Group have no obligation to provide maintenance, - * support, updates, enhancements, or modifications. - * - */ - -#include "zsh.mdh" -#include "options.pro" - -/* current emulation (used to decide which set of option letters is used) */ - -/**/ -mod_export int emulation; - -/* current sticky emulation: sticky = NULL means none */ - -/**/ -mod_export Emulation_options sticky; - -/* the options; e.g. if opts[SHGLOB] != 0, SH_GLOB is turned on */ - -/**/ -mod_export char opts[OPT_SIZE]; - -/* Option name hash table */ - -/**/ -mod_export HashTable optiontab; - -/* The canonical option name table */ - -#define OPT_CSH EMULATE_CSH -#define OPT_KSH EMULATE_KSH -#define OPT_SH EMULATE_SH -#define OPT_ZSH EMULATE_ZSH - -#define OPT_ALL (OPT_CSH|OPT_KSH|OPT_SH|OPT_ZSH) -#define OPT_BOURNE (OPT_KSH|OPT_SH) -#define OPT_BSHELL (OPT_KSH|OPT_SH|OPT_ZSH) -#define OPT_NONBOURNE (OPT_ALL & ~OPT_BOURNE) -#define OPT_NONZSH (OPT_ALL & ~OPT_ZSH) - -/* option is relevant to emulation */ -#define OPT_EMULATE (EMULATE_UNUSED) -/* option should never be set by emulate() */ -#define OPT_SPECIAL (EMULATE_UNUSED<<1) -/* option is an alias to an other option */ -#define OPT_ALIAS (EMULATE_UNUSED<<2) - -#define defset(X, my_emulation) (!!((X)->node.flags & my_emulation)) - -/* - * Note that option names should usually be fewer than 20 characters long - * to avoid formatting problems. - */ -static struct optname optns[] = { -{{NULL, "aliases", OPT_EMULATE|OPT_ALL}, ALIASESOPT}, -{{NULL, "aliasfuncdef", OPT_EMULATE|OPT_BOURNE}, ALIASFUNCDEF}, -{{NULL, "allexport", OPT_EMULATE}, ALLEXPORT}, -{{NULL, "alwayslastprompt", OPT_ALL}, ALWAYSLASTPROMPT}, -{{NULL, "alwaystoend", 0}, ALWAYSTOEND}, -{{NULL, "appendcreate", OPT_EMULATE|OPT_BOURNE}, APPENDCREATE}, -{{NULL, "appendhistory", OPT_ALL}, APPENDHISTORY}, -{{NULL, "autocd", OPT_EMULATE}, AUTOCD}, -{{NULL, "autocontinue", 0}, AUTOCONTINUE}, -{{NULL, "autolist", OPT_ALL}, AUTOLIST}, -{{NULL, "automenu", OPT_ALL}, AUTOMENU}, -{{NULL, "autonamedirs", 0}, AUTONAMEDIRS}, -{{NULL, "autoparamkeys", OPT_ALL}, AUTOPARAMKEYS}, -{{NULL, "autoparamslash", OPT_ALL}, AUTOPARAMSLASH}, -{{NULL, "autopushd", 0}, AUTOPUSHD}, -{{NULL, "autoremoveslash", OPT_ALL}, AUTOREMOVESLASH}, -{{NULL, "autoresume", 0}, AUTORESUME}, -{{NULL, "badpattern", OPT_EMULATE|OPT_NONBOURNE},BADPATTERN}, -{{NULL, "banghist", OPT_NONBOURNE}, BANGHIST}, -{{NULL, "bareglobqual", OPT_EMULATE|OPT_ZSH}, BAREGLOBQUAL}, -{{NULL, "bashautolist", 0}, BASHAUTOLIST}, -{{NULL, "bashrematch", 0}, BASHREMATCH}, -{{NULL, "beep", OPT_ALL}, BEEP}, -{{NULL, "bgnice", OPT_EMULATE|OPT_NONBOURNE},BGNICE}, -{{NULL, "braceccl", OPT_EMULATE}, BRACECCL}, -{{NULL, "bsdecho", OPT_EMULATE|OPT_SH}, BSDECHO}, -{{NULL, "caseglob", OPT_ALL}, CASEGLOB}, -{{NULL, "casematch", OPT_ALL}, CASEMATCH}, -{{NULL, "cbases", 0}, CBASES}, -{{NULL, "cprecedences", OPT_EMULATE|OPT_NONZSH}, CPRECEDENCES}, -{{NULL, "cdablevars", OPT_EMULATE}, CDABLEVARS}, -{{NULL, "chasedots", OPT_EMULATE}, CHASEDOTS}, -{{NULL, "chaselinks", OPT_EMULATE}, CHASELINKS}, -{{NULL, "checkjobs", OPT_EMULATE|OPT_ZSH}, CHECKJOBS}, -{{NULL, "checkrunningjobs", OPT_EMULATE|OPT_ZSH}, CHECKRUNNINGJOBS}, -{{NULL, "clobber", OPT_EMULATE|OPT_ALL}, CLOBBER}, -{{NULL, "combiningchars", 0}, COMBININGCHARS}, -{{NULL, "completealiases", 0}, COMPLETEALIASES}, -{{NULL, "completeinword", 0}, COMPLETEINWORD}, -{{NULL, "continueonerror", 0}, CONTINUEONERROR}, -{{NULL, "correct", 0}, CORRECT}, -{{NULL, "correctall", 0}, CORRECTALL}, -{{NULL, "cshjunkiehistory", OPT_EMULATE|OPT_CSH}, CSHJUNKIEHISTORY}, -{{NULL, "cshjunkieloops", OPT_EMULATE|OPT_CSH}, CSHJUNKIELOOPS}, -{{NULL, "cshjunkiequotes", OPT_EMULATE|OPT_CSH}, CSHJUNKIEQUOTES}, -{{NULL, "cshnullcmd", OPT_EMULATE|OPT_CSH}, CSHNULLCMD}, -{{NULL, "cshnullglob", OPT_EMULATE|OPT_CSH}, CSHNULLGLOB}, -{{NULL, "debugbeforecmd", OPT_ALL}, DEBUGBEFORECMD}, -{{NULL, "emacs", 0}, EMACSMODE}, -{{NULL, "equals", OPT_EMULATE|OPT_ZSH}, EQUALS}, -{{NULL, "errexit", OPT_EMULATE}, ERREXIT}, -{{NULL, "errreturn", OPT_EMULATE}, ERRRETURN}, -{{NULL, "exec", OPT_ALL}, EXECOPT}, -{{NULL, "extendedglob", OPT_EMULATE}, EXTENDEDGLOB}, -{{NULL, "extendedhistory", OPT_CSH}, EXTENDEDHISTORY}, -{{NULL, "evallineno", OPT_EMULATE|OPT_ZSH}, EVALLINENO}, -{{NULL, "flowcontrol", OPT_ALL}, FLOWCONTROL}, -{{NULL, "forcefloat", 0}, FORCEFLOAT}, -{{NULL, "functionargzero", OPT_EMULATE|OPT_NONBOURNE},FUNCTIONARGZERO}, -{{NULL, "glob", OPT_EMULATE|OPT_ALL}, GLOBOPT}, -{{NULL, "globalexport", OPT_EMULATE|OPT_ZSH}, GLOBALEXPORT}, -{{NULL, "globalrcs", OPT_ALL}, GLOBALRCS}, -{{NULL, "globassign", OPT_EMULATE|OPT_CSH}, GLOBASSIGN}, -{{NULL, "globcomplete", 0}, GLOBCOMPLETE}, -{{NULL, "globdots", OPT_EMULATE}, GLOBDOTS}, -{{NULL, "globstarshort", OPT_EMULATE}, GLOBSTARSHORT}, -{{NULL, "globsubst", OPT_EMULATE|OPT_NONZSH}, GLOBSUBST}, -{{NULL, "hashcmds", OPT_ALL}, HASHCMDS}, -{{NULL, "hashdirs", OPT_ALL}, HASHDIRS}, -{{NULL, "hashexecutablesonly", 0}, HASHEXECUTABLESONLY}, -{{NULL, "hashlistall", OPT_ALL}, HASHLISTALL}, -{{NULL, "histallowclobber", 0}, HISTALLOWCLOBBER}, -{{NULL, "histbeep", OPT_ALL}, HISTBEEP}, -{{NULL, "histexpiredupsfirst",0}, HISTEXPIREDUPSFIRST}, -{{NULL, "histfcntllock", 0}, HISTFCNTLLOCK}, -{{NULL, "histfindnodups", 0}, HISTFINDNODUPS}, -{{NULL, "histignorealldups", 0}, HISTIGNOREALLDUPS}, -{{NULL, "histignoredups", 0}, HISTIGNOREDUPS}, -{{NULL, "histignorespace", 0}, HISTIGNORESPACE}, -{{NULL, "histlexwords", 0}, HISTLEXWORDS}, -{{NULL, "histnofunctions", 0}, HISTNOFUNCTIONS}, -{{NULL, "histnostore", 0}, HISTNOSTORE}, -{{NULL, "histsubstpattern", OPT_EMULATE}, HISTSUBSTPATTERN}, -{{NULL, "histreduceblanks", 0}, HISTREDUCEBLANKS}, -{{NULL, "histsavebycopy", OPT_ALL}, HISTSAVEBYCOPY}, -{{NULL, "histsavenodups", 0}, HISTSAVENODUPS}, -{{NULL, "histverify", 0}, HISTVERIFY}, -{{NULL, "hup", OPT_EMULATE|OPT_ZSH}, HUP}, -{{NULL, "ignorebraces", OPT_EMULATE|OPT_SH}, IGNOREBRACES}, -{{NULL, "ignoreclosebraces", OPT_EMULATE}, IGNORECLOSEBRACES}, -{{NULL, "ignoreeof", 0}, IGNOREEOF}, -{{NULL, "incappendhistory", 0}, INCAPPENDHISTORY}, -{{NULL, "incappendhistorytime", 0}, INCAPPENDHISTORYTIME}, -{{NULL, "interactive", OPT_SPECIAL}, INTERACTIVE}, -{{NULL, "interactivecomments",OPT_BOURNE}, INTERACTIVECOMMENTS}, -{{NULL, "ksharrays", OPT_EMULATE|OPT_BOURNE}, KSHARRAYS}, -{{NULL, "kshautoload", OPT_EMULATE|OPT_BOURNE}, KSHAUTOLOAD}, -{{NULL, "kshglob", OPT_EMULATE|OPT_KSH}, KSHGLOB}, -{{NULL, "kshoptionprint", OPT_EMULATE|OPT_KSH}, KSHOPTIONPRINT}, -{{NULL, "kshtypeset", 0}, KSHTYPESET}, -{{NULL, "kshzerosubscript", 0}, KSHZEROSUBSCRIPT}, -{{NULL, "listambiguous", OPT_ALL}, LISTAMBIGUOUS}, -{{NULL, "listbeep", OPT_ALL}, LISTBEEP}, -{{NULL, "listpacked", 0}, LISTPACKED}, -{{NULL, "listrowsfirst", 0}, LISTROWSFIRST}, -{{NULL, "listtypes", OPT_ALL}, LISTTYPES}, -{{NULL, "localoptions", OPT_EMULATE|OPT_KSH}, LOCALOPTIONS}, -{{NULL, "localloops", OPT_EMULATE}, LOCALLOOPS}, -{{NULL, "localpatterns", OPT_EMULATE}, LOCALPATTERNS}, -{{NULL, "localtraps", OPT_EMULATE|OPT_KSH}, LOCALTRAPS}, -{{NULL, "login", OPT_SPECIAL}, LOGINSHELL}, -{{NULL, "longlistjobs", 0}, LONGLISTJOBS}, -{{NULL, "magicequalsubst", OPT_EMULATE}, MAGICEQUALSUBST}, -{{NULL, "mailwarning", 0}, MAILWARNING}, -{{NULL, "markdirs", 0}, MARKDIRS}, -{{NULL, "menucomplete", 0}, MENUCOMPLETE}, -{{NULL, "monitor", OPT_SPECIAL}, MONITOR}, -{{NULL, "multibyte", -#ifdef MULTIBYTE_SUPPORT - OPT_ALL -#else - 0 -#endif - }, MULTIBYTE}, -{{NULL, "multifuncdef", OPT_EMULATE|OPT_ZSH}, MULTIFUNCDEF}, -{{NULL, "multios", OPT_EMULATE|OPT_ZSH}, MULTIOS}, -{{NULL, "nomatch", OPT_EMULATE|OPT_NONBOURNE},NOMATCH}, -{{NULL, "notify", OPT_ZSH}, NOTIFY}, -{{NULL, "nullglob", OPT_EMULATE}, NULLGLOB}, -{{NULL, "numericglobsort", OPT_EMULATE}, NUMERICGLOBSORT}, -{{NULL, "octalzeroes", OPT_EMULATE|OPT_SH}, OCTALZEROES}, -{{NULL, "overstrike", 0}, OVERSTRIKE}, -{{NULL, "pathdirs", OPT_EMULATE}, PATHDIRS}, -{{NULL, "pathscript", OPT_EMULATE|OPT_BOURNE}, PATHSCRIPT}, -{{NULL, "pipefail", OPT_EMULATE}, PIPEFAIL}, -{{NULL, "posixaliases", OPT_EMULATE|OPT_BOURNE}, POSIXALIASES}, -{{NULL, "posixargzero", OPT_EMULATE}, POSIXARGZERO}, -{{NULL, "posixbuiltins", OPT_EMULATE|OPT_BOURNE}, POSIXBUILTINS}, -{{NULL, "posixcd", OPT_EMULATE|OPT_BOURNE}, POSIXCD}, -{{NULL, "posixidentifiers", OPT_EMULATE|OPT_BOURNE}, POSIXIDENTIFIERS}, -{{NULL, "posixjobs", OPT_EMULATE|OPT_BOURNE}, POSIXJOBS}, -{{NULL, "posixstrings", OPT_EMULATE|OPT_BOURNE}, POSIXSTRINGS}, -{{NULL, "posixtraps", OPT_EMULATE|OPT_BOURNE}, POSIXTRAPS}, -{{NULL, "printeightbit", 0}, PRINTEIGHTBIT}, -{{NULL, "printexitvalue", 0}, PRINTEXITVALUE}, -{{NULL, "privileged", OPT_SPECIAL}, PRIVILEGED}, -{{NULL, "promptbang", OPT_KSH}, PROMPTBANG}, -{{NULL, "promptcr", OPT_ALL}, PROMPTCR}, -{{NULL, "promptpercent", OPT_NONBOURNE}, PROMPTPERCENT}, -{{NULL, "promptsp", OPT_ALL}, PROMPTSP}, -{{NULL, "promptsubst", OPT_BOURNE}, PROMPTSUBST}, -{{NULL, "pushdignoredups", OPT_EMULATE}, PUSHDIGNOREDUPS}, -{{NULL, "pushdminus", OPT_EMULATE}, PUSHDMINUS}, -{{NULL, "pushdsilent", 0}, PUSHDSILENT}, -{{NULL, "pushdtohome", OPT_EMULATE}, PUSHDTOHOME}, -{{NULL, "rcexpandparam", OPT_EMULATE}, RCEXPANDPARAM}, -{{NULL, "rcquotes", OPT_EMULATE}, RCQUOTES}, -{{NULL, "rcs", OPT_ALL}, RCS}, -{{NULL, "recexact", 0}, RECEXACT}, -{{NULL, "rematchpcre", 0}, REMATCHPCRE}, -{{NULL, "restricted", OPT_SPECIAL}, RESTRICTED}, -{{NULL, "rmstarsilent", OPT_BOURNE}, RMSTARSILENT}, -{{NULL, "rmstarwait", 0}, RMSTARWAIT}, -{{NULL, "sharehistory", OPT_KSH}, SHAREHISTORY}, -{{NULL, "shfileexpansion", OPT_EMULATE|OPT_BOURNE}, SHFILEEXPANSION}, -{{NULL, "shglob", OPT_EMULATE|OPT_BOURNE}, SHGLOB}, -{{NULL, "shinstdin", OPT_SPECIAL}, SHINSTDIN}, -{{NULL, "shnullcmd", OPT_EMULATE|OPT_BOURNE}, SHNULLCMD}, -{{NULL, "shoptionletters", OPT_EMULATE|OPT_BOURNE}, SHOPTIONLETTERS}, -{{NULL, "shortloops", OPT_EMULATE|OPT_NONBOURNE},SHORTLOOPS}, -{{NULL, "shwordsplit", OPT_EMULATE|OPT_BOURNE}, SHWORDSPLIT}, -{{NULL, "singlecommand", OPT_SPECIAL}, SINGLECOMMAND}, -{{NULL, "singlelinezle", OPT_KSH}, SINGLELINEZLE}, -{{NULL, "sourcetrace", 0}, SOURCETRACE}, -{{NULL, "sunkeyboardhack", 0}, SUNKEYBOARDHACK}, -{{NULL, "transientrprompt", 0}, TRANSIENTRPROMPT}, -{{NULL, "trapsasync", 0}, TRAPSASYNC}, -{{NULL, "typesetsilent", OPT_EMULATE|OPT_BOURNE}, TYPESETSILENT}, -{{NULL, "unset", OPT_EMULATE|OPT_BSHELL}, UNSET}, -{{NULL, "verbose", 0}, VERBOSE}, -{{NULL, "vi", 0}, VIMODE}, -{{NULL, "warncreateglobal", OPT_EMULATE}, WARNCREATEGLOBAL}, -{{NULL, "warnnestedvar", OPT_EMULATE}, WARNNESTEDVAR}, -{{NULL, "xtrace", 0}, XTRACE}, -{{NULL, "zle", OPT_SPECIAL}, USEZLE}, -{{NULL, "braceexpand", OPT_ALIAS}, /* ksh/bash */ -IGNOREBRACES}, -{{NULL, "dotglob", OPT_ALIAS}, /* bash */ GLOBDOTS}, -{{NULL, "hashall", OPT_ALIAS}, /* bash */ HASHCMDS}, -{{NULL, "histappend", OPT_ALIAS}, /* bash */ APPENDHISTORY}, -{{NULL, "histexpand", OPT_ALIAS}, /* bash */ BANGHIST}, -{{NULL, "log", OPT_ALIAS}, /* ksh */ -HISTNOFUNCTIONS}, -{{NULL, "mailwarn", OPT_ALIAS}, /* bash */ MAILWARNING}, -{{NULL, "onecmd", OPT_ALIAS}, /* bash */ SINGLECOMMAND}, -{{NULL, "physical", OPT_ALIAS}, /* ksh/bash */ CHASELINKS}, -{{NULL, "promptvars", OPT_ALIAS}, /* bash */ PROMPTSUBST}, -{{NULL, "stdin", OPT_ALIAS}, /* ksh */ SHINSTDIN}, -{{NULL, "trackall", OPT_ALIAS}, /* ksh */ HASHCMDS}, -{{NULL, "dvorak", 0}, DVORAK}, -{{NULL, NULL, 0}, 0} -}; - -/* Option letters */ - -#define optletters (isset(SHOPTIONLETTERS) ? kshletters : zshletters) - -#define FIRST_OPT '0' -#define LAST_OPT 'y' - -static short zshletters[LAST_OPT - FIRST_OPT + 1] = { - /* 0 */ CORRECT, - /* 1 */ PRINTEXITVALUE, - /* 2 */ -BADPATTERN, - /* 3 */ -NOMATCH, - /* 4 */ GLOBDOTS, - /* 5 */ NOTIFY, - /* 6 */ BGNICE, - /* 7 */ IGNOREEOF, - /* 8 */ MARKDIRS, - /* 9 */ AUTOLIST, - /* : */ 0, - /* ; */ 0, - /* < */ 0, - /* = */ 0, - /* > */ 0, - /* ? */ 0, - /* @ */ 0, - /* A */ 0, /* use with set for arrays */ - /* B */ -BEEP, - /* C */ -CLOBBER, - /* D */ PUSHDTOHOME, - /* E */ PUSHDSILENT, - /* F */ -GLOBOPT, - /* G */ NULLGLOB, - /* H */ RMSTARSILENT, - /* I */ IGNOREBRACES, - /* J */ AUTOCD, - /* K */ -BANGHIST, - /* L */ SUNKEYBOARDHACK, - /* M */ SINGLELINEZLE, - /* N */ AUTOPUSHD, - /* O */ CORRECTALL, - /* P */ RCEXPANDPARAM, - /* Q */ PATHDIRS, - /* R */ LONGLISTJOBS, - /* S */ RECEXACT, - /* T */ CDABLEVARS, - /* U */ MAILWARNING, - /* V */ -PROMPTCR, - /* W */ AUTORESUME, - /* X */ LISTTYPES, - /* Y */ MENUCOMPLETE, - /* Z */ USEZLE, - /* [ */ 0, - /* \ */ 0, - /* ] */ 0, - /* ^ */ 0, - /* _ */ 0, - /* ` */ 0, - /* a */ ALLEXPORT, - /* b */ 0, /* in non-Bourne shells, end of options */ - /* c */ 0, /* command follows */ - /* d */ -GLOBALRCS, - /* e */ ERREXIT, - /* f */ -RCS, - /* g */ HISTIGNORESPACE, - /* h */ HISTIGNOREDUPS, - /* i */ INTERACTIVE, - /* j */ 0, - /* k */ INTERACTIVECOMMENTS, - /* l */ LOGINSHELL, - /* m */ MONITOR, - /* n */ -EXECOPT, - /* o */ 0, /* long option name follows */ - /* p */ PRIVILEGED, - /* q */ 0, - /* r */ RESTRICTED, - /* s */ SHINSTDIN, - /* t */ SINGLECOMMAND, - /* u */ -UNSET, - /* v */ VERBOSE, - /* w */ CHASELINKS, - /* x */ XTRACE, - /* y */ SHWORDSPLIT, -}; - -static short kshletters[LAST_OPT - FIRST_OPT + 1] = { - /* 0 */ 0, - /* 1 */ 0, - /* 2 */ 0, - /* 3 */ 0, - /* 4 */ 0, - /* 5 */ 0, - /* 6 */ 0, - /* 7 */ 0, - /* 8 */ 0, - /* 9 */ 0, - /* : */ 0, - /* ; */ 0, - /* < */ 0, - /* = */ 0, - /* > */ 0, - /* ? */ 0, - /* @ */ 0, - /* A */ 0, - /* B */ 0, - /* C */ -CLOBBER, - /* D */ 0, - /* E */ 0, - /* F */ 0, - /* G */ 0, - /* H */ 0, - /* I */ 0, - /* J */ 0, - /* K */ 0, - /* L */ 0, - /* M */ 0, - /* N */ 0, - /* O */ 0, - /* P */ 0, - /* Q */ 0, - /* R */ 0, - /* S */ 0, - /* T */ TRAPSASYNC, - /* U */ 0, - /* V */ 0, - /* W */ 0, - /* X */ MARKDIRS, - /* Y */ 0, - /* Z */ 0, - /* [ */ 0, - /* \ */ 0, - /* ] */ 0, - /* ^ */ 0, - /* _ */ 0, - /* ` */ 0, - /* a */ ALLEXPORT, - /* b */ NOTIFY, - /* c */ 0, - /* d */ 0, - /* e */ ERREXIT, - /* f */ -GLOBOPT, - /* g */ 0, - /* h */ 0, - /* i */ INTERACTIVE, - /* j */ 0, - /* k */ 0, - /* l */ LOGINSHELL, - /* m */ MONITOR, - /* n */ -EXECOPT, - /* o */ 0, - /* p */ PRIVILEGED, - /* q */ 0, - /* r */ RESTRICTED, - /* s */ SHINSTDIN, - /* t */ SINGLECOMMAND, - /* u */ -UNSET, - /* v */ VERBOSE, - /* w */ 0, - /* x */ XTRACE, - /* y */ 0, -}; - -/* Initialisation of the option name hash table */ - -/**/ -static void -printoptionnode(HashNode hn, int set) -{ - Optname on = (Optname) hn; - int optno = on->optno; - - if (optno < 0) - optno = -optno; - if (isset(KSHOPTIONPRINT)) { - if (defset(on, emulation)) - printf("no%-19s %s\n", on->node.nam, isset(optno) ? "off" : "on"); - else - printf("%-21s %s\n", on->node.nam, isset(optno) ? "on" : "off"); - } else if (set == (isset(optno) ^ defset(on, emulation))) { - if (set ^ isset(optno)) - fputs("no", stdout); - puts(on->node.nam); - } -} - -/**/ -void -createoptiontable(void) -{ - Optname on; - - optiontab = newhashtable(101, "optiontab", NULL); - - optiontab->hash = hasher; - optiontab->emptytable = NULL; - optiontab->filltable = NULL; - optiontab->cmpnodes = strcmp; - optiontab->addnode = addhashnode; - optiontab->getnode = gethashnode; - optiontab->getnode2 = gethashnode2; - optiontab->removenode = NULL; - optiontab->disablenode = disablehashnode; - optiontab->enablenode = enablehashnode; - optiontab->freenode = NULL; - optiontab->printnode = printoptionnode; - - for (on = optns; on->node.nam; on++) - optiontab->addnode(optiontab, on->node.nam, on); -} - -/* Emulation appropriate to the setemulate function */ - -static int setemulate_emulation; - -/* Option array manipulated within the setemulate function */ - -/**/ -static char *setemulate_opts; - -/* Setting of default options */ - -/**/ -static void -setemulate(HashNode hn, int fully) -{ - Optname on = (Optname) hn; - - /* Set options: each non-special option is set according to the * - * current emulation mode if either it is considered relevant * - * to emulation or we are doing a full emulation (as indicated * - * by the `fully' parameter). */ - if (!(on->node.flags & OPT_ALIAS) && - ((fully && !(on->node.flags & OPT_SPECIAL)) || - (on->node.flags & OPT_EMULATE))) - setemulate_opts[on->optno] = defset(on, setemulate_emulation); -} - -/**/ -void -installemulation(int new_emulation, char *new_opts) -{ - setemulate_emulation = new_emulation; - setemulate_opts = new_opts; - scanhashtable(optiontab, 0, 0, 0, setemulate, - !!(new_emulation & EMULATE_FULLY)); -} - -/**/ -void -emulate(const char *zsh_name, int fully, int *new_emulation, char *new_opts) -{ - char ch = *zsh_name; - - if (ch == 'r') - ch = zsh_name[1]; - - /* Work out the new emulation mode */ - if (ch == 'c') - *new_emulation = EMULATE_CSH; - else if (ch == 'k') - *new_emulation = EMULATE_KSH; - else if (ch == 's' || ch == 'b') - *new_emulation = EMULATE_SH; - else - *new_emulation = EMULATE_ZSH; - - if (fully) - *new_emulation |= EMULATE_FULLY; - installemulation(*new_emulation, new_opts); - - if (funcstack && funcstack->tp == FS_FUNC) { - /* - * We are inside a function. Decide if it's traced. - * Pedantic note: the function in the function table isn't - * guaranteed to be what we're executing, but it's - * close enough. - */ - Shfunc shf = (Shfunc)shfunctab->getnode(shfunctab, funcstack->name); - if (shf && (shf->node.flags & (PM_TAGGED|PM_TAGGED_LOCAL))) { - /* Tracing is on, so set xtrace */ - new_opts[XTRACE] = 1; - } - } -} - -/* setopt, unsetopt */ - -/**/ -static void -setoption(HashNode hn, int value) -{ - dosetopt(((Optname) hn)->optno, value, 0, opts); -} - -/**/ -int -bin_setopt(char *nam, char **args, UNUSED(Options ops), int isun) -{ - int action, optno, match = 0; - - /* With no arguments or options, display options. */ - if (!*args) { - scanhashtable(optiontab, 1, 0, OPT_ALIAS, optiontab->printnode, !isun); - return 0; - } - - /* loop through command line options (begins with "-" or "+") */ - while (*args && (**args == '-' || **args == '+')) { - action = (**args == '-') ^ isun; - if(!args[0][1]) - *args = "--"; - while (*++*args) { - if(**args == Meta) - *++*args ^= 32; - /* The pseudo-option `--' signifies the end of options. */ - if (**args == '-') { - args++; - goto doneoptions; - } else if (**args == 'o') { - if (!*++*args) - args++; - if (!*args) { - zwarnnam(nam, "string expected after -o"); - inittyptab(); - return 1; - } - if(!(optno = optlookup(*args))) - zwarnnam(nam, "no such option: %s", *args); - else if(dosetopt(optno, action, 0, opts)) - zwarnnam(nam, "can't change option: %s", *args); - break; - } else if(**args == 'm') { - match = 1; - } else { - if (!(optno = optlookupc(**args))) - zwarnnam(nam, "bad option: -%c", **args); - else if(dosetopt(optno, action, 0, opts)) - zwarnnam(nam, "can't change option: -%c", **args); - } - } - args++; - } - doneoptions: - - if (!match) { - /* Not globbing the arguments -- arguments are simply option names. */ - while (*args) { - if(!(optno = optlookup(*args++))) - zwarnnam(nam, "no such option: %s", args[-1]); - else if(dosetopt(optno, !isun, 0, opts)) - zwarnnam(nam, "can't change option: %s", args[-1]); - } - } else { - /* Globbing option (-m) set. */ - while (*args) { - Patprog pprog; - char *s, *t; - - t = s = dupstring(*args); - while (*t) - if (*t == '_') - chuck(t); - else { - /* See comment in optlookup() */ - if (*t >= 'A' && *t <= 'Z') - *t = (*t - 'A') + 'a'; - t++; - } - - /* Expand the current arg. */ - tokenize(s); - if (!(pprog = patcompile(s, PAT_HEAPDUP, NULL))) { - zwarnnam(nam, "bad pattern: %s", *args); - continue; - } - /* Loop over expansions. */ - scanmatchtable(optiontab, pprog, 0, 0, OPT_ALIAS, - setoption, !isun); - args++; - } - } - inittyptab(); - return 0; -} - -/* Identify an option name */ - -/**/ -mod_export int -optlookup(char const *name) -{ - char *s, *t; - Optname n; - - s = t = dupstring(name); - - /* exorcise underscores, and change to lowercase */ - while (*t) - if (*t == '_') - chuck(t); - else { - /* - * Some locales (in particular tr_TR.UTF-8) may - * have non-standard mappings of ASCII characters, - * so be careful. Option names must be ASCII so - * we don't need to be too clever. - */ - if (*t >= 'A' && *t <= 'Z') - *t = (*t - 'A') + 'a'; - t++; - } - - /* look up name in the table */ - if (s[0] == 'n' && s[1] == 'o' && - (n = (Optname) optiontab->getnode(optiontab, s + 2))) { - return -n->optno; - } else if ((n = (Optname) optiontab->getnode(optiontab, s))) - return n->optno; - else - return OPT_INVALID; -} - -/* Identify an option letter */ - -/**/ -int -optlookupc(char c) -{ - if(c < FIRST_OPT || c > LAST_OPT) - return 0; - - return optletters[c - FIRST_OPT]; -} - -/**/ -static void -restrictparam(char *nam) -{ - Param pm = (Param) paramtab->getnode(paramtab, nam); - - if (pm) { - pm->node.flags |= PM_SPECIAL | PM_RESTRICTED; - return; - } - createparam(nam, PM_SCALAR | PM_UNSET | PM_SPECIAL | PM_RESTRICTED); -} - -/* list of restricted parameters which are not otherwise special */ -static char *rparams[] = { - "SHELL", "HISTFILE", "LD_LIBRARY_PATH", "LD_AOUT_LIBRARY_PATH", - "LD_PRELOAD", "LD_AOUT_PRELOAD", NULL -}; - -/* Set or unset an option, as a result of user request. The option * - * number may be negative, indicating that the sense is reversed * - * from the usual meaning of the option. */ - -/**/ -mod_export int -dosetopt(int optno, int value, int force, char *new_opts) -{ - if(!optno) - return -1; - if(optno < 0) { - optno = -optno; - value = !value; - } - if (optno == RESTRICTED) { - if (isset(RESTRICTED)) - return value ? 0 : -1; - if (value) { - char **s; - - for (s = rparams; *s; s++) - restrictparam(*s); - } - } else if(!force && optno == EXECOPT && !value && interact) { - /* cannot set noexec when interactive */ - return -1; - } else if(!force && (optno == INTERACTIVE || optno == SHINSTDIN || - optno == SINGLECOMMAND)) { - if (new_opts[optno] == value) - return 0; - /* it is not permitted to change the value of these options */ - return -1; - } else if(!force && optno == USEZLE && value) { - /* we require a terminal in order to use ZLE */ - if(!interact || SHTTY == -1 || !shout) - return -1; - } else if(optno == PRIVILEGED && !value) { - /* unsetting PRIVILEGED causes the shell to make itself unprivileged */ -#ifdef HAVE_SETUID - int ignore_err; - errno = 0; - /* - * Set the GID first as if we set the UID to non-privileged it - * might be impossible to restore the GID. - * - * Some OSes (possibly no longer around) have been known to - * fail silently the first time, so we attempt the change twice. - * If it fails we are guaranteed to pick this up the second - * time, so ignore the first time. - * - * Some versions of gcc make it hard to ignore the results the - * first time, hence the following. (These are probably not - * systems that require the doubled calls.) - */ - ignore_err = setgid(getgid()); - (void)ignore_err; - ignore_err = setuid(getuid()); - (void)ignore_err; - if (setgid(getgid())) { - zwarn("failed to change group ID: %e", errno); - return -1; - } else if (setuid(getuid())) { - zwarn("failed to change user ID: %e", errno); - return -1; - } -#else - zwarn("setuid not available"); - return -1; -#endif /* not HAVE_SETUID */ -#ifdef JOB_CONTROL - } else if (!force && optno == MONITOR && value) { - if (new_opts[optno] == value) - return 0; - if (SHTTY != -1) { - origpgrp = GETPGRP(); - acquire_pgrp(); - } else - return -1; -#else - } else if(optno == MONITOR && value) { - return -1; -#endif /* not JOB_CONTROL */ -#ifdef GETPWNAM_FAKED - } else if(optno == CDABLEVARS && value) { - return -1; -#endif /* GETPWNAM_FAKED */ - } else if ((optno == EMACSMODE || optno == VIMODE) && value) { - if (sticky && sticky->emulation) - return -1; - zleentry(ZLE_CMD_SET_KEYMAP, optno); - new_opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0; - } else if (optno == SUNKEYBOARDHACK) { - /* for backward compatibility */ - keyboardhackchar = (value ? '`' : '\0'); - } - new_opts[optno] = value; - if (optno == BANGHIST || optno == SHINSTDIN) - inittyptab(); - return 0; -} - -/* Function to get value for special parameter `-' */ - -/**/ -char * -dashgetfn(UNUSED(Param pm)) -{ - static char buf[LAST_OPT - FIRST_OPT + 2]; - char *val = buf; - int i; - - for(i = 0; i <= LAST_OPT - FIRST_OPT; i++) { - int optno = optletters[i]; - if(optno && ((optno > 0) ? isset(optno) : unset(-optno))) - *val++ = FIRST_OPT + i; - } - *val = '\0'; - return buf; -} - -/* print options for set -o/+o */ - -/**/ -void -printoptionstates(int hadplus) -{ - scanhashtable(optiontab, 1, 0, OPT_ALIAS, printoptionnodestate, hadplus); -} - -/**/ -static void -printoptionnodestate(HashNode hn, int hadplus) -{ - Optname on = (Optname) hn; - int optno = on->optno; - - if (hadplus) { - printf("set %co %s%s\n", - defset(on, emulation) != isset(optno) ? '-' : '+', - defset(on, emulation) ? "no" : "", - on->node.nam); - } else { - if (defset(on, emulation)) - printf("no%-19s %s\n", on->node.nam, isset(optno) ? "off" : "on"); - else - printf("%-21s %s\n", on->node.nam, isset(optno) ? "on" : "off"); - } -} - -/* Print option list for --help */ - -/**/ -void -printoptionlist(void) -{ - short *lp; - char c; - - printf("\nNamed options:\n"); - scanhashtable(optiontab, 1, 0, OPT_ALIAS, printoptionlist_printoption, 0); - printf("\nOption aliases:\n"); - scanhashtable(optiontab, 1, OPT_ALIAS, 0, printoptionlist_printoption, 0); - printf("\nOption letters:\n"); - for(lp = optletters, c = FIRST_OPT; c <= LAST_OPT; lp++, c++) { - if(!*lp) - continue; - printf(" -%c ", c); - printoptionlist_printequiv(*lp); - } -} - -/**/ -static void -printoptionlist_printoption(HashNode hn, UNUSED(int ignored)) -{ - Optname on = (Optname) hn; - - if(on->node.flags & OPT_ALIAS) { - printf(" --%-19s ", on->node.nam); - printoptionlist_printequiv(on->optno); - } else - printf(" --%s\n", on->node.nam); -} - -/**/ -static void -printoptionlist_printequiv(int optno) -{ - int isneg = optno < 0; - - optno *= (isneg ? -1 : 1); - printf(" equivalent to --%s%s\n", isneg ? "no-" : "", optns[optno-1].node.nam); -} - -/**/ -static char *print_emulate_opts; - -/**/ -static void -print_emulate_option(HashNode hn, int fully) -{ - Optname on = (Optname) hn; - - if (!(on->node.flags & OPT_ALIAS) && - ((fully && !(on->node.flags & OPT_SPECIAL)) || - (on->node.flags & OPT_EMULATE))) - { - if (!print_emulate_opts[on->optno]) - fputs("no", stdout); - puts(on->node.nam); - } -} - -/* - * List the settings of options associated with an emulation - */ - -/**/ -void list_emulate_options(char *cmdopts, int fully) -{ - print_emulate_opts = cmdopts; - scanhashtable(optiontab, 1, 0, 0, print_emulate_option, fully); -} |
