c5b8231929394303669b5cab32b27b3b75830897
13 /* global variables */
15 int argument_size
= 0;
16 double *argument
= NULL
;
18 workspace_t
*programs
= NULL
;
21 /* program function */
23 void prog (int id
, element_t
*root
)
27 if (programs
== NULL
) {
29 /* initial memory allocation */
30 programs
= (workspace_t
*) callocordie (1, sizeof (workspace_t
));
36 /* look for existing program */
37 for (i
= 0; i
< nb_programs
; i
++) {
38 if ((programs
+ i
)->id
== id
) {
47 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
, sizeof (workspace_t
));
48 memcpy (tmp
, programs
, (nb_programs
- 1) * sizeof (workspace_t
));
53 /* clean old program */
54 if ((programs
+ n
)->storage
) {
55 free ((programs
+ n
)->storage
);
57 if ((programs
+ n
)->stack
) {
58 free ((programs
+ n
)->stack
);
60 if ((programs
+ n
)->root
) {
61 delelement ((programs
+ n
)->root
);
63 if ((programs
+ n
)->string
) {
64 free ((programs
+ n
)->string
);
65 (programs
+ n
)->string
= NULL
;
71 (programs
+ n
)->id
= id
;
72 (programs
+ n
)->answer
= 0;
73 (programs
+ n
)->storage
= NULL
;
74 (programs
+ n
)->storage_size
= 0;
75 (programs
+ n
)->stack
= NULL
;
76 (programs
+ n
)->stack_size
= 0;
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
;
119 tmp
.stack_size
= stack_size
;
123 storage
= (programs
+ n
)->storage
;
124 storage_size
= (programs
+ n
)->storage_size
;
127 stack
= (programs
+ n
)->stack
;
128 stack_size
= (programs
+ n
)->stack_size
;
130 argument
= (double *) callocordie (nbargs
, sizeof (double));
131 for (i
= 0, l
= 0; i
< nbargs
; l
++) {
133 argument
[i
++] = evaluate_element (args
[l
], 0);
136 argument_size
= nbargs
;
139 /* evaluate program */
140 element_t
*elements
= dupelement ((programs
+ n
)->root
);
141 ret
= evaluate_element (elements
, 0);
142 delelement (elements
);
143 (programs
+ n
)->answer
= answer
;
144 (programs
+ n
)->storage
= storage
;
145 (programs
+ n
)->storage_size
= storage_size
;
149 (programs
+ n
)->stack
= stack
;
150 (programs
+ n
)->stack_size
= stack_size
;
152 /* restore context */
154 storage
= tmp
.storage
;
155 storage_size
= tmp
.storage_size
;
156 argument
= tmp
.argument
;
157 argument_size
= tmp
.argument_size
;
159 stack_size
= tmp
.stack_size
;
167 fprintf (stdout
, "programs:");
168 for (i
= 0; i
< nb_programs
; i
++) {
169 fprintf (stdout
, " %d", (programs
+ i
)->id
);
171 fprintf (stdout
, "\n");
180 /* look for program */
181 for (i
= 0; i
< nb_programs
; i
++) {
182 if ((programs
+ i
)->id
== id
) {
189 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
193 /* set string program */
194 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
197 void savestring (int id
, char *string
)
203 /* look for program */
204 for (i
= 0; i
< nb_programs
; i
++) {
205 if ((programs
+ i
)->id
== id
) {
212 /* unnecesary code */
214 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
217 //if ((programs + n)->string) {
218 // free ((programs + n)->string);
222 (programs
+ n
)->string
= strdup (string
);
232 /* look for program */
233 for (i
= 0; i
< nb_programs
; i
++) {
234 if ((programs
+ i
)->id
== id
) {
241 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
246 if ((programs
+ n
)->storage
) {
247 free ((programs
+ n
)->storage
);
249 if ((programs
+ n
)->stack
) {
250 free ((programs
+ n
)->stack
);
252 if ((programs
+ n
)->root
) {
253 delelement ((programs
+ n
)->root
);
255 if ((programs
+ n
)->string
) {
256 free ((programs
+ n
)->string
);
260 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
261 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
263 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
272 /* vim: set ts=4 sw=4 et: */