missing end of line
[calc.git] / stack.c
CommitLineData
a24bd519 1#include <stdio.h>
a24bd519 2
a24bd519
LM
3#include "debug.h"
4#include "format.h"
5#include "parser.h"
3559b26c 6#include "tabular.h"
a24bd519
LM
7
8#include "stack.h"
9
10/* global variables */
11
3559b26c 12tab_t * stack = NULL;
a24bd519
LM
13
14/* stack management */
15
16double get (int n)
17{
3559b26c 18 return get_tab (stack, n);
a24bd519
LM
19}
20
21double length ()
22{
3559b26c 23 return size_tab (stack);
a24bd519
LM
24}
25
26double pop ()
27{
3559b26c 28 return pop_tab (stack, -1);
a24bd519
LM
29}
30
31double push (double val)
32{
3559b26c 33 return push_tab (stack, -1, val);
a24bd519
LM
34}
35
36double put (int n, double val)
37{
3559b26c
LM
38 if (n > size_tab (stack)) {
39 stack = resize_tab (stack, n);
a24bd519 40 }
3559b26c 41 return set_tab (stack, n, val);
a24bd519
LM
42}
43
44double set (int nbops, element_t **ops)
45{
46 int i;
3559b26c
LM
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);
a24bd519
LM
52}
53
54void show (void)
55{
3559b26c 56 int i, n = size_tab (stack);
a24bd519 57 fprintf (stdout, "stack:");
3559b26c 58 for (i = 0; i < n; i++) {
a24bd519 59 fprintf (stdout, " ");
3559b26c 60 fprintf (stdout, minform, get_tab (stack, i + 1));
a24bd519
LM
61 }
62 fprintf (stdout, "\n");
63}
64
65/* stack functions */
66
67double max ()
68{
69 double ret = 0;
3559b26c
LM
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));
a24bd519
LM
73 return 0;
74 }
3559b26c
LM
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;
a24bd519
LM
80 }
81 }
82 return ret;
83}
84
85double mean ()
86{
87 double ret = 0;
3559b26c
LM
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));
a24bd519
LM
91 return 0;
92 }
3559b26c
LM
93 for (i = 0; i < n; i++) {
94 ret += get_tab (stack, i + 1);
a24bd519 95 }
3559b26c 96 return ret / n;
a24bd519
LM
97}
98
99double min ()
100{
101 double ret = 0;
3559b26c
LM
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));
a24bd519
LM
105 return 0;
106 }
3559b26c
LM
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;
a24bd519
LM
112 }
113 }
114 return ret;
115}
116
117void order ()
118{
3559b26c
LM
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);
a24bd519
LM
124 }
125}
126
127double median ()
128{
129 double ret = 0;
3559b26c
LM
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);
a24bd519 138 }
a24bd519
LM
139 return ret;
140}
141
142double prod ()
143{
144 double ret = 1;
3559b26c
LM
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));
a24bd519
LM
148 return 0;
149 }
3559b26c
LM
150 for (i = 0; i < n; i++) {
151 ret *= get_tab (stack, i + 1);
a24bd519
LM
152 }
153 return ret;
154}
155
156double sum ()
157{
158 double ret = 0;
3559b26c
LM
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));
a24bd519
LM
162 return 0;
163 }
3559b26c
LM
164 for (i = 0; i < n; i++) {
165 ret += get_tab (stack, i + 1);
a24bd519
LM
166 }
167 return ret;
168}
169
170double variance ()
171{
172 double ret = 0;
3559b26c
LM
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));
a24bd519
LM
176 return 0;
177 }
3559b26c
LM
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);
a24bd519 182 }
3559b26c 183 return ret / n;
a24bd519
LM
184}
185
186/* vim: set ts=4 sw=4 et: */