97f99293114bd95b76ac4601d62c4b5645fd1a4f
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_tab ((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
)->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
;
121 storage
= (programs
+ n
)->storage
;
122 storage_size
= (programs
+ n
)->storage_size
;
125 stack
= (programs
+ n
)->stack
;
127 argument
= (double *) callocordie (nbargs
, sizeof (double));
128 for (i
= 0, l
= 0; i
< nbargs
; l
++) {
130 argument
[i
++] = evaluate_element (args
[l
], 0);
133 argument_size
= nbargs
;
136 /* evaluate program */
137 element_t
*elements
= dupelement ((programs
+ n
)->root
);
138 ret
= evaluate_element (elements
, 0);
139 delelement (elements
);
140 (programs
+ n
)->answer
= answer
;
141 (programs
+ n
)->storage
= storage
;
142 (programs
+ n
)->storage_size
= storage_size
;
146 (programs
+ n
)->stack
= stack
;
148 /* restore context */
150 storage
= tmp
.storage
;
151 storage_size
= tmp
.storage_size
;
152 argument
= tmp
.argument
;
153 argument_size
= tmp
.argument_size
;
162 fprintf (stdout
, "programs:");
163 for (i
= 0; i
< nb_programs
; i
++) {
164 fprintf (stdout
, " %d", (programs
+ i
)->id
);
166 fprintf (stdout
, "\n");
175 /* look for program */
176 for (i
= 0; i
< nb_programs
; i
++) {
177 if ((programs
+ i
)->id
== id
) {
184 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
188 /* set string program */
189 fprintf (stdout
, "edit: %s\n", (programs
+ n
)->string
);
192 void savestring (int id
, char *string
)
198 /* look for program */
199 for (i
= 0; i
< nb_programs
; i
++) {
200 if ((programs
+ i
)->id
== id
) {
207 /* unnecesary code */
209 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
212 //if ((programs + n)->string) {
213 // free ((programs + n)->string);
217 (programs
+ n
)->string
= strdup (string
);
227 /* look for program */
228 for (i
= 0; i
< nb_programs
; i
++) {
229 if ((programs
+ i
)->id
== id
) {
236 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
241 if ((programs
+ n
)->storage
) {
242 free ((programs
+ n
)->storage
);
244 if ((programs
+ n
)->stack
) {
245 free_tab ((programs
+ n
)->stack
);
247 if ((programs
+ n
)->root
) {
248 delelement ((programs
+ n
)->root
);
250 if ((programs
+ n
)->string
) {
251 free ((programs
+ n
)->string
);
255 workspace_t
*tmp
= (workspace_t
*) callocordie (nb_programs
- 1, sizeof (workspace_t
));
256 for (i
= 0, j
= 0; i
< nb_programs
; i
++) {
258 memcpy (tmp
+ j
, programs
+ i
, sizeof (workspace_t
));
267 /* vim: set ts=4 sw=4 et: */