1e960f728641a02a44c5f660600031403ae28f3d
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
));
86 VERBOSE (DEBUG
, fprintf (stdout
, "1 arg[0]: %g\n", get_tab (argument
, 1)));
87 tab_t
*old_argument
= copy_tab (argument
);
90 workspace_t
*tmp
= backup_ws (alloc_ws ());
91 restore_ws (programs
[n
]);
92 VERBOSE (DEBUG
, fprintf (stdout
, "2 arg[0]: %g\n", get_tab (argument
, 1)));
95 argument
= def (nbargs
, args
);
96 VERBOSE (DEBUG
, fprintf (stdout
, "3 arg[0]: %g\n", get_tab (argument
, 1)));
98 /* evaluate program */
100 element_t
*elements
= dupelement (programs
[n
]->root
);
101 VERBOSE (DEBUG
, fprintf (stdout
, "4 arg[0]: %g\n", get_tab (argument
, 1)));
102 ret
= evaluate_element (elements
, 0);
103 VERBOSE (DEBUG
, fprintf (stdout
, "ret; %g\n", ret
));
104 VERBOSE (DEBUG
, fprintf (stdout
, "5 arg[0]: %g\n", get_tab (argument
, 1)));
105 delelement (elements
);
107 /* restore context */
108 backup_ws (programs
[n
]);
111 VERBOSE (DEBUG
, fprintf (stdout
, "6 arg[0]: %g\n", get_tab (argument
, 1)));
113 /* clean arguments */
115 argument
= old_argument
;
116 VERBOSE (DEBUG
, fprintf (stdout
, "7 arg[0]: %g\n", get_tab (argument
, 1)));
124 fprintf (stdout
, "programs:");
125 for (i
= 0; i
< nb_programs
; i
++) {
126 fprintf (stdout
, " %d", programs
[i
]->id
);
128 fprintf (stdout
, "\n");
133 int n
= lookfor_program (id
);
135 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
139 /* set string program */
140 fprintf (stdout
, "edit: %s\n", programs
[n
]->string
);
143 void savestring (int id
, char *string
)
145 int n
= lookfor_program (id
);
147 /* unnecesary code */
149 // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
152 //if (programs[n]->string) {
153 // free (programs[n]->string);
157 programs
[n
]->string
= strdup (string
);
163 int n
= lookfor_program (id
);
165 VERBOSE (WARNING
, fprintf (stdout
, "error unknown program (%d)\n", id
));
170 free_ws (programs
[n
]);
173 workspace_t
**tmp
= (workspace_t
**) callocordie (nb_programs
- 1, sizeof (workspace_t
*));
174 memcpy (tmp
, programs
, n
* sizeof (workspace_t
*));
175 memcpy (tmp
+ n
, programs
+ n
+ 1, (nb_programs
- n
- 1) * sizeof (workspace_t
*));
181 /* vim: set ts=4 sw=4 et: */