From 251ec93396411cbb3f791d0e941e1cb688168d14 Mon Sep 17 00:00:00 2001
From: romkatv <roman.perepelitsa@gmail.com>
Date: Sat, 11 Jan 2020 15:47:59 +0100
Subject: limit the number of looked-at tokens to 32

---
 internal/parse.zsh | 234 +++++++++++++++++++++++++++--------------------------
 1 file changed, 119 insertions(+), 115 deletions(-)

(limited to 'internal')

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:#('(('*'))'|'`'*'`'|'$'*)})
-- 
cgit v1.2.3