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
)
78 /* look for program */
79 int n
= lookfor_program (id
);
81 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
84 VERBOSE (DEBUG
, fprintf (stdout
, "id -> n; %d -> %d\n", id
, n
));
89 VERBOSE (DEBUG
, fprintf (stdout
, "nbargs; %d\n", nbargs
));
95 workspace_t
*tmp
= backup_ws (alloc_ws ());
96 restore_ws (programs
[n
]);
98 /* evaluate program */
100 element_t
*elements
= dupelement (programs
[n
]->root
);
101 ret
= evaluate_element (elements
, 0);
102 VERBOSE (DEBUG
, fprintf (stdout
, "ret; %g\n", ret
));
103 delelement (elements
);
105 /* clean arguments */
109 /* restore context */
110 backup_ws (programs
[n
]);
120 fprintf (stdout
, "programs:");
121 for (i
= 0; i
< nb_programs
; i
++) {
122 fprintf (stdout
, " %d", programs
[i
]->id
);
124 fprintf (stdout
, "\n");
129 int n
= lookfor_program (id
);
131 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
135 /* set string program */
136 fprintf (stdout
, "edit: %s\n", programs
[n
]->string
);
139 void savestring (int id
, char *string
)
141 int n
= lookfor_program (id
);
143 /* unnecesary code */
145 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
148 //if (programs[n]->string) {
149 // free (programs[n]->string);
153 programs
[n
]->string
= strdup (string
);
159 int n
= lookfor_program (id
);
161 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
166 free_ws (programs
[n
]);
169 workspace_t
**tmp
= (workspace_t
**) callocordie (nb_programs
- 1, sizeof (workspace_t
*));
170 memcpy (tmp
, programs
, n
* sizeof (workspace_t
*));
171 memcpy (tmp
+ n
, programs
+ n
+ 1, (nb_programs
- n
- 1) * sizeof (workspace_t
*));
177 /* vim: set ts=4 sw=4 et: */