3c94986fbbc7c1f7f2b2a9dac321c3a5db476ec2
12 /* global variables */
14 int argument_size
= 0;
15 double *argument
= NULL
;
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 ((programs
+ n
)->storage
);
56 if ((programs
+ n
)->stack
) {
57 free ((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
)->storage_size
= 0;
74 (programs
+ n
)->stack
= NULL
;
75 (programs
+ n
)->stack_size
= 0;
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
;
116 tmp
.storage_size
= storage_size
;
118 tmp
.stack_size
= stack_size
;
122 storage
= (programs
+ n
)->storage
;
123 storage_size
= (programs
+ n
)->storage_size
;
126 stack
= (programs
+ n
)->stack
;
127 stack_size
= (programs
+ n
)->stack_size
;
129 argument
= (double *) callocordie (nbargs
, sizeof (double));
130 for (i
= 0, l
= 0; i
< nbargs
; l
++) {
132 argument
[i
++] = evaluate_element (args
[l
], 0);
135 argument_size
= nbargs
;
138 /* evaluate program */
139 element_t
*elements
= dupelement ((programs
+ n
)->root
);
140 ret
= evaluate_element (elements
, 0);
141 delelement (elements
);
142 (programs
+ n
)->answer
= answer
;
143 (programs
+ n
)->storage
= storage
;
144 (programs
+ n
)->storage_size
= storage_size
;
148 (programs
+ n
)->stack
= stack
;
149 (programs
+ n
)->stack_size
= stack_size
;
151 /* restore context */
153 storage
= tmp
.storage
;
154 storage_size
= tmp
.storage_size
;
155 argument
= tmp
.argument
;
156 argument_size
= tmp
.argument_size
;
158 stack_size
= tmp
.stack_size
;
166 fprintf (stdout
, "programs:");
167 for (i
= 0; i
< nb_programs
; i
++) {
168 fprintf (stdout
, " %d", (programs
+ i
)->id
);
170 fprintf (stdout
, "\n");
179 /* look for program */
180 for (i
= 0; i
< nb_programs
; i
++) {
181 if ((programs
+ i
)->id
== id
) {
188 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
192 /* set string program */
193 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
196 void savestring (int id
, char *string
)
202 /* look for program */
203 for (i
= 0; i
< nb_programs
; i
++) {
204 if ((programs
+ i
)->id
== id
) {
211 /* unnecesary code */
213 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
216 //if ((programs + n)->string) {
217 // free ((programs + n)->string);
221 (programs
+ n
)->string
= strdup (string
);
231 /* look for program */
232 for (i
= 0; i
< nb_programs
; i
++) {
233 if ((programs
+ i
)->id
== id
) {
240 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
245 if ((programs
+ n
)->storage
) {
246 free ((programs
+ n
)->storage
);
248 if ((programs
+ n
)->stack
) {
249 free ((programs
+ n
)->stack
);
251 if ((programs
+ n
)->root
) {
252 delelement ((programs
+ n
)->root
);
254 if ((programs
+ n
)->string
) {
255 free ((programs
+ n
)->string
);
259 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
260 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
262 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
271 /* vim: set ts=4 sw=4 et: */