Lines Matching defs:stack

6  * $Id: stack.c,v 1.11 2010/08/12 13:57:22 asau Exp $
60 * Check the parameter stack for underflow or overflow.
62 * the function checks the stack state for underflow and overflow.
63 * If size > 0, checks to see that the stack has room to push
65 * stack has room to pop that many cells. If any test fails,
69 ficlStackCheck(ficlStack *stack, int popCells, int pushCells)
72 int nFree = stack->size - STKDEPTH(stack);
74 if (popCells > STKDEPTH(stack))
75 ficlVmThrowError(stack->vm, "Error: %s stack underflow",
76 stack->name);
79 ficlVmThrowError(stack->vm, "Error: %s stack overflow",
80 stack->name);
82 FICL_IGNORE(stack);
96 ficlStack *stack = ficlMalloc(totalSize);
99 FICL_VM_ASSERT(vm, stack != NULL);
101 stack->size = size;
102 stack->frame = NULL;
104 stack->vm = vm;
105 stack->name = name;
107 ficlStackReset(stack);
108 return (stack);
115 ficlStackDestroy(ficlStack *stack)
117 if (stack)
118 ficlFree(stack);
125 ficlStackDepth(ficlStack *stack)
127 return (STKDEPTH(stack));
134 ficlStackDrop(ficlStack *stack, int n)
136 FICL_VM_ASSERT(stack->vm, n > 0);
137 stack->top -= n;
144 ficlStackFetch(ficlStack *stack, int n)
146 return (stack->top[-n]);
150 ficlStackStore(ficlStack *stack, int n, ficlCell c)
152 stack->top[-n] = c;
159 ficlStackGetTop(ficlStack *stack)
161 return (stack->top[0]);
167 * Link a frame using the stack's frame pointer. Allot space for
174 ficlStackLink(ficlStack *stack, int size)
176 ficlStackPushPointer(stack, stack->frame);
177 stack->frame = stack->top + 1;
178 stack->top += size;
183 * Unink a stack frame previously created by stackLink
188 ficlStackUnlink(ficlStack *stack)
190 stack->top = stack->frame - 1;
191 stack->frame = ficlStackPopPointer(stack);
199 ficlStackPick(ficlStack *stack, int n)
201 ficlStackPush(stack, ficlStackFetch(stack, n));
208 ficlStackPop(ficlStack *stack)
210 return (*stack->top--);
214 ficlStackPopPointer(ficlStack *stack)
216 return ((*stack->top--).p);
220 ficlStackPopUnsigned(ficlStack *stack)
222 return ((*stack->top--).u);
226 ficlStackPopInteger(ficlStack *stack)
228 return ((*stack->top--).i);
232 ficlStackPop2Integer(ficlStack *stack)
235 ficlInteger high = ficlStackPopInteger(stack);
236 ficlInteger low = ficlStackPopInteger(stack);
242 ficlStackPop2Unsigned(ficlStack *stack)
245 ficlUnsigned high = ficlStackPopUnsigned(stack);
246 ficlUnsigned low = ficlStackPopUnsigned(stack);
253 ficlStackPopFloat(ficlStack *stack)
255 return ((*stack->top--).f);
263 ficlStackPush(ficlStack *stack, ficlCell c)
265 *++stack->top = c;
269 ficlStackPushPointer(ficlStack *stack, void *ptr)
274 *++stack->top = c;
278 ficlStackPushInteger(ficlStack *stack, ficlInteger i)
283 *++stack->top = c;
287 ficlStackPushUnsigned(ficlStack *stack, ficlUnsigned u)
292 *++stack->top = c;
296 ficlStackPush2Unsigned(ficlStack *stack, ficl2Unsigned du)
298 ficlStackPushUnsigned(stack, FICL_2UNSIGNED_GET_LOW(du));
299 ficlStackPushUnsigned(stack, FICL_2UNSIGNED_GET_HIGH(du));
303 ficlStackPush2Integer(ficlStack *stack, ficl2Integer di)
308 ficlStackPush2Unsigned(stack, du);
313 ficlStackPushFloat(ficlStack *stack, ficlFloat f)
318 *++stack->top = c;
326 ficlStackReset(ficlStack *stack)
328 stack->top = stack->base - 1;
333 * Roll nth stack entry to the top (counting from zero), if n is
335 * If n < 0, roll top-of-stack to nth entry, pushing others
339 ficlStackRoll(ficlStack *stack, int n)
347 cell = stack->top - n;
356 cell = stack->top;
371 ficlStackSetTop(ficlStack *stack, ficlCell c)
373 FICL_STACK_CHECK(stack, 1, 1);
374 stack->top[0] = c;
378 ficlStackWalk(ficlStack *stack, ficlStackWalkFunction callback,
384 FICL_STACK_CHECK(stack, 0, 0);
386 depth = ficlStackDepth(stack);
387 cell = bottomToTop ? stack->base : stack->top;