Commit | Line | Data |
---|---|---|
a24bd519 | 1 | #include <malloc.h> |
7059478f | 2 | #include <stdio.h> |
a24bd519 LM |
3 | #include <string.h> |
4 | ||
5 | #include "alloc.h" | |
c91672f9 | 6 | #include "argument.h" |
a24bd519 LM |
7 | #include "debug.h" |
8 | #include "parser.h" | |
9 | #include "stack.h" | |
10 | #include "storage.h" | |
3559b26c | 11 | #include "tabular.h" |
e952523a | 12 | #include "workspace.h" |
a24bd519 LM |
13 | |
14 | #include "program.h" | |
15 | ||
16 | /* global variables */ | |
17 | ||
e952523a | 18 | workspace_t **programs = NULL; |
a24bd519 LM |
19 | int nb_programs = 0; |
20 | ||
e952523a LM |
21 | /* lookfor program id */ |
22 | ||
23 | int lookfor_program (int id) | |
24 | { | |
25 | int i; | |
26 | for (i = 0; (programs) && (i < nb_programs); i++) { | |
27 | if (programs[i]->id == id) { | |
28 | return i; | |
29 | } | |
30 | } | |
31 | return -1; | |
32 | } | |
33 | ||
a24bd519 LM |
34 | /* program function */ |
35 | ||
36 | void prog (int id, element_t *root) | |
37 | { | |
e952523a | 38 | int n = -1; |
a24bd519 LM |
39 | |
40 | if (programs == NULL) { | |
41 | ||
42 | /* initial memory allocation */ | |
e952523a | 43 | programs = (workspace_t **) callocordie (1, sizeof (workspace_t *)); |
a24bd519 | 44 | n = 0; |
e952523a LM |
45 | nb_programs = 1; |
46 | programs[n] = alloc_ws (); | |
a24bd519 LM |
47 | |
48 | } else { | |
49 | ||
50 | /* look for existing program */ | |
e952523a | 51 | n = lookfor_program (id); |
a24bd519 LM |
52 | if (n == -1) { |
53 | ||
54 | /* new program */ | |
55 | n = nb_programs++; | |
e952523a LM |
56 | workspace_t **tmp = (workspace_t **) callocordie (nb_programs, sizeof (workspace_t *)); |
57 | memcpy (tmp, programs, (nb_programs - 1) * sizeof (workspace_t *)); | |
a24bd519 LM |
58 | free (programs); |
59 | programs = tmp; | |
e952523a LM |
60 | programs[n] = alloc_ws (); |
61 | ||
a24bd519 LM |
62 | } else { |
63 | ||
64 | /* clean old program */ | |
e952523a | 65 | clean_ws(programs[n]); |
a24bd519 LM |
66 | } |
67 | } | |
68 | ||
69 | /* set program */ | |
e952523a LM |
70 | programs[n]->id = id; |
71 | programs[n]->root = dupelement (root); | |
a24bd519 LM |
72 | } |
73 | ||
a24bd519 LM |
74 | double call (int id, int nbargs, element_t **args) |
75 | { | |
a24bd519 LM |
76 | double ret = 0; |
77 | ||
e952523a LM |
78 | /* look for program */ |
79 | int n = lookfor_program (id); | |
a24bd519 LM |
80 | if (n == -1) { |
81 | VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
82 | return 0; | |
83 | } | |
84 | ||
e952523a | 85 | /* set arguments */ |
9e527b67 | 86 | VERBOSE (DEBUG, fprintf (stdout, "1 arg[0]: %g\n", get_tab (argument, 1))); |
89a2c19d | 87 | tab_t *old_argument = copy_tab (argument); |
a24bd519 | 88 | |
33b4877a LM |
89 | /* backup context */ |
90 | workspace_t *tmp = backup_ws (alloc_ws ()); | |
91 | restore_ws (programs[n]); | |
9e527b67 | 92 | VERBOSE (DEBUG, fprintf (stdout, "2 arg[0]: %g\n", get_tab (argument, 1))); |
33b4877a | 93 | |
89a2c19d LM |
94 | /* set arguments */ |
95 | argument = def (nbargs, args); | |
9e527b67 | 96 | VERBOSE (DEBUG, fprintf (stdout, "3 arg[0]: %g\n", get_tab (argument, 1))); |
89a2c19d | 97 | |
a24bd519 | 98 | /* evaluate program */ |
e952523a LM |
99 | answer = 0; |
100 | element_t *elements = dupelement (programs[n]->root); | |
9e527b67 | 101 | VERBOSE (DEBUG, fprintf (stdout, "4 arg[0]: %g\n", get_tab (argument, 1))); |
a24bd519 | 102 | ret = evaluate_element (elements, 0); |
33b4877a | 103 | VERBOSE (DEBUG, fprintf (stdout, "ret; %g\n", ret)); |
9e527b67 | 104 | VERBOSE (DEBUG, fprintf (stdout, "5 arg[0]: %g\n", get_tab (argument, 1))); |
a24bd519 | 105 | delelement (elements); |
c91672f9 | 106 | |
a24bd519 | 107 | /* restore context */ |
e952523a LM |
108 | backup_ws (programs[n]); |
109 | restore_ws (tmp); | |
0361f81a | 110 | free_ws (tmp); |
9e527b67 | 111 | VERBOSE (DEBUG, fprintf (stdout, "6 arg[0]: %g\n", get_tab (argument, 1))); |
a24bd519 | 112 | |
89a2c19d LM |
113 | /* clean arguments */ |
114 | free_tab (argument); | |
115 | argument = old_argument; | |
9e527b67 | 116 | VERBOSE (DEBUG, fprintf (stdout, "7 arg[0]: %g\n", get_tab (argument, 1))); |
89a2c19d | 117 | |
a24bd519 LM |
118 | return ret; |
119 | } | |
120 | ||
121 | void list () | |
122 | { | |
123 | int i; | |
124 | fprintf (stdout, "programs:"); | |
125 | for (i = 0; i < nb_programs; i++) { | |
e952523a | 126 | fprintf (stdout, " %d", programs[i]->id); |
a24bd519 LM |
127 | } |
128 | fprintf (stdout, "\n"); | |
129 | } | |
130 | ||
131 | void edit (int id) | |
132 | { | |
e952523a | 133 | int n = lookfor_program (id); |
a24bd519 LM |
134 | if (n == -1) { |
135 | VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
136 | return; | |
137 | } | |
138 | ||
139 | /* set string program */ | |
e952523a | 140 | fprintf (stdout, "edit: %s\n", programs[n]->string); |
a24bd519 LM |
141 | } |
142 | ||
143 | void savestring (int id, char *string) | |
144 | { | |
e952523a | 145 | int n = lookfor_program (id); |
a24bd519 LM |
146 | |
147 | /* unnecesary code */ | |
148 | //if (n == -1) { | |
149 | // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
150 | // return; | |
151 | //} | |
e952523a LM |
152 | //if (programs[n]->string) { |
153 | // free (programs[n]->string); | |
a24bd519 LM |
154 | //} |
155 | ||
156 | if (string) { | |
e952523a | 157 | programs[n]->string = strdup (string); |
a24bd519 LM |
158 | } |
159 | } | |
160 | ||
161 | void del (int id) | |
162 | { | |
e952523a | 163 | int n = lookfor_program (id); |
a24bd519 LM |
164 | if (n == -1) { |
165 | VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
166 | return; | |
167 | } | |
168 | ||
169 | /* clean program */ | |
e952523a | 170 | free_ws (programs[n]); |
a24bd519 LM |
171 | |
172 | /* remove entry */ | |
5d50462b LM |
173 | workspace_t **tmp = (workspace_t **) callocordie (nb_programs - 1, sizeof (workspace_t *)); |
174 | memcpy (tmp, programs, n * sizeof (workspace_t *)); | |
175 | memcpy (tmp + n, programs + n + 1, (nb_programs - n - 1) * sizeof (workspace_t *)); | |
176 | nb_programs--; | |
a24bd519 LM |
177 | free (programs); |
178 | programs = tmp; | |
a24bd519 LM |
179 | } |
180 | ||
181 | /* vim: set ts=4 sw=4 et: */ |