summaryrefslogtreecommitdiff
path: root/internal/parse.zsh
diff options
context:
space:
mode:
authorromkatv <roman.perepelitsa@gmail.com>2020-01-11 17:47:59 +0300
committerromkatv <roman.perepelitsa@gmail.com>2020-01-11 17:47:59 +0300
commit251ec93396411cbb3f791d0e941e1cb688168d14 (patch)
tree9c6d42955b6273b04a6df57e2d4c5bff49a9042f /internal/parse.zsh
parent2db236fc690f008ac02715fa3995ab1d3f7e4e27 (diff)
limit the number of looked-at tokens to 32
Diffstat (limited to 'internal/parse.zsh')
-rw-r--r--internal/parse.zsh234
1 files changed, 119 insertions, 115 deletions
diff --git a/internal/parse.zsh b/internal/parse.zsh
index 1b1aba1e..a551af32 100644
--- a/internal/parse.zsh
+++ b/internal/parse.zsh
@@ -97,44 +97,46 @@ typeset -gA _p9k_skip_arg=(
)
function _p9k_next_token() {
- if (( $#tokens == aln[-1] )); then
- aln[-1]=()
- alp[-1]=()
- if (( $#tokens == alf[-1] )); then
- alf[-1]=()
- (( e = 0 ))
+ if (( $#tokens )); then
+ if (( $#tokens == aln[-1] )); then
+ aln[-1]=()
+ alp[-1]=()
+ if (( $#tokens == alf[-1] )); then
+ alf[-1]=()
+ (( e = 0 ))
+ else
+ (( e = 1 ))
+ fi
else
(( e = 1 ))
fi
- else
- (( e = 1 ))
- fi
- while (( $#tokens )); do
- token=$tokens[1]
- shift 1 tokens
- if (( $+galiases[$token] )); then
- (( $aln[(eI)p$token] )) && return
- n=p$token
- s=$galiases[$token]
- elif (( e )); then
- return
- elif (( $+aliases[$token] )); then
- (( $aln[(eI)p$token] )) && return
- n=p$token
- s=$aliases[$token]
- elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then
- (( $aln[(eI)s$match[1]] )) && return
- n=s$match[1]
- s=${saliases[$match[1]]%% #}
- else
- return 0
- fi
- aln+=$n
- alp+=$#tokens
- [[ $s == *' ' ]] && alf+=$#tokens
- [[ -o interactive_comments ]] && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s})
- done
+ while (( c-- > 0 )); do
+ token=$tokens[1]
+ tokens[1]=()
+ if (( $+galiases[$token] )); then
+ (( $aln[(eI)p$token] )) && return
+ n=p$token
+ s=$galiases[$token]
+ elif (( e )); then
+ return
+ elif (( $+aliases[$token] )); then
+ (( $aln[(eI)p$token] )) && return
+ n=p$token
+ s=$aliases[$token]
+ elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then
+ (( $aln[(eI)s$match[1]] )) && return
+ n=s$match[1]
+ s=${saliases[$match[1]]%% #}
+ else
+ return 0
+ fi
+ aln+=$n
+ alp+=$#tokens
+ [[ $s == *' ' ]] && alf+=$#tokens
+ [[ -o interactive_comments ]] && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s})
+ done
+ fi
token=
return 1
@@ -182,108 +184,110 @@ function _p9k_extract_commands() {
local -r id='$(<->|[[:alpha:]_][[:IDENT:]]#)'
local -r var="\$$id|\${$id}|\"\$$id\"|\"\${$id}\""
- local -i e
+ local -i e c=32
local skip n s r
local -a aln alp alf v commands match mbegin mend
[[ -o interactive_comments ]] && local tokens=(${(Z+C+)1}) || local tokens=(${(z)1})
- while (( $#tokens )); do
- if (( $#tokens == aln[-1] )); then
- aln[-1]=()
- alp[-1]=()
- if (( $#tokens == alf[-1] )); then
- alf[-1]=()
- (( e = 0 ))
+ () {
+ while (( $#tokens )); do
+ if (( $#tokens == aln[-1] )); then
+ aln[-1]=()
+ alp[-1]=()
+ if (( $#tokens == alf[-1] )); then
+ alf[-1]=()
+ (( e = 0 ))
+ else
+ (( e = $#skip ))
+ fi
else
(( e = $#skip ))
fi
- else
- (( e = $#skip ))
- fi
-
- while (( $#tokens )) || break; do
- token=$tokens[1]
- shift 1 tokens
- if (( $+galiases[$token] )); then
- (( $aln[(eI)p$token] )) && break
- n=p$token
- s=$galiases[$token]
- elif (( e )); then
- break
- elif (( $+aliases[$token] )); then
- (( $aln[(eI)p$token] )) && break
- n=p$token
- s=$aliases[$token]
- elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then
- (( $aln[(eI)s$match[1]] )) && break
- n=s$match[1]
- s=${saliases[$match[1]]%% #}
- else
- break
- fi
- aln+=$n
- alp+=$#tokens
- [[ $s == *' ' ]] && alf+=$#tokens
- [[ -o interactive_comments ]] && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s})
- done
- if [[ $token == '<<'(|-) ]]; then
- _p9k_next_token || break
- r=$token
- while true; do
- while _p9k_next_token && [[ $token != ';' ]]; do done
- while _p9k_next_token && [[ $token == ';' ]]; do done
- [[ $token == (|$r) ]] && break
+ while (( c-- > 0 )) || return; do
+ token=$tokens[1]
+ tokens[1]=()
+ if (( $+galiases[$token] )); then
+ (( $aln[(eI)p$token] )) && break
+ n=p$token
+ s=$galiases[$token]
+ elif (( e )); then
+ break
+ elif (( $+aliases[$token] )); then
+ (( $aln[(eI)p$token] )) && break
+ n=p$token
+ s=$aliases[$token]
+ elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then
+ (( $aln[(eI)s$match[1]] )) && break
+ n=s$match[1]
+ s=${saliases[$match[1]]%% #}
+ else
+ break
+ fi
+ aln+=$n
+ alp+=$#tokens
+ [[ $s == *' ' ]] && alf+=$#tokens
+ [[ -o interactive_comments ]] && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s})
done
- continue
- fi
- if [[ -n $skip ]]; then
- if [[ $skip == ']' ]]; then
- if (( $+_p9k_term[$token] )); then
- skip=$_p9k_skip_arg[$token]
- [[ $token == '()' ]] || _p9k_commands+=($commands)
- commands=()
- fi
- elif [[ $token == $~skip ]]; then
- skip=
+ if [[ $token == '<<'(|-) ]]; then
+ _p9k_next_token || return
+ r=$token
+ while true; do
+ while _p9k_next_token && [[ $token != ';' ]]; do done
+ while _p9k_next_token && [[ $token == ';' ]]; do done
+ [[ $token == (|$r) ]] && break
+ done
+ continue
fi
- continue
- fi
- r=${token#<0-255>}
- if (( $+_p9k_skip_token[$r] )); then
- if (( $+_p9k_skip_token[$token] )); then
- skip=$_p9k_skip_token[$token]
+ if [[ -n $skip ]]; then
+ if [[ $skip == ']' ]]; then
+ if (( $+_p9k_term[$token] )); then
+ skip=$_p9k_skip_arg[$token]
+ [[ $token == '()' ]] || _p9k_commands+=($commands)
+ commands=()
+ fi
+ elif [[ $token == $~skip ]]; then
+ skip=
+ fi
continue
fi
- if (( $+_p9k_redirect[$r] )); then
- skip='*'
- continue
+
+ r=${token#<0-255>}
+ if (( $+_p9k_skip_token[$r] )); then
+ if (( $+_p9k_skip_token[$token] )); then
+ skip=$_p9k_skip_token[$token]
+ continue
+ fi
+ if (( $+_p9k_redirect[$r] )); then
+ skip='*'
+ continue
+ fi
fi
- fi
- if [[ $token == *=* ]]; then
- v=${(S)token/#(<->|([[:alpha:]_][[:IDENT:]]#(|'['*[^\\](\\\\)#']')))(|'+')=}
- if (( $#v < $#token )); then
- [[ $v == '(' ]] && skip='\)'
- continue
+ if [[ $token == *=* ]]; then
+ v=${(S)token/#(<->|([[:alpha:]_][[:IDENT:]]#(|'['*[^\\](\\\\)#']')))(|'+')=}
+ if (( $#v < $#token )); then
+ [[ $v == '(' ]] && skip='\)'
+ continue
+ fi
fi
- fi
- if [[ $token == *'$'* ]]; then
- if [[ $token == $~id ]]; then
- n=${${token##[^[:IDENT:]]}%%[^[:IDENT:]]}
- [[ $token == *'"' ]] && v=("${(@P)n}") || v=(${(P)name})
- tokens[1,0]=(${(qq)v})
- continue
+ if [[ $token == *'$'* ]]; then
+ if [[ $token == $~id ]]; then
+ n=${${token##[^[:IDENT:]]}%%[^[:IDENT:]]}
+ [[ $token == *'"' ]] && v=("${(@P)n}") || v=(${(P)name})
+ tokens[1,0]=(${(qq)v})
+ continue
+ fi
fi
- fi
- commands+=${:-${(Q)${~token}}}
- skip=']'
- done
+ commands+=${:-${(Q)${~token}}}
+ skip=']'
+ done
+ }
_p9k_commands+=($commands)
_p9k_commands=(${(u)_p9k_commands:#('(('*'))'|'`'*'`'|'$'*)})