+/* stack management */
+
+double get (int n)
+{
+ double ret = 0;
+ if ((n <= 0) || (n > stack_size)) {
+ VERBOSE (WARNING, fprintf (stdout, "error out of bound (%d/%d)\n", n, stack_size));
+ } else {
+ ret = stack[n - 1];
+ }
+ return ret;
+}
+
+double length ()
+{
+ return stack_size;
+}
+
+double pop ()
+{
+ double ret = 0;
+ if (stack_size > 0) {
+ ret = stack[--stack_size];
+ double *tmp = (double *) callocordie (stack_size, sizeof (double));
+ memcpy (tmp, stack, stack_size * sizeof (double));
+ free (stack);
+ stack = tmp;
+ } else {
+ VERBOSE (WARNING, fprintf (stdout, "error stack empty\n"));
+ }
+ return ret;
+}
+
+double push (double val)
+{
+ double *tmp = (double *) callocordie (stack_size + 1, sizeof (double));
+ memcpy (tmp, stack, stack_size * sizeof (double));
+ if (stack) {
+ free (stack);
+ }
+ stack = tmp;
+ stack[stack_size++] = val;
+ return val;
+}
+
+double put (int n, double val)
+{
+ if (n <= 0) {
+ VERBOSE (WARNING, fprintf (stdout, "error out of bound (%d/%d)\n", n, stack_size));
+ return 0;
+ }
+ if (n > stack_size) {
+ double *tmp = (double *) callocordie (n, sizeof (double));
+ memcpy (tmp, stack, stack_size * sizeof (double));
+ free (stack);
+ stack = tmp;
+ stack_size = n;
+ }
+ stack[n - 1] = val;
+ return val;
+}
+
+double set (int nbops, element_t **ops)
+{
+ int i;
+ if (stack) {
+ free (stack);
+ }
+ stack = NULL;
+ stack_size = 0;
+ if (nbops != 0) {
+ stack = (double *) callocordie (nbops, sizeof (double));
+ for (i = 0; i < nbops; i++) {
+ stack[i] = evaluate_element (ops[i], 0);
+ }
+ stack_size = nbops;
+ }
+ return stack_size;
+}
+
+void show (void)
+{
+ int i;
+ fprintf (stdout, "stack:");
+ for (i = 0; i < stack_size; i++) {
+ fprintf (stdout, " ");
+ fprintf (stdout, minform, stack[i]);
+ }
+ fprintf (stdout, "\n");
+}
+