Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. # A stack, using bash arrays.
  2. # ---------------------------------------------------------------------------
  3.  
  4. # Create a new stack.
  5. #
  6. # Usage: stack_new name
  7. #
  8. # Example: stack_new x
  9. function stack_new
  10. {
  11. : ${1?'Missing stack name'}
  12. if stack_exists $1
  13. then
  14. echo "Stack already exists -- $1" >&2
  15. return 1
  16. fi
  17.  
  18. eval "declare -ag _stack_$1"
  19. eval "declare -ig _stack_$1_i"
  20. eval "let _stack_$1_i=0"
  21. return 0
  22. }
  23.  
  24. # Destroy a stack
  25. #
  26. # Usage: stack_destroy name
  27. function stack_destroy
  28. {
  29. : ${1?'Missing stack name'}
  30. eval "unset _stack_$1 _stack_$1_i"
  31. return 0
  32. }
  33.  
  34. # Push one or more items onto a stack.
  35. #
  36. # Usage: stack_push stack item ...
  37. function stack_push
  38. {
  39. : ${1?'Missing stack name'}
  40. : ${2?'Missing item(s) to push'}
  41.  
  42. if no_such_stack $1
  43. then
  44. echo "No such stack -- $1" >&2
  45. return 1
  46. fi
  47.  
  48. stack=$1
  49. shift 1
  50.  
  51. while (( $# > 0 ))
  52. do
  53. eval '_i=$'"_stack_${stack}_i"
  54. eval "_stack_${stack}[$_i]='$1'"
  55. eval "let _stack_${stack}_i+=1"
  56. shift 1
  57. done
  58.  
  59. unset _i
  60. return 0
  61. }
  62.  
  63. # Print a stack to stdout.
  64. #
  65. # Usage: stack_print name
  66. function stack_print
  67. {
  68. : ${1?'Missing stack name'}
  69.  
  70. if no_such_stack $1
  71. then
  72. echo "No such stack -- $1" >&2
  73. return 1
  74. fi
  75.  
  76. tmp=""
  77. eval 'let _i=$'_stack_$1_i
  78. while (( $_i > 0 ))
  79. do
  80. let _i=${_i}-1
  81. eval 'e=$'"{_stack_$1[$_i]}"
  82. tmp="$tmp $e"
  83. done
  84. echo "(" $tmp ")"
  85. }
  86.  
  87. # Get the size of a stack
  88. #
  89. # Usage: stack_size name var
  90. #
  91. # Example:
  92. # stack_size mystack n
  93. # echo "Size is $n"
  94. function stack_size
  95. {
  96. : ${1?'Missing stack name'}
  97. : ${2?'Missing name of variable for stack size result'}
  98. if no_such_stack $1
  99. then
  100. echo "No such stack -- $1" >&2
  101. return 1
  102. fi
  103. eval "$2"='$'"{#_stack_$1[*]}"
  104. }
  105.  
  106. # Pop the top element from the stack.
  107. #
  108. # Usage: stack_pop name var
  109. #
  110. # Example:
  111. # stack_pop mystack top
  112. # echo "Got $top"
  113. function stack_pop
  114. {
  115. : ${1?'Missing stack name'}
  116. : ${2?'Missing name of variable for popped result'}
  117.  
  118. eval 'let _i=$'"_stack_$1_i"
  119. if no_such_stack $1
  120. then
  121. echo "No such stack -- $1" >&2
  122. return 1
  123. fi
  124.  
  125. if [[ "$_i" -eq 0 ]]
  126. then
  127. echo "Empty stack -- $1" >&2
  128. return 1
  129. fi
  130.  
  131. let _i-=1
  132. eval "$2"='$'"{_stack_$1[$_i]}"
  133. eval "unset _stack_$1[$_i]"
  134. eval "_stack_$1_i=$_i"
  135. unset _i
  136. return 0
  137. }
  138.  
  139. function no_such_stack
  140. {
  141. : ${1?'Missing stack name'}
  142. stack_exists $1
  143. ret=$?
  144. declare -i x
  145. let x="1-$ret"
  146. return $x
  147. }
  148.  
  149. function stack_exists
  150. {
  151. : ${1?'Missing stack name'}
  152.  
  153. eval '_i=$'"_stack_$1_i"
  154. if [[ -z "$_i" ]]
  155. then
  156. return 1
  157. else
  158. return 0
  159. fi
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement