1 /* -------------------------------------------------------------------------
\r
3 * A stack of pointers.
\r
4 * Copyright 2010 QTronic GmbH. All rights reserved.
\r
5 * -------------------------------------------------------------------------*/
\r
12 Stack* stackNew(int initialSize, int inc){
\r
13 Stack* s = (Stack*)malloc(sizeof(Stack));
\r
17 s->initialSize = initialSize;
\r
22 int stackIsEmpty(Stack* s) {
\r
23 return s->stackPos == -1;
\r
26 // add an element to stack and grow stack if required
\r
27 // returns 1 to indicate success and 0 for error
\r
28 int stackPush(Stack* s, void* e) {
\r
30 if (s->stackPos==s->stackSize){
\r
31 s->stackSize += (s->stack ? s->inc: s->initialSize);
\r
32 s->stack = (void**) realloc(s->stack, s->stackSize * sizeof(void*));
\r
33 if (!s->stack) return 0; // error;
\r
35 s->stack[s->stackPos] = e;
\r
36 return 1; // success
\r
39 // return top element (possibly NULL), if stack not empty
\r
40 // runtime error if stack is empty
\r
41 void* stackPeek(Stack* s){
\r
42 assert(!stackIsEmpty(s));
\r
43 return s->stack[s->stackPos];
\r
46 // remove top element (possibly NULL) from stack and return it
\r
47 // runtime error if stack is empty
\r
48 void* stackPop(Stack* s){
\r
49 assert(!stackIsEmpty(s));
\r
50 return s->stack[s->stackPos--];
\r
53 // return the last n elements as null terminated array,
\r
54 // or NULL if memory allocation fails
\r
55 void** stackLastPopedAsArray0(Stack* s, int n){
\r
57 void** array = (void**)malloc((n + 1)*sizeof(void*));
\r
58 if (! array) return NULL; // failure
\r
59 for (i=0; i<n; i++) {
\r
60 array[i] = s->stack[i+ s->stackPos + 1];
\r
62 array[n]=NULL; // terminating NULL
\r
66 // return stack as possibly empty array, or NULL if memory allocation fails
\r
67 // On sucessful return, the stack is empty.
\r
68 void** stackPopAllAsArray(Stack* s, int *size) {
\r
70 void** array = (void**)malloc((s->stackPos + 1)*sizeof(void*));
\r
71 if (! array) return NULL; // failure
\r
72 *size = s->stackPos + 1;
\r
73 for (i=0; i<*size; i++)
\r
74 array[i] = s->stack[i];
\r
79 // release the given stack
\r
80 void stackFree(Stack* s){
\r
81 if (s->stack) free(s->stack);
\r