please shellcheck, remove extglob (coz' wrong Emacs indent)

This commit is contained in:
2021-07-14 16:19:36 +02:00
parent 3311aa8372
commit fe54be9e59

View File

@@ -3,9 +3,9 @@
# ex1.bash: Advent2020 game, day 18/game 1. # ex1.bash: Advent2020 game, day 18/game 1.
CMD=${0##*/} CMD=${0##*/}
shopt -s extglob
set -o noglob set -o noglob
# shellcheck disable=2034
declare -a STACK=() declare -a STACK=()
declare -a LINE=() declare -a LINE=()
@@ -24,17 +24,20 @@ function dequeue() {
stack=( "${stack[@]}" ) # pack stack=( "${stack[@]}" ) # pack
} }
function eval_op() { function eval_op() {
# shellcheck disable=2034
local -n lvalop="$1" loptop="$2" local -n lvalop="$1" loptop="$2"
# shellcheck disable=2034
local v v1 v2 op res=-1 local v v1 v2 op res=-1
while ((${#lvalop[@]} > 1)); do while ((${#lvalop[@]} > 1)); do
dequeue lvalop v1 dequeue lvalop v1
dequeue lvalop v2 dequeue lvalop v2
dequeue loptop op dequeue loptop op
v=$((v1 $op v2)) # shellcheck disable=SC1102
v=$((v1 "$op" v2))
enqueue lvalop "$v" enqueue lvalop "$v"
((res++)) ((res++))
done done
return $res return "$res"
} }
function find_paren() { function find_paren() {
@@ -47,6 +50,7 @@ function find_paren() {
val=${expr_[$k]} val=${expr_[$k]}
[[ $val == '(' ]] && i="$k" [[ $val == '(' ]] && i="$k"
if [[ $val == ')' ]]; then if [[ $val == ')' ]]; then
# shellcheck disable=SC2034
var_="$i" var_="$i"
break break
fi fi
@@ -54,23 +58,22 @@ function find_paren() {
} }
function eval_expr() { function eval_expr() {
local -n gstack="$1"
#local -n expr=(${LINE[@]}) #"$3"
local -i cur="$2" val len=${#LINE[@]} local -i cur="$2" val len=${#LINE[@]}
local op local op
local -a lstack=() lop=() lstack_=() LINE_=() # shellcheck disable=SC2034
local -a lstack=() lop=() LINE_=()
while ((cur < len)); do while ((cur < len)); do
symbol=${LINE[$cur]} symbol=${LINE[$cur]}
case "$symbol" in case "$symbol" in
+([0-9])) [0-9]*)
enqueue lstack "${LINE[$cur]}" enqueue lstack "${LINE[$cur]}"
unset 'LINE[$cur]' unset 'LINE[$cur]'
;; ;;
\)) \))
break break
;; ;;
+([\+\*])) [\+\*]*)
enqueue lop "${LINE[$cur]}" enqueue lop "${LINE[$cur]}"
unset 'LINE[$cur]' unset 'LINE[$cur]'
;; ;;
@@ -84,10 +87,10 @@ function eval_expr() {
done done
dequeue lstack val dequeue lstack val
LINE[$cur]="$val" LINE[$cur]="$val"
LINE=(${LINE[@]}) # pack LINE=("${LINE[@]}") # pack
} }
declare -i res=0 num=0 paren=0 declare -i res=0 paren=0
while read -r line; do while read -r line; do
# cleanup input line, force split around operators and parens # cleanup input line, force split around operators and parens
@@ -97,21 +100,20 @@ while read -r line; do
line=${line//\// \/ } line=${line//\// \/ }
line=${line//\(/ \( } line=${line//\(/ \( }
line=${line//\)/ \) } line=${line//\)/ \) }
LINE=($line) read -ra LINE <<< "$line"
paren=0 paren=0
while ((${#LINE[@]} > 1 && paren >= 0)); do while ((${#LINE[@]} > 1 && paren >= 0)); do
find_paren LINE paren find_paren LINE paren
if (( paren >= 0 )); then if (( paren >= 0 )); then
unset LINE[$paren] unset 'LINE[$paren]'
LINE=(${LINE[@]}) # pack LINE=("${LINE[@]}") # pack
eval_expr STACK "$paren" eval_expr STACK "$paren"
LINE=(${LINE[@]}) # pack
fi fi
done done
if ((${#LINE[@]} > 1)); then if ((${#LINE[@]} > 1)); then
eval_expr STACK 0 eval_expr STACK 0
fi fi
((res+=${LINE[0]})) ((res+=LINE[0]))
done done
printf "%s : res=%d\n" "$CMD" "$res" printf "%s : res=%d\n" "$CMD" "$res"