#include "stack.h"
#include "storage.h"
#include "tabular.h"
+#include "workspace.h"
#include "program.h"
/* global variables */
-workspace_t *programs = NULL;
+workspace_t **programs = NULL;
int nb_programs = 0;
+/* lookfor program id */
+
+int lookfor_program (int id)
+{
+ int i;
+ for (i = 0; (programs) && (i < nb_programs); i++) {
+ if (programs[i]->id == id) {
+ return i;
+ }
+ }
+ return -1;
+}
+
/* program function */
void prog (int id, element_t *root)
{
- int i, n = -1;
+ int n = -1;
if (programs == NULL) {
/* initial memory allocation */
- programs = (workspace_t *) callocordie (1, sizeof (workspace_t));
- nb_programs = 1;
+ programs = (workspace_t **) callocordie (1, sizeof (workspace_t *));
n = 0;
+ nb_programs = 1;
+ programs[n] = alloc_ws ();
} else {
/* look for existing program */
- for (i = 0; i < nb_programs; i++) {
- if ((programs + i)->id == id) {
- n = i;
- break;
- }
- }
+ n = lookfor_program (id);
if (n == -1) {
/* new program */
n = nb_programs++;
- workspace_t *tmp = (workspace_t *) callocordie (nb_programs, sizeof (workspace_t));
- memcpy (tmp, programs, (nb_programs - 1) * sizeof (workspace_t));
+ workspace_t **tmp = (workspace_t **) callocordie (nb_programs, sizeof (workspace_t *));
+ memcpy (tmp, programs, (nb_programs - 1) * sizeof (workspace_t *));
free (programs);
programs = tmp;
+ programs[n] = alloc_ws ();
+
} else {
/* clean old program */
- if ((programs + n)->storage) {
- free_tab ((programs + n)->storage);
- }
- if ((programs + n)->stack) {
- free_tab ((programs + n)->stack);
- }
- if ((programs + n)->root) {
- delelement ((programs + n)->root);
- }
- if ((programs + n)->string) {
- free ((programs + n)->string);
- (programs + n)->string = NULL;
- }
+ clean_ws(programs[n]);
}
}
/* set program */
- (programs + n)->id = id;
- (programs + n)->answer = 0;
- (programs + n)->storage = NULL;
- (programs + n)->stack = NULL;
- (programs + n)->root = dupelement (root);
+ programs[n]->id = id;
+ programs[n]->root = dupelement (root);
}
double call (int id, int nbargs, element_t **args)
{
- workspace_t tmp = {0};
- int i, n = -1;
double ret = 0;
- if (programs) {
-
- /* look for program */
- for (i = 0; i < nb_programs; i++) {
- if ((programs + i)->id == id) {
- n = i;
- break;
- }
- }
- }
+ /* look for program */
+ int n = lookfor_program (id);
if (n == -1) {
VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
return 0;
}
- /* store context */
- tmp.answer = answer;
- tmp.argument = argument;
- tmp.stack = stack;
- tmp.storage = storage;
-
- /* change context */
- answer = 0;
+ /* backup context */
+ workspace_t *tmp = backup_ws (alloc_ws ());
+ restore_ws (programs[n]);
+
+ /* set arguments */
+ free_tab (argument);
argument = NULL;
if (nbargs > 0) {
def (nbargs, args);
}
- stack = (programs + n)->stack;
- storage = (programs + n)->storage;
/* evaluate program */
- element_t *elements = dupelement ((programs + n)->root);
+ answer = 0;
+ element_t *elements = dupelement (programs[n]->root);
ret = evaluate_element (elements, 0);
delelement (elements);
- /* cleaning context */
- (programs + n)->answer = answer;
+ /* clean arguments */
if (argument) {
free_tab (argument);
}
- (programs + n)->stack = stack;
- (programs + n)->storage = storage;
+ argument = NULL;
+ if (nbargs > 0) {
+ def (nbargs, args);
+ }
/* restore context */
- answer = tmp.answer;
- argument = tmp.argument;
- storage = tmp.storage;
- stack = tmp.stack;
+ backup_ws (programs[n]);
+ restore_ws (tmp);
return ret;
}
int i;
fprintf (stdout, "programs:");
for (i = 0; i < nb_programs; i++) {
- fprintf (stdout, " %d", (programs + i)->id);
+ fprintf (stdout, " %d", programs[i]->id);
}
fprintf (stdout, "\n");
}
void edit (int id)
{
- int i, n = -1;
-
- if (programs) {
-
- /* look for program */
- for (i = 0; i < nb_programs; i++) {
- if ((programs + i)->id == id) {
- n = i;
- break;
- }
- }
- }
+ int n = lookfor_program (id);
if (n == -1) {
VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
return;
}
/* set string program */
- fprintf (stdout, "edit: %s\n", (programs + n)->string);
+ fprintf (stdout, "edit: %s\n", programs[n]->string);
}
void savestring (int id, char *string)
{
- int i, n = -1;
-
- if (programs) {
-
- /* look for program */
- for (i = 0; i < nb_programs; i++) {
- if ((programs + i)->id == id) {
- n = i;
- break;
- }
- }
- }
+ int n = lookfor_program (id);
/* unnecesary code */
//if (n == -1) {
// VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
// return;
//}
- //if ((programs + n)->string) {
- // free ((programs + n)->string);
+ //if (programs[n]->string) {
+ // free (programs[n]->string);
//}
if (string) {
- (programs + n)->string = strdup (string);
+ programs[n]->string = strdup (string);
}
}
void del (int id)
{
- int i, j, n = -1;
-
- if (programs) {
-
- /* look for program */
- for (i = 0; i < nb_programs; i++) {
- if ((programs + i)->id == id) {
- n = i;
- break;
- }
- }
- }
+ int n = lookfor_program (id);
if (n == -1) {
VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
return;
}
/* clean program */
- if ((programs + n)->storage) {
- free_tab ((programs + n)->storage);
- }
- if ((programs + n)->stack) {
- free_tab ((programs + n)->stack);
- }
- if ((programs + n)->root) {
- delelement ((programs + n)->root);
- }
- if ((programs + n)->string) {
- free ((programs + n)->string);
- }
+ free_ws (programs[n]);
/* remove entry */
- workspace_t *tmp = (workspace_t *) callocordie (nb_programs - 1, sizeof (workspace_t));
- for (i = 0, j = 0; i < nb_programs; i++) {
- if (i != n) {
- memcpy (tmp + j, programs + i, sizeof (workspace_t));
- j++;
- }
+ workspace_t **tmp = (workspace_t **) callocordie (--nb_programs, sizeof (workspace_t *));
+ if (n != 0) {
+ memcpy (tmp, programs, (n - 1) * sizeof (workspace_t));
+ }
+ if (n != nb_programs) {
+ memcpy (tmp + n - 1, programs + n, (nb_programs - n) * sizeof (workspace_t));
}
free (programs);
programs = tmp;
- nb_programs--;
}
/* vim: set ts=4 sw=4 et: */