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