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 */ |
89a2c19d | 86 | tab_t *old_argument = copy_tab (argument); |
a24bd519 | 87 | |
33b4877a LM |
88 | /* backup context */ |
89 | workspace_t *tmp = backup_ws (alloc_ws ()); | |
90 | restore_ws (programs[n]); | |
91 | ||
89a2c19d LM |
92 | /* set arguments */ |
93 | argument = def (nbargs, args); | |
94 | ||
a24bd519 | 95 | /* evaluate program */ |
e952523a LM |
96 | answer = 0; |
97 | element_t *elements = dupelement (programs[n]->root); | |
a24bd519 | 98 | ret = evaluate_element (elements, 0); |
33b4877a | 99 | VERBOSE (DEBUG, fprintf (stdout, "ret; %g\n", ret)); |
a24bd519 | 100 | delelement (elements); |
c91672f9 | 101 | |
a24bd519 | 102 | /* restore context */ |
e952523a LM |
103 | backup_ws (programs[n]); |
104 | restore_ws (tmp); | |
0361f81a | 105 | free_ws (tmp); |
a24bd519 | 106 | |
89a2c19d LM |
107 | /* clean arguments */ |
108 | free_tab (argument); | |
109 | argument = old_argument; | |
110 | ||
a24bd519 LM |
111 | return ret; |
112 | } | |
113 | ||
114 | void list () | |
115 | { | |
116 | int i; | |
117 | fprintf (stdout, "programs:"); | |
118 | for (i = 0; i < nb_programs; i++) { | |
e952523a | 119 | fprintf (stdout, " %d", programs[i]->id); |
a24bd519 LM |
120 | } |
121 | fprintf (stdout, "\n"); | |
122 | } | |
123 | ||
124 | void edit (int id) | |
125 | { | |
e952523a | 126 | int n = lookfor_program (id); |
a24bd519 LM |
127 | if (n == -1) { |
128 | VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
129 | return; | |
130 | } | |
131 | ||
132 | /* set string program */ | |
e952523a | 133 | fprintf (stdout, "edit: %s\n", programs[n]->string); |
a24bd519 LM |
134 | } |
135 | ||
136 | void savestring (int id, char *string) | |
137 | { | |
e952523a | 138 | int n = lookfor_program (id); |
a24bd519 LM |
139 | |
140 | /* unnecesary code */ | |
141 | //if (n == -1) { | |
142 | // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
143 | // return; | |
144 | //} | |
e952523a LM |
145 | //if (programs[n]->string) { |
146 | // free (programs[n]->string); | |
a24bd519 LM |
147 | //} |
148 | ||
149 | if (string) { | |
e952523a | 150 | programs[n]->string = strdup (string); |
a24bd519 LM |
151 | } |
152 | } | |
153 | ||
154 | void del (int id) | |
155 | { | |
e952523a | 156 | int n = lookfor_program (id); |
a24bd519 LM |
157 | if (n == -1) { |
158 | VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); | |
159 | return; | |
160 | } | |
161 | ||
162 | /* clean program */ | |
e952523a | 163 | free_ws (programs[n]); |
a24bd519 LM |
164 | |
165 | /* remove entry */ | |
5d50462b LM |
166 | workspace_t **tmp = (workspace_t **) callocordie (nb_programs - 1, sizeof (workspace_t *)); |
167 | memcpy (tmp, programs, n * sizeof (workspace_t *)); | |
168 | memcpy (tmp + n, programs + n + 1, (nb_programs - n - 1) * sizeof (workspace_t *)); | |
169 | nb_programs--; | |
a24bd519 LM |
170 | free (programs); |
171 | programs = tmp; | |
a24bd519 LM |
172 | } |
173 | ||
174 | /* vim: set ts=4 sw=4 et: */ |