1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-12-28 16:15:02 +01:00

51464: utility to interpret zsh.h constants

This commit is contained in:
Bart Schaefer 2023-02-26 19:26:46 -08:00
parent 3d8c567d58
commit b3980ecc58
2 changed files with 603 additions and 0 deletions

View file

@ -1,5 +1,7 @@
2023-02-26 Bart Schaefer <schaefer@zsh.org>
* 51464: Util/printdefines: utility to interpret zsh.h constants
* unposted: Doc/Zsh/restricted.yo: fix typo
* 51460: Src/module.c: avoid crash on bad parameter autofeature

601
Util/printdefines Normal file
View file

@ -0,0 +1,601 @@
#!/bin/zsh -f
emulate -L zsh -o extendedglob
zmodload zsh/param/private
local -AHPrt jobstats=(
mapbase 16
$((0x0001)) STAT_CHANGED # status changed and not reported
$((0x0002)) STAT_STOPPED # all procs stopped or exited
$((0x0004)) STAT_TIMED # job is being timed
$((0x0008)) STAT_DONE # job is done
$((0x0010)) STAT_LOCKED # shell is finished creating this job,
# may be deleted from job table
$((0x0020)) STAT_NOPRINT # job was killed internally,
# we don't want to show that
$((0x0040)) STAT_INUSE # this job entry is in use
$((0x0080)) STAT_SUPERJOB # job has a subjob
$((0x0100)) STAT_SUBJOB # job is a subjob
$((0x0200)) STAT_WASSUPER # was a super-job, sub-job needs to be
# deleted
$((0x0400)) STAT_CURSH # last command is in current shell
$((0x0800)) STAT_NOSTTY # the tty settings are not inherited
# from this job when it exits.
$((0x1000)) STAT_ATTACH # delay reattaching shell to tty
$((0x2000)) STAT_SUBLEADER # is super-job, but leader is sub-shell
$((0x4000)) STAT_BUILTIN # job at tail of pipeline is a builtin
$((0x8000)) STAT_SUBJOB_ORPHANED
# STAT_SUBJOB with STAT_SUPERJOB exited
$((0x10000)) STAT_DISOWN # STAT_SUPERJOB with disown pending
#-1 SP_RUNNING # fake status for jobs currently running
)
local -AHPrt paramflags=(
mapbase 2
0 PM_SCALAR # scalar
$((1<<0)) PM_ARRAY # array
$((1<<1)) PM_INTEGER # integer
$((1<<2)) PM_EFLOAT # double with %e output
$((1<<3)) PM_FFLOAT # double with %f output
$((1<<4)) PM_HASHED # association
$((1<<5)) PM_LEFT # left justify, remove leading blanks
$((1<<6)) PM_RIGHT_B # right justify, fill with leading blanks
$((1<<7)) PM_RIGHT_Z # right justify, fill with leading zeros
$((1<<8)) PM_LOWER # all lower case
$((1<<9)) PM_UPPER # all upper case
# $((1<<9)) PM_UNDEFINED # undefined (autoloaded) shell function
$((1<<10)) PM_READONLY # readonly
$((1<<11)) PM_TAGGED # tagged
$((1<<12)) PM_EXPORTED # exported
# $((1<<12)) PM_ABSPATH_USED # (function): loaded using absolute path
$((1<<13)) PM_UNIQUE # remove duplicates
# $((1<<13)) PM_UNALIASED # (function) do not expand aliases
$((1<<14)) PM_HIDE # Special behaviour hidden by local
# $((1<<14)) PM_CUR_FPATH # (function): can use $fpath with filename
$((1<<15)) PM_HIDEVAL # Value not shown in `typeset' commands
# $((1<<15)) PM_WARNNESTED # (function): non-recursive WARNNESTEDVAR
$((1<<16)) PM_TIED # array tied to colon-path or v.v.
# $((1<<16)) PM_TAGGED_LOCAL # (function): non-recursive PM_TAGGED
# Remaining flags do not correspond directly to command line switches
$((1<<17)) PM_DONTIMPORT_SUID # do not import if running setuid
# $((1<<17)) PM_LOADDIR # (function) filename gives load directory
$((1<<18)) PM_SINGLE # special can only have a single instance
$((1<<18)) PM_ANONYMOUS # (function) anonymous function
$((1<<19)) PM_LOCAL # this parameter will be made local
# $((1<<19)) PM_KSHSTORED # (function) stored in ksh form
$((1<<20)) PM_SPECIAL # special builtin parameter
# $((1<<20)) PM_ZSHSTORED # (function) stored in zsh form
$((1<<21)) PM_RO_BY_DESIGN # specials that can be made read-only by user
##$(((1<<20)|(1<<10)|(1<<21))) PM_READONLY_SPECIAL
# $((1<<22)) PM_DONTIMPORT # do not import this variable
$((1<<22)) PM_DECLARED # explicitly named with typeset
$((1<<23)) PM_RESTRICTED # cannot be changed in restricted mode
$((1<<24)) PM_UNSET # has null value
##$(((1<<22)|(1<<24))) PM_DEFAULTED
$((1<<25)) PM_REMOVABLE # special can be removed from paramtab
$((1<<26)) PM_AUTOLOAD # autoloaded from module
$((1<<27)) PM_NORESTORE # do not restore value of local special
$((1<<27)) PM_AUTOALL # autoload all features in module
$((1<<28)) PM_HASHELEM # is a hash-element
$((1<<29)) PM_NAMEDDIR # has a corresponding nameddirtab entry
$((1<<30)) PM_NAMEREF # pointer to a different parameter
)
local -AHPrt chartokens=(
mapbase integer
$((83)) Meta
$((84)) Pound
$((85)) String
$((86)) Hat
$((87)) Star
$((88)) Inpar
$((89)) Inparmath
$((90)) Outbrace
$((91)) Inbrack
$((92)) Outbrack
$((93)) Tick
$((94)) Inang
$((95)) Outang
$((96)) OutangProc
$((97)) Quest
$((98)) Tilde
$((99)) Qtick
$((a0)) Bnullkeep
$((a1)) Nularg
$((a2)) Marker
)
local -AHPrt fdtabletype=(
mapbase integer
$((0)) FDT_UNUSED
$((1)) FDT_INTERNAL
$((2)) FDT_EXTERNAL
$((3)) FDT_MODULE
$((4)) FDT_XTRACE
$((5)) FDT_FLOCK
$((6)) FDT_FLOCK_EXEC
$((7)) FDT_PROC_SUBST
)
local -AHPrt inputstates=(
mapbase 2
$((1<<0)) INP_FREE
$((1<<1)) INP_ALIAS
$((1<<2)) INP_HIST
$((1<<3)) INP_CONT
$((1<<4)) INP_ALCONT
$((1<<5)) INP_HISTCONT
)
local -AHPrt metafytypes=(
mapbase integer
$((0)) META_REALLOC
$((1)) META_USEHEAP
$((2)) META_STATIC
$((3)) META_DUP
$((4)) META_ALLOC
$((5)) META_NOALLOC
$((6)) META_HEAPDUP
$((7)) META_HREALLOC
)
local -AHPrt jobtypes=(
mapbase 2
$((1<<0)) Z_TIMED # pipeline is being timed
$((1<<1)) Z_SYNC # run this sublist synchronously (;)
$((1<<2)) Z_ASYNC # run this sublist asynchronously (&)
$((1<<3)) Z_DISOWN # run this sublist without job control (&|)
$((1<<4)) Z_END
$((1<<5)) Z_SIMPLE
)
local -AHPrt condtypes=(
mapbase integer
$((0)) COND_NOT
$((1)) COND_AND
$((2)) COND_OR
$((3)) COND_STREQ
$((4)) COND_STRDEQ
$((5)) COND_STRNEQ
$((6)) COND_STRLT
$((7)) COND_STRGTR
$((8)) COND_NT
$((9)) COND_OT
$((10)) COND_EF
$((11)) COND_EQ
$((12)) COND_NE
$((13)) COND_LT
$((14)) COND_GT
$((15)) COND_LE
$((16)) COND_GE
$((17)) COND_REGEX
$((18)) COND_MOD
$((19)) COND_MODI
)
local -AHPrt wordcodes=(
mapbase integer
$((1)) WC_LIST
$((2)) WC_SUBLIST
$((3)) WC_PIPE
$((4)) WC_REDIR
$((5)) WC_ASSIGN
$((6)) WC_SIMPLE
$((7)) WC_TYPESET
$((8)) WC_SUBSH
$((9)) WC_CURSH
$((10)) WC_TIMED
$((11)) WC_FUNCDEF
$((12)) WC_FOR
$((13)) WC_SELECT
$((14)) WC_WHILE
$((15)) WC_REPEAT
$((16)) WC_CASE
$((17)) WC_IF
$((18)) WC_COND
$((19)) WC_ARITH
$((20)) WC_AUTOFN
$((21)) WC_TRY
$((22)) WC_COUNT
)
local -AHPrt wcsublists=(
mapbase 10
$((0)) WC_SUBLIST_END
$((1)) WC_SUBLIST_AND
$((2)) WC_SUBLIST_OR
$((4)) WC_SUBLIST_COPROC
$((8)) WC_SUBLIST_NOT
$((16)) WC_SUBLIST_SIMPLE
)
local -AHPrt eprogstates=(
mapbase 10
$((1)) EF_REAL
$((2)) EF_HEAP
$((4)) EF_MAP
$((8)) EF_RUN
)
local -AHPrt builtintypes=(
mapbase 2
$((1<<1)) BINF_PLUSOPTS # +xyz legal
$((1<<2)) BINF_PRINTOPTS
$((1<<3)) BINF_ADDED # is in the builtins hash table
$((1<<5)) BINF_PREFIX
$((1<<6)) BINF_DASH
$((1<<7)) BINF_BUILTIN
$((1<<8)) BINF_COMMAND
$((1<<9)) BINF_EXEC
$((1<<10)) BINF_NOGLOB
$((1<<11)) BINF_PSPECIAL
$((1<<12)) BINF_SKIPINVALID # Treat invalid option as argument
$((1<<13)) BINF_KEEPNUM # `[-+]NUM' can be an option
$((1<<14)) BINF_SKIPDASH # Treat `-' as argument (maybe `+')
$((1<<15)) BINF_DASHDASHVALID # Handle `--' even if SKIPINVALD
$((1<<16)) BINF_CLEARENV # new process started with cleared env
$((1<<17)) BINF_AUTOALL # autoload all features at once
$((1<<18)) BINF_HANDLES_OPTS
$((1<<19)) BINF_ASSIGN
)
local -AHPrt patflags=(
mapbase 16
$((0x0000)) PAT_HEAPDUP # Dummy flag for default behavior
$((0x0001)) PAT_FILE # Pattern is a file name
$((0x0002)) PAT_FILET # Pattern is top level file, affects ~
$((0x0004)) PAT_ANY # Match anything (cheap "*")
$((0x0008)) PAT_NOANCH # Not anchored at end
$((0x0010)) PAT_NOGLD # Don't glob dots
$((0x0020)) PAT_PURES # Pattern is a pure string: set internally
$((0x0040)) PAT_STATIC # Don't copy pattern to heap as per default
$((0x0080)) PAT_SCAN # Scanning, so don't try must-match test
$((0x0200)) PAT_NOTSTART # Start of string is not real start
$((0x0400)) PAT_NOTEND # End of string is not real end
$((0x0800)) PAT_HAS_EXCLUDP # (internal): top-level path1~path2.
)
local -AHPrt patclasses=(
mapbase integer
$((1)) PP_FIRST
$((1)) PP_ALPHA
$((2)) PP_ALNUM
$((3)) PP_ASCII
$((4)) PP_BLANK
$((5)) PP_CNTRL
$((6)) PP_DIGIT
$((7)) PP_GRAPH
$((8)) PP_LOWER
$((9)) PP_PRINT
$((10)) PP_PUNCT
$((11)) PP_SPACE
$((12)) PP_UPPER
$((13)) PP_XDIGIT
$((14)) PP_IDENT
$((15)) PP_IFS
$((16)) PP_IFSSPACE
$((17)) PP_WORD
$((18)) PP_INCOMPLETE
$((19)) PP_INVALID
$((19)) PP_LAST
$((20)) PP_UNKWN
$((21)) PP_RANGE
)
local -AHPrt globmodifiers=(
mapbase 16
$((0x0100)) GF_LCMATCHUC
$((0x0200)) GF_IGNCASE
$((0x0400)) GF_BACKREF
$((0x0800)) GF_MATCHREF
$((0x1000)) GF_MULTIBYTE # Use multibyte if supported by build
)
local -AHPrt scanparamflags=(
mapbase 2
$((1<<0)) SCANPM_WANTVALS # Return value includes hash values
$((1<<1)) SCANPM_WANTKEYS # Return value includes hash keys
$((1<<2)) SCANPM_WANTINDEX # Return value includes array index
$((1<<3)) SCANPM_MATCHKEY # Subscript matched against key
$((1<<4)) SCANPM_MATCHVAL # Subscript matched against value
$((1<<5)) SCANPM_MATCHMANY # Subscript matched repeatedly, return all
$((1<<6)) SCANPM_ASSIGNING # Assigning whole array/hash
$((1<<7)) SCANPM_KEYMATCH # keys of hash treated as patterns
$((1<<8)) SCANPM_DQUOTED # substitution was double-quoted
$((1<<9)) SCANPM_ARRONLY # value is array but we don't
$((1<<10)) SCANPM_CHECKING # Check if set, no need to create
$((1<<11)) SCANPM_NOEXEC # No command substitutions, etc.
)
local -AHPrt substmodifiers=(
mapbase 16
$((0x0001)) SUB_END # match end instead of beginning, % or %%
$((0x0002)) SUB_LONG # % or # doubled, get longest match
$((0x0004)) SUB_SUBSTR # match a substring
$((0x0008)) SUB_MATCH # include the matched portion
$((0x0010)) SUB_REST # include the unmatched portion
$((0x0020)) SUB_BIND # index of beginning of string
$((0x0040)) SUB_EIND # index of end of string
$((0x0080)) SUB_LEN # length of match
$((0x0100)) SUB_ALL # match complete string
$((0x0200)) SUB_GLOBAL # global substitution ${..//all/these}
$((0x0400)) SUB_DOSUBST # replacement string needs substituting
$((0x4000)) SUB_EGLOB # use extended globbing in patterns
)
local -AHPrt printnodeflags=(
mapbase 2
$((1<<0)) PRINT_NAMEONLY
$((1<<1)) PRINT_TYPE
$((1<<2)) PRINT_LIST
$((1<<3)) PRINT_KV_PAIR
$((1<<4)) PRINT_INCLUDEVALUE
$((1<<5)) PRINT_TYPESET
$((1<<6)) PRINT_LINE
$((1<<7)) PRINT_POSIX_EXPORT
$((1<<8)) PRINT_POSIX_READONLY
$((1<<7)) PRINT_WHENCE_CSH
$((1<<8)) PRINT_WHENCE_VERBOSE
$((1<<9)) PRINT_WHENCE_SIMPLE
$((1<<10)) PRINT_WHENCE_FUNCDEF
$((1<<11)) PRINT_WHENCE_WORD
)
local -AHPrt savehistflags=(
mapbase 16
$((0x00000001)) HIST_MAKEUNIQUE # Kill this new entry if not unique
$((0x00000002)) HIST_OLD # Command is already written to disk
$((0x00000004)) HIST_READ # Command was read back from disk
$((0x00000008)) HIST_DUP # Command duplicates a later line
$((0x00000010)) HIST_FOREIGN # Command came from another shell
$((0x00000020)) HIST_TMPSTORE # Kill when user enters another cmd
$((0x00000040)) HIST_NOWRITE # Keep internally but don't write
)
local -AHPrt histflags=(
mapbase 10
$((1)) HISTFLAG_DONE
$((2)) HISTFLAG_NOEXEC
$((4)) HISTFLAG_RECALL
$((8)) HISTFLAG_SETTY
)
local -AHPrt histfileflags=(
mapbase 16
$((0x0001)) HFILE_APPEND
$((0x0002)) HFILE_SKIPOLD
$((0x0004)) HFILE_SKIPDUPS
$((0x0008)) HFILE_SKIPFOREIGN
$((0x0010)) HFILE_FAST
$((0x0020)) HFILE_NO_REWRITE
$((0x8000)) HFILE_USE_OPTIONS
)
local -AHPrt modloadflags=(
mapbase 2
$((1<<0)) MOD_BUSY
$((1<<1)) MOD_UNLOAD
$((1<<2)) MOD_SETUP
$((1<<3)) MOD_LINKED
$((1<<4)) MOD_INIT_S
$((1<<5)) MOD_INIT_B
$((1<<6)) MOD_ALIAS
)
local -AHPrt modcondflags=(
mapbase 10
$((1)) CONDF_INFIX
$((2)) CONDF_ADDED
$((4)) CONDF_AUTOALL
)
local -AHPrt mathfunctypes=(
mapbase 10
$((1)) MFF_STR
$((2)) MFF_ADDED
$((4)) MFF_USERFUNC
$((8)) MFF_AUTOALL
)
local -AHPrt lexflags=(
mapbase 16
$((0x0001)) LEXFLAGS_ACTIVE
$((0x0002)) LEXFLAGS_ZLE
$((0x0004)) LEXFLAGS_COMMENTS_KEEP
$((0x0008)) LEXFLAGS_COMMENTS_STRIP
$((0x0010)) LEXFLAGS_NEWLINE
)
local -AHPrt lexstates=(
mapbase integer
$((0)) IN_NOTHING
$((1)) IN_CMD
$((2)) IN_MATH
$((3)) IN_COND
$((4)) IN_ENV
$((5)) IN_PAR
)
local -AHPrt emulations=(
mapbase 2
$((1<<1)) EMULATE_CSH # C shell
$((1<<2)) EMULATE_KSH # Korn shell
$((1<<3)) EMULATE_SH # Bourne shell
$((1<<4)) EMULATE_ZSH # `native' mode
)
local -AHPrt terminaltypes=(
mapbase 16
$((0x01)) TERM_BAD # terminal has extremely basic capabilities
$((0x02)) TERM_UNKNOWN # unknown terminal type
$((0x04)) TERM_NOUP # terminal has no up capability
$((0x08)) TERM_SHORT # terminal is < 3 lines high
$((0x10)) TERM_NARROW # terminal is < 3 columns wide
)
local -AHPrt termcapacts=(
mapbase integer
$((0)) TCCLEARSCREEN
$((1)) TCLEFT
$((2)) TCMULTLEFT
$((3)) TCRIGHT
$((4)) TCMULTRIGHT
$((5)) TCUP
$((6)) TCMULTUP
$((7)) TCDOWN
$((8)) TCMULTDOWN
$((9)) TCDEL
$((10)) TCMULTDEL
$((11)) TCINS
$((12)) TCMULTINS
$((13)) TCCLEAREOD
$((14)) TCCLEAREOL
$((15)) TCINSLINE
$((16)) TCDELLINE
$((17)) TCNEXTTAB
$((18)) TCBOLDFACEBEG
$((19)) TCFAINTBEG
$((20)) TCSTANDOUTBEG
$((21)) TCUNDERLINEBEG
$((22)) TCITALICSBEG
$((23)) TCALLATTRSOFF
$((24)) TCSTANDOUTEND
$((25)) TCUNDERLINEEND
$((26)) TCITALICSEND
$((27)) TCHORIZPOS
$((28)) TCUPCURSOR
$((29)) TCDOWNCURSOR
$((30)) TCLEFTCURSOR
$((31)) TCRIGHTCURSOR
$((32)) TCSAVECURSOR
$((33)) TCRESTRCURSOR
$((34)) TCBACKSPACE
$((35)) TCFGCOLOUR
$((36)) TCBGCOLOUR
)
local -AHPrt cmdstackstates=(
mapbase integer
$((0)) CS_FOR
$((1)) CS_WHILE
$((2)) CS_REPEAT
$((3)) CS_SELECT
$((4)) CS_UNTIL
$((5)) CS_IF
$((6)) CS_IFTHEN
$((7)) CS_ELSE
$((8)) CS_ELIF
$((9)) CS_MATH
$((10)) CS_COND
$((11)) CS_CMDOR
$((12)) CS_CMDAND
$((13)) CS_PIPE
$((14)) CS_ERRPIPE
$((15)) CS_FOREACH
$((16)) CS_CASE
$((17)) CS_FUNCDEF
$((18)) CS_SUBSH
$((19)) CS_CURSH
$((20)) CS_ARRAY
$((21)) CS_QUOTE
$((22)) CS_DQUOTE
$((23)) CS_BQUOTE
$((24)) CS_CMDSUBST
$((25)) CS_MATHSUBST
$((26)) CS_ELIFTHEN
$((27)) CS_HEREDOC
$((28)) CS_HEREDOCD
$((29)) CS_BRACE
$((30)) CS_BRACEPAR
$((31)) CS_ALWAYS
$((32)) CS_COUNT
)
zmodload zsh/parameter
local seek=${parameters[paramflags]}
if [[ $1 = (|-)-h(|elp) ]]
then
print -u2 Usage:
print -u2 " printdefines [ category ] [ name | value ]"
shift
fi
if [[ -z $1 ]]
then
print -u2 "Choose category:"
print -u2 -aC3 -- ${(ok)parameters[(R)$seek]}
return 1
fi
local -a outflag
if [[ -z $parameters[$1] || $parameters[$1] != $seek ]]
then
local -n scan
for scan in ${(k)parameters[(R)$seek]}
do
if [[ -n ${scan[(R)$1]} ]]
then
local -a hits
set -A hits ${${(nk)scan[(R)$~1]}:#mapbase}
integer -i ${scan[mapbase]/integer/10} w=${hits[-1]}
integer x=${#${scan[mapbase]/integer/}}+2
while (($#hits))
do
if [[ $scan[mapbase] = 2 ]]
then
w=${hits[1]}
local +i flag
if (( w ))
then
printf -v flag '1<<%d\t%s' $((${#w} - x)) $hits[1]
else
printf -v flag '0<<0\t%s' $hits[1]
fi
else
integer -i ${scan[mapbase]/integer/10} -Z ${#w} flag=${hits[1]}
fi
outflag+=($scan[$hits[1]] $flag )
shift hits
done
local +n scan # ${!scan}
print -aC2 -- "--- $scan" --- $outflag
local -n scan
outflag=()
fi
done
return 0
fi
local -n ref=$1
if [[ $2 = <-> ]]
then
integer i=$2
integer flag
if [[ $ref[mapbase] = integer ]]
then
if (( (i -= ${${ref[$2]:+$2}:-0}) == 0 ))
then
outflag=($ref[$2])
fi
else
for flag in ${${(nk)ref}:#mapbase}
do
if (( i == flag || flag > 0 && (i & flag) == flag ))
then
# print $i $flag
outflag+=(${ref[$flag]})
(( i -= flag ))
fi
done
fi
print $2 ${(j:|:)outflag}
if (( i ))
then
print Unknown $1: $i
fi
else
set -- ${${(nk)ref[(R)${~2:-*}]}:#mapbase}
integer -i ${ref[mapbase]/integer/10} w=${argv[-1]}
integer x=${#${ref[mapbase]/integer/}}+2
while ((ARGC))
do
if [[ $ref[mapbase] = 2 ]]
then
integer -i 2 w=$1
local +i flag
if (( w ))
then
printf -v flag '1<<%d\t%s' $((${#w} - x)) $1
else
printf -v flag '0<<0\t%s' $1
fi
else
integer -i ${ref[mapbase]/integer/10} -Z ${#w} flag=$1
fi
outflag+=($ref[$1] $flag )
shift
done
print -aC2 -- $outflag
fi