c966617c00562beef7d02e191d963ddcb9ff4347
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 ((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
)->storage_size
= 0;
76 (programs
+ n
)->stack
= NULL
;
77 (programs
+ n
)->root
= dupelement (root
);
83 if ((id
<= 0) || (id
> argument_size
)) {
84 VERBOSE (WARNING
, fprintf (stdout
, "error out of bound (%d/%d)\n", id
, argument_size
));
86 ret
= argument
[id
- 1];
91 double call (int id
, int nbargs
, element_t
**args
)
93 workspace_t tmp
= {0};
99 /* look for program */
100 for (i
= 0; i
< nb_programs
; i
++) {
101 if ((programs
+ i
)->id
== id
) {
108 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
114 tmp
.argument
= argument
;
115 tmp
.argument_size
= argument_size
;
116 tmp
.storage
= storage
;
117 tmp
.storage_size
= storage_size
;
122 storage
= (programs
+ n
)->storage
;
123 storage_size
= (programs
+ n
)->storage_size
;
126 stack
= (programs
+ n
)->stack
;
128 argument
= (double *) callocordie (nbargs
, sizeof (double));
129 for (i
= 0, l
= 0; i
< nbargs
; l
++) {
131 argument
[i
++] = evaluate_element (args
[l
], 0);
134 argument_size
= nbargs
;
137 /* evaluate program */
138 element_t
*elements
= dupelement ((programs
+ n
)->root
);
139 ret
= evaluate_element (elements
, 0);
140 delelement (elements
);
141 (programs
+ n
)->answer
= answer
;
142 (programs
+ n
)->storage
= storage
;
143 (programs
+ n
)->storage_size
= storage_size
;
147 (programs
+ n
)->stack
= stack
;
149 /* restore context */
151 storage
= tmp
.storage
;
152 storage_size
= tmp
.storage_size
;
153 argument
= tmp
.argument
;
154 argument_size
= tmp
.argument_size
;
163 fprintf (stdout
, "programs:");
164 for (i
= 0; i
< nb_programs
; i
++) {
165 fprintf (stdout
, " %d", (programs
+ i
)->id
);
167 fprintf (stdout
, "\n");
176 /* look for program */
177 for (i
= 0; i
< nb_programs
; i
++) {
178 if ((programs
+ i
)->id
== id
) {
185 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
189 /* set string program */
190 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
193 void savestring (int id
, char *string
)
199 /* look for program */
200 for (i
= 0; i
< nb_programs
; i
++) {
201 if ((programs
+ i
)->id
== id
) {
208 /* unnecesary code */
210 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
213 //if ((programs + n)->string) {
214 // free ((programs + n)->string);
218 (programs
+ n
)->string
= strdup (string
);
228 /* look for program */
229 for (i
= 0; i
< nb_programs
; i
++) {
230 if ((programs
+ i
)->id
== id
) {
237 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
242 if ((programs
+ n
)->storage
) {
243 free ((programs
+ n
)->storage
);
245 if ((programs
+ n
)->stack
) {
246 free_tab ((programs
+ n
)->stack
);
248 if ((programs
+ n
)->root
) {
249 delelement ((programs
+ n
)->root
);
251 if ((programs
+ n
)->string
) {
252 free ((programs
+ n
)->string
);
256 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
257 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
259 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
268 /* vim: set ts=4 sw=4 et: */