18a9719d3a318be6819dd5483f5f4a5a92e4cd30
15 /* global variables */
17 workspace_t
*programs
= NULL
;
20 /* program function */
22 void prog (int id
, element_t
*root
)
26 if (programs
== NULL
) {
28 /* initial memory allocation */
29 programs
= (workspace_t
*) callocordie (1, sizeof (workspace_t
));
35 /* look for existing program */
36 for (i
= 0; i
< nb_programs
; i
++) {
37 if ((programs
+ i
)->id
== id
) {
46 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
, sizeof (workspace_t
));
47 memcpy (tmp
, programs
, (nb_programs
- 1) * sizeof (workspace_t
));
52 /* clean old program */
53 if ((programs
+ n
)->storage
) {
54 free_tab ((programs
+ n
)->storage
);
56 if ((programs
+ n
)->stack
) {
57 free_tab ((programs
+ n
)->stack
);
59 if ((programs
+ n
)->root
) {
60 delelement ((programs
+ n
)->root
);
62 if ((programs
+ n
)->string
) {
63 free ((programs
+ n
)->string
);
64 (programs
+ n
)->string
= NULL
;
70 (programs
+ n
)->id
= id
;
71 (programs
+ n
)->answer
= 0;
72 (programs
+ n
)->storage
= NULL
;
73 (programs
+ n
)->stack
= NULL
;
74 (programs
+ n
)->root
= dupelement (root
);
77 double call (int id
, int nbargs
, element_t
**args
)
79 workspace_t tmp
= {0};
85 /* look for program */
86 for (i
= 0; i
< nb_programs
; i
++) {
87 if ((programs
+ i
)->id
== id
) {
94 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
100 tmp
.argument
= argument
;
102 tmp
.storage
= storage
;
110 stack
= (programs
+ n
)->stack
;
111 storage
= (programs
+ n
)->storage
;
113 /* evaluate program */
114 element_t
*elements
= dupelement ((programs
+ n
)->root
);
115 ret
= evaluate_element (elements
, 0);
116 delelement (elements
);
118 /* cleaning context */
119 (programs
+ n
)->answer
= answer
;
123 (programs
+ n
)->stack
= stack
;
124 (programs
+ n
)->storage
= storage
;
126 /* restore context */
128 argument
= tmp
.argument
;
129 storage
= tmp
.storage
;
138 fprintf (stdout
, "programs:");
139 for (i
= 0; i
< nb_programs
; i
++) {
140 fprintf (stdout
, " %d", (programs
+ i
)->id
);
142 fprintf (stdout
, "\n");
151 /* look for program */
152 for (i
= 0; i
< nb_programs
; i
++) {
153 if ((programs
+ i
)->id
== id
) {
160 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
164 /* set string program */
165 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
168 void savestring (int id
, char *string
)
174 /* look for program */
175 for (i
= 0; i
< nb_programs
; i
++) {
176 if ((programs
+ i
)->id
== id
) {
183 /* unnecesary code */
185 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
188 //if ((programs + n)->string) {
189 // free ((programs + n)->string);
193 (programs
+ n
)->string
= strdup (string
);
203 /* look for program */
204 for (i
= 0; i
< nb_programs
; i
++) {
205 if ((programs
+ i
)->id
== id
) {
212 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
217 if ((programs
+ n
)->storage
) {
218 free_tab ((programs
+ n
)->storage
);
220 if ((programs
+ n
)->stack
) {
221 free_tab ((programs
+ n
)->stack
);
223 if ((programs
+ n
)->root
) {
224 delelement ((programs
+ n
)->root
);
226 if ((programs
+ n
)->string
) {
227 free ((programs
+ n
)->string
);
231 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
232 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
234 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
243 /* vim: set ts=4 sw=4 et: */