9bbf392f39b967df066a7ed69307e3ad86dd8271
14 /* global variables */
16 int argument_size
= 0;
17 double *argument
= NULL
;
19 workspace_t
*programs
= NULL
;
22 /* program function */
24 void prog (int id
, element_t
*root
)
28 if (programs
== NULL
) {
30 /* initial memory allocation */
31 programs
= (workspace_t
*) callocordie (1, sizeof (workspace_t
));
37 /* look for existing program */
38 for (i
= 0; i
< nb_programs
; i
++) {
39 if ((programs
+ i
)->id
== id
) {
48 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
, sizeof (workspace_t
));
49 memcpy (tmp
, programs
, (nb_programs
- 1) * sizeof (workspace_t
));
54 /* clean old program */
55 if ((programs
+ n
)->storage
) {
56 free_tab ((programs
+ n
)->storage
);
58 if ((programs
+ n
)->stack
) {
59 free_tab ((programs
+ n
)->stack
);
61 if ((programs
+ n
)->root
) {
62 delelement ((programs
+ n
)->root
);
64 if ((programs
+ n
)->string
) {
65 free ((programs
+ n
)->string
);
66 (programs
+ n
)->string
= NULL
;
72 (programs
+ n
)->id
= id
;
73 (programs
+ n
)->answer
= 0;
74 (programs
+ n
)->storage
= NULL
;
75 (programs
+ n
)->stack
= NULL
;
76 (programs
+ n
)->root
= dupelement (root
);
82 if ((id
<= 0) || (id
> argument_size
)) {
83 VERBOSE (WARNING
, fprintf (stdout
, "error out of bound (%d/%d)\n", id
, argument_size
));
85 ret
= argument
[id
- 1];
90 double call (int id
, int nbargs
, element_t
**args
)
92 workspace_t tmp
= {0};
98 /* look for program */
99 for (i
= 0; i
< nb_programs
; i
++) {
100 if ((programs
+ i
)->id
== id
) {
107 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
113 tmp
.argument
= argument
;
114 tmp
.argument_size
= argument_size
;
115 tmp
.storage
= storage
;
120 storage
= (programs
+ n
)->storage
;
123 stack
= (programs
+ n
)->stack
;
125 argument
= (double *) callocordie (nbargs
, sizeof (double));
126 for (i
= 0, l
= 0; i
< nbargs
; l
++) {
128 argument
[i
++] = evaluate_element (args
[l
], 0);
131 argument_size
= nbargs
;
134 /* evaluate program */
135 element_t
*elements
= dupelement ((programs
+ n
)->root
);
136 ret
= evaluate_element (elements
, 0);
137 delelement (elements
);
138 (programs
+ n
)->answer
= answer
;
139 (programs
+ n
)->storage
= storage
;
143 (programs
+ n
)->stack
= stack
;
145 /* restore context */
147 storage
= tmp
.storage
;
148 argument
= tmp
.argument
;
149 argument_size
= tmp
.argument_size
;
158 fprintf (stdout
, "programs:");
159 for (i
= 0; i
< nb_programs
; i
++) {
160 fprintf (stdout
, " %d", (programs
+ i
)->id
);
162 fprintf (stdout
, "\n");
171 /* look for program */
172 for (i
= 0; i
< nb_programs
; i
++) {
173 if ((programs
+ i
)->id
== id
) {
180 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
184 /* set string program */
185 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
188 void savestring (int id
, char *string
)
194 /* look for program */
195 for (i
= 0; i
< nb_programs
; i
++) {
196 if ((programs
+ i
)->id
== id
) {
203 /* unnecesary code */
205 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
208 //if ((programs + n)->string) {
209 // free ((programs + n)->string);
213 (programs
+ n
)->string
= strdup (string
);
223 /* look for program */
224 for (i
= 0; i
< nb_programs
; i
++) {
225 if ((programs
+ i
)->id
== id
) {
232 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
237 if ((programs
+ n
)->storage
) {
238 free_tab ((programs
+ n
)->storage
);
240 if ((programs
+ n
)->stack
) {
241 free_tab ((programs
+ n
)->stack
);
243 if ((programs
+ n
)->root
) {
244 delelement ((programs
+ n
)->root
);
246 if ((programs
+ n
)->string
) {
247 free ((programs
+ n
)->string
);
251 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
252 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
254 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
263 /* vim: set ts=4 sw=4 et: */