From 251ec93396411cbb3f791d0e941e1cb688168d14 Mon Sep 17 00:00:00 2001 From: romkatv Date: Sat, 11 Jan 2020 15:47:59 +0100 Subject: [PATCH] limit the number of looked-at tokens to 32 --- internal/parse.zsh | 234 +++++++++++++++++++++++---------------------- 1 file 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:#('(('*'))'|'`'*'`'|'$'*)})