]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil/native/FMUSimulator/src/stack.c
Mavenized FMIL projects.
[simantics/fmil.git] / org.simantics.fmil / native / FMUSimulator / src / stack.c
1 /* ------------------------------------------------------------------------- \r
2  * stack.c\r
3  * A stack of pointers. \r
4  * Copyright 2010 QTronic GmbH. All rights reserved. \r
5  * -------------------------------------------------------------------------*/ \r
6 \r
7 #include <stdio.h>\r
8 #include <stdlib.h>\r
9 #include <assert.h>\r
10 #include "stack.h"\r
11 \r
12 Stack* stackNew(int initialSize, int inc){\r
13     Stack* s = (Stack*)malloc(sizeof(Stack));\r
14     s->stack = NULL;\r
15     s->stackSize = 0;\r
16     s->stackPos = -1;\r
17     s->initialSize = initialSize;\r
18     s->inc = inc;\r
19     return s;\r
20 }\r
21 \r
22 int stackIsEmpty(Stack* s) {\r
23     return s->stackPos == -1;\r
24 }\r
25 \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
29     s->stackPos++;\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
34     }\r
35     s->stack[s->stackPos] = e;\r
36     return 1; // success\r
37 }\r
38 \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
44 }\r
45 \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
51 }\r
52 \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
56     int i;\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
61     }\r
62     array[n]=NULL; // terminating NULL\r
63     return array;\r
64 }\r
65 \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
69     int i;\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
75     s->stackPos = -1;\r
76     return array; \r
77 }\r
78 \r
79 // release the given stack\r
80 void stackFree(Stack* s){\r
81     if (s->stack) free(s->stack);\r
82     free(s);\r
83 }\r
84 \r
85 \r