use tab_t for storage
[calc.git] / stack.c
1 #include <stdio.h>
2
3 #include "debug.h"
4 #include "format.h"
5 #include "parser.h"
6 #include "tabular.h"
7
8 #include "stack.h"
9
10 /* global variables */
11
12 tab_t * stack = NULL;
13
14 /* stack management */
15
16 double get (int n)
17 {
18 return get_tab (stack, n);
19 }
20
21 double length ()
22 {
23 return size_tab (stack);
24 }
25
26 double pop ()
27 {
28 return pop_tab (stack, -1);
29 }
30
31 double push (double val)
32 {
33 return push_tab (stack, -1, val);
34 }
35
36 double put (int n, double val)
37 {
38 if (n > size_tab (stack)) {
39 stack = resize_tab (stack, n);
40 }
41 return set_tab (stack, n, val);
42 }
43
44 double set (int nbops, element_t **ops)
45 {
46 int i;
47 stack = resize_tab (stack, nbops);
48 for (i = 0; i < nbops; i++) {
49 set_tab (stack, i + 1, evaluate_element (ops[i], 0));
50 }
51 return size_tab (stack);
52 }
53
54 void show (void)
55 {
56 int i, n = size_tab (stack);
57 fprintf (stdout, "stack:");
58 for (i = 0; i < n; i++) {
59 fprintf (stdout, " ");
60 fprintf (stdout, minform, get_tab (stack, i + 1));
61 }
62 fprintf (stdout, "\n");
63 }
64
65 /* stack functions */
66
67 double max ()
68 {
69 double ret = 0;
70 int i, n = size_tab (stack);
71 if (n < 1) {
72 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
73 return 0;
74 }
75 ret = get_tab (stack, 1);
76 for (i = 1; i < n; i++) {
77 double cur = get_tab (stack, i + 1);
78 if (cur > ret) {
79 ret = cur;
80 }
81 }
82 return ret;
83 }
84
85 double mean ()
86 {
87 double ret = 0;
88 int i, n = size_tab (stack);
89 if (n < 1) {
90 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
91 return 0;
92 }
93 for (i = 0; i < n; i++) {
94 ret += get_tab (stack, i + 1);
95 }
96 return ret / n;
97 }
98
99 double min ()
100 {
101 double ret = 0;
102 int i, n = size_tab (stack);
103 if (n < 1) {
104 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
105 return 0;
106 }
107 ret = get_tab (stack, 1);
108 for (i = 1; i < n; i++) {
109 double cur = get_tab (stack, i + 1);
110 if (cur < ret) {
111 ret = cur;
112 }
113 }
114 return ret;
115 }
116
117 void order ()
118 {
119 int n = size_tab (stack);
120 if (n < 3) {
121 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
122 } else {
123 order_tab (stack);
124 }
125 }
126
127 double median ()
128 {
129 double ret = 0;
130 int n = size_tab (stack);
131 if (n < 3) {
132 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
133 } else {
134 tab_t *tmp = copy_tab (stack);
135 order_tab (tmp);
136 ret = get_tab (tmp, (n - 1) / 2 + 1);
137 free_tab (tmp);
138 }
139 return ret;
140 }
141
142 double prod ()
143 {
144 double ret = 1;
145 int i, n = size_tab (stack);
146 if (n < 1) {
147 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
148 return 0;
149 }
150 for (i = 0; i < n; i++) {
151 ret *= get_tab (stack, i + 1);
152 }
153 return ret;
154 }
155
156 double sum ()
157 {
158 double ret = 0;
159 int i, n = size_tab (stack);
160 if (n < 1) {
161 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
162 return 0;
163 }
164 for (i = 0; i < n; i++) {
165 ret += get_tab (stack, i + 1);
166 }
167 return ret;
168 }
169
170 double variance ()
171 {
172 double ret = 0;
173 int i, n = size_tab (stack);
174 if (n < 2) {
175 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
176 return 0;
177 }
178 double m = mean ();
179 for (i = 0; i < n; i++) {
180 double x = get_tab (stack, i + 1);
181 ret += (x - m) * (x - m);
182 }
183 return ret / n;
184 }
185
186 /* vim: set ts=4 sw=4 et: */