From c4f68bd609ad7977d02dd490c2eb97ecbdec3058 Mon Sep 17 00:00:00 2001 From: romkatv Date: Sat, 11 Jan 2020 00:10:33 +0100 Subject: [PATCH] speed up parsing --- internal/parse.zsh | 124 ++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/internal/parse.zsh b/internal/parse.zsh index 4b29488a..261eb126 100644 --- a/internal/parse.zsh +++ b/internal/parse.zsh @@ -1,51 +1,3 @@ -function _p9k_skip_until() { - [[ -z $1 ]] && return - while _p9k_next_token 0; do - [[ $token == $~1 ]] && return - done -} - -function _p9k_next_token() { - if (( $#tokens == aln[-1] )); then - aln[-1]=() - alp[-1]=() - fi - - if (( $#tokens == alf[-1] )); then - alf[-1]=() - 1=1 - fi - - while (( $#tokens )); do - token=$tokens[1] - shift 1 tokens - - if (( $+galiases[$token] )); then - (( aln[(eI)p$token] )) && return - local n=p$token s=$galiases[$token] - elif (( ! $1 )); then - return - elif (( $+aliases[$token] )); then - (( aln[(eI)p$token] )) && return - local n=p$token s=$aliases[$token] - elif [[ $token == (#b)?*.(?*) ]] && (( $+saliases[$match[1]] )); then - (( aln[(eI)s$match[1]] )) && return - local 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 - - token= - return 1 -} - typeset -gA _p9k_skip_token=( '}' '' '|' '' @@ -117,35 +69,85 @@ function _p9k_extract_commands() { emulate -L zsh -o extended_glob -o no_nomatch $rcquotes typeset -ga _p9k_commands=() - local -a aln alp alf match mbegin mend + + local -i e + local id='$(<->|[[:alpha:]_][[:IDENT:]]#)' + local skip n s r var="\$$id|\${$id}|\"\$$id\"|\"\${$id}\"" + local -a aln alp alf v match mbegin mend + [[ -o interactive_comments ]] && local tokens=(${(Z+C+)1}) || local tokens=(${(z)1}) - while _p9k_next_token 1; do - local r=${token#<0-255>} + 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 + + 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 [[ -n $skip ]]; then + if [[ $token == $~skip ]]; then + [[ $token == ';'[';&|'] ]] && skip='\)|esac' || skip= + fi + continue + fi + + r=${token#<0-255>} if (( $+_p9k_skip_token[$r] )); then if (( $+_p9k_skip_token[$token] )); then - _p9k_skip_until $_p9k_skip_token[$token] + skip=$_p9k_skip_token[$token] continue fi if (( $+_p9k_redirect[$r] )); then - _p9k_next_token 0 + skip='*' continue fi fi if [[ $token == *=* ]]; then - local v=${(S)token/#(<->|([[:alpha:]_][[:IDENT:]]#(|'['*[^\\](\\\\)#']')))(|'+')=} + v=${(S)token/#(<->|([[:alpha:]_][[:IDENT:]]#(|'['*[^\\](\\\\)#']')))(|'+')=} if (( $#v < $#token )); then - [[ $v == '(' ]] && _p9k_skip_until '\)' + [[ $v == '(' ]] && skip='\)' continue fi fi if [[ $token == *'$'* ]]; then - local p='<->|[[:alpha:]_][[:IDENT:]]#' - if [[ $token == ('$'$~p|'${'$~p'}'|'"$'$~p'"'|'"${'$~p'}"') ]]; then - local name=${${token##[^[:IDENT:]]}%%[^[:IDENT:]]} - [[ $token == *'"' ]] && local v=("${(@P)name}") || local v=(${(P)name}) + if [[ $token == $~id ]]; then + n=${${token##[^[:IDENT:]]}%%[^[:IDENT:]]} + [[ $token == *'"' ]] && v=("${(@P)n}") || v=(${(P)name}) tokens[1,0]=(${(qq)v}) continue fi @@ -154,8 +156,6 @@ function _p9k_extract_commands() { _p9k_commands+=${token::=${(Q)${~token}}} # '|' '||' ';' '&' '&&' '|&' '&!' '&|' ';;' ';&' ';|' ')' - _p9k_skip_until '\||\|\||;|&|&&|\|&|&!|&\||;;|;&|;\||\)|}' - [[ $token == ';'(';'|'&'|'|') ]] && _p9k_skip_until '\)|esac' + skip='\||\|\||;|&|&&|\|&|&!|&\||;;|;&|;\||\)|}' done - true }