###################################################################### # Stack 함수: Stack을 생성한다. # Example: func_stack_new name ###################################################################### func_stack_new() { : ${1?'Missing stack name'} if func_stack_exists $1 then echo "Stack already exists -- $1" >&2 return 1 fi eval "declare -ag _stack_$1" eval "declare -ig _stack_$1_i" eval "let _stack_$1_i=0" return 0 } ###################################################################### # Stack 함수: Stack을 제거한다. # Example: func_stack_destroy name ###################################################################### func_stack_destroy() { : ${1?'Missing stack name'} eval "unset _stack_$1 _stack_$1_i" return 0 } ###################################################################### # Stack 함수: Push # Example: func_stack_push stack item ... ###################################################################### func_stack_push() { : ${1?'Missing stack name'} : ${2?'Missing item(s) to push'} if func_no_such_stack $1 then echo "No such stack -- $1" >&2 return 1 fi stack=$1 shift 1 while (( $# > 0 )) do eval '_i=$'"_stack_${stack}_i" eval "_stack_${stack}[$_i]='$1'" eval "let _stack_${stack}_i+=1" shift 1 done unset _i return 0 } ###################################################################### # Stack 함수: Pop # Example: func_stack_pop mystack top # echo "Got $top" ###################################################################### func_stack_pop() { : ${1?'Missing stack name'} : ${2?'Missing name of variable for popped result'} eval 'let _i=$'"_stack_$1_i" if func_no_such_stack $1 then echo "No such stack -- $1" >&2 return 1 fi if [[ "$_i" -eq 0 ]] then echo "Empty stack -- $1" >&2 return 1 fi let _i-=1 eval "$2"='$'"{_stack_$1[$_i]}" eval "unset _stack_$1[$_i]" eval "_stack_$1_i=$_i" unset _i return 0 } ###################################################################### # Stack 함수: Stack 전체를 출력한다. # Example: func_stack_print name ###################################################################### func_stack_print() { : ${1?'Missing stack name'} if func_no_such_stack $1 then echo "No such stack -- $1" >&2 return 1 fi tmp="" eval 'let _i=$'_stack_$1_i while (( $_i > 0 )) do let _i=${_i}-1 eval 'e=$'"{_stack_$1[$_i]}" tmp="$tmp $e" done echo "(" $tmp ")" } ###################################################################### # Stack 함수: Stack 크기를 알아낸다. # Example: func_stack_size mystack n # echo "Size is $n" ###################################################################### func_stack_size() { : ${1?'Missing stack name'} : ${2?'Missing name of variable for stack size result'} if func_no_such_stack $1 then echo "No such stack -- $1" >&2 return 1 fi eval "$2"='$'"{#_stack_$1[*]}" } func_stack_exists() { : ${1?'Missing stack name'} eval '_i=$'"_stack_$1_i" if [[ -z "$_i" ]] then return 1 else return 0 fi } func_no_such_stack() { : ${1?'Missing stack name'} func_stack_exists $1 ret=$? declare -i x let x="1-$ret" return $x }