12 #include "workspace.h"
16 /* global variables */
18 workspace_t
**programs
= NULL
;
21 /* lookfor program id */
23 int lookfor_program (int id
)
26 for (i
= 0; (programs
) && (i
< nb_programs
); i
++) {
27 if (programs
[i
]->id
== id
) {
34 /* program function */
36 void prog (int id
, element_t
*root
)
40 if (programs
== NULL
) {
42 /* initial memory allocation */
43 programs
= (workspace_t
**) callocordie (1, sizeof (workspace_t
*));
46 programs
[n
] = alloc_ws ();
50 /* look for existing program */
51 n
= lookfor_program (id
);
56 workspace_t
**tmp
= (workspace_t
**) callocordie (nb_programs
, sizeof (workspace_t
*));
57 memcpy (tmp
, programs
, (nb_programs
- 1) * sizeof (workspace_t
*));
60 programs
[n
] = alloc_ws ();
64 /* clean old program */
65 clean_ws(programs
[n
]);
71 programs
[n
]->root
= dupelement (root
);
74 double call (int id
, int nbargs
, element_t
**args
)
79 VERBOSE (DEBUG
, fprintf (stdout
, "new call (%d)\n", id
));
81 /* look for program */
82 int n
= lookfor_program (id
);
84 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
88 /* display debug information */
89 VERBOSE (DEBUG
, fprintf (stdout
, "nbargs: %d\n", nbargs
));
90 for (i
= 0; i
< nbargs
; i
++) {
91 VERBOSE (DEBUG
, fprintf (stdout
, "argument %d\n", i
+ 1); print_element (args
[i
], 0));
93 VERBOSE (DEBUG
, fprintf (stdout
, "program\n"); print_element (programs
[n
]->root
, 0));
96 workspace_t
*tmp
= backup_ws (alloc_ws ());
97 restore_ws (programs
[n
]);
100 VERBOSE (DEBUG
, fprintf (stdout
, "argument before evaluation (%d)\n", size_tab (argument
)));
101 for (i
= 0; i
< size_tab (argument
); i
++) {
102 VERBOSE (DEBUG
, fprintf (stdout
, "arg %d value: %g\n", i
+ 1, get_tab (argument
, i
+ 1)));
104 VERBOSE (DEBUG
, fprintf (stdout
, "evaluate %d args\n", nbargs
));
105 tab_t
*new_argument
= def (nbargs
, args
);
106 tab_t
*old_argument
= argument
;
107 argument
= new_argument
;
108 VERBOSE (DEBUG
, fprintf (stdout
, "argument after evaluation (%d)\n", size_tab (argument
)));
109 for (i
= 0; i
< size_tab (argument
); i
++) {
110 VERBOSE (DEBUG
, fprintf (stdout
, "arg %d value: %g\n", i
+ 1, get_tab (argument
, i
+ 1)));
113 /* evaluate program */
115 element_t
*elements
= dupelement (programs
[n
]->root
);
116 ret
= evaluate_element (elements
, 0);
117 VERBOSE (DEBUG
, fprintf (stdout
, "ret; %g\n", ret
));
118 delelement (elements
);
120 /* restore context */
121 backup_ws (programs
[n
]);
125 /* clean arguments */
127 argument
= old_argument
;
135 fprintf (stdout
, "programs:");
136 for (i
= 0; i
< nb_programs
; i
++) {
137 fprintf (stdout
, " %d", programs
[i
]->id
);
139 fprintf (stdout
, "\n");
144 int n
= lookfor_program (id
);
146 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
150 /* set string program */
151 fprintf (stdout
, "edit: %s\n", programs
[n
]->string
);
154 void savestring (int id
, char *string
)
156 int n
= lookfor_program (id
);
158 /* unnecesary code */
160 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
163 //if (programs[n]->string) {
164 // free (programs[n]->string);
168 programs
[n
]->string
= strdup (string
);
174 int n
= lookfor_program (id
);
176 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
181 free_ws (programs
[n
]);
184 workspace_t
**tmp
= (workspace_t
**) callocordie (nb_programs
- 1, sizeof (workspace_t
*));
185 memcpy (tmp
, programs
, n
* sizeof (workspace_t
*));
186 memcpy (tmp
+ n
, programs
+ n
+ 1, (nb_programs
- n
- 1) * sizeof (workspace_t
*));
192 /* vim: set ts=4 sw=4 et: */