| # -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- | |
| # Almost all code borrowed from Zshell's _make function | |
| # | |
| # Copyright (c) 2018 Sebastian Gniazdowski | |
| 
 | |
| local -a TARGETS | |
| 
 | |
| .make-expandVars() { | |
|     local open close var val front='' rest=$1 | |
| 
 | |
|     while [[ $rest == (#b)[^$]#($)* ]]; do | |
|         front=$front${rest[1,$mbegin[1]-1]} | |
|         rest=${rest[$mbegin[1],-1]} | |
| 
 | |
|         case $rest[2] in | |
|             ($)           # '$$'. may not appear in target and variable's value | |
|                 front=$front\$\$ | |
|                 rest=${rest[3,-1]} | |
|                 continue | |
|                 ;; | |
|                 (\()          # Variable of the form $(foobar) | |
|                 open='(' | |
|                 close=')' | |
|                 ;; | |
|             ({)           # ${foobar} | |
|                 open='{' | |
|                 close='}' | |
|                 ;; | |
|             ([[:alpha:]]) # $foobar. This is exactly $(f)oobar. | |
|                 open='' | |
|                 close='' | |
|                 var=$rest[2] | |
|                 ;; | |
|             (*)           # bad parameter name | |
|                 print -- $front$rest | |
|                 return 1 | |
|                 ;; | |
|         esac | |
| 
 | |
|         if [[ -n $open ]]; then | |
|             if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then | |
|                 var=$match | |
|             else  # unmatched () or {}, or bad parameter name | |
|                 print -- $front$rest | |
|                 return 1 | |
|             fi | |
|         fi | |
| 
 | |
|         val='' | |
|         if [[ -n ${VAR_ARGS[(i)$var]} ]]; then | |
|             val=${VAR_ARGS[$var]} | |
|         else | |
|             if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then | |
|                 if [[ $parameters[$var] == scalar-export* ]]; then | |
|                     val=${(P)var} | |
|                 elif [[ -n ${VARIABLES[(i)$var]} ]]; then | |
|                     val=${VARIABLES[$var]} | |
|                 fi | |
|             else | |
|                 if [[ -n ${VARIABLES[(i)$var]} ]]; then | |
|                     val=${VARIABLES[$var]} | |
|                 elif [[ $parameters[$var] == scalar-export* ]]; then | |
|                     val=${(P)var} | |
|                 fi | |
|             fi | |
|         fi | |
|         rest=${rest//\$$open$var$close/$val} | |
|     done | |
| 
 | |
|     print -- ${front}${rest} | |
| } | |
| 
 | |
| 
 | |
| .make-parseMakefile () { | |
|     local input var val target dep TAB=$'\t' tmp IFS= | |
| 
 | |
|     while read input | |
|     do | |
|         case "$input " in | |
|             # TARGET: dependencies | |
|             # TARGET1 TARGET2 TARGET3: dependencies | |
|             ([[*?[:alnum:]$][^$TAB:=%]#:[^=]*) | |
|             target=$(.make-expandVars ${input%%:*}) | |
|             TARGETS+=( ${(z)target} ) | |
|             ;; | |
|         esac | |
|     done | |
| } | |
| 
 | |
| if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then | |
|     .make-parseMakefile | |
|     FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS" | |
|     FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}" | |
| fi | |
| 
 | |
| reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" ) | |
| 
 | |
| # vim:ft=zsh:et
 |