5 * File name: ir/external/read.c
6 * Purpose: Read descriptions of external effects
11 * Copyright: (c) 1999-2004 Universität Karlsruhe
12 * Licence: This file is protected by GPL - GNU GENERAL PUBLIC LICENSE.
17 static type_t *types = NULL;
18 static entity_t *entities = NULL;
19 static effs_t *effs = NULL;
21 static int _ent_id = 0;
22 /* static int _node_id = 0; */
25 getNodeModule (xmlNodePtr node)
27 char *mod_str = (char*) xmlGetProp (node, BAD_CAST "module");
29 if (NULL == mod_str) {
32 const char *res = strdup (mod_str);
39 getNodeProcName (xmlNodePtr node)
41 char *proc_str = (char*) xmlGetProp (node, BAD_CAST "procname");
45 return (strdup (proc_str));
49 getNodeId (xmlNodePtr node)
51 char *id_str = (char*) xmlGetProp (node, BAD_CAST "id");
60 getNodeRefId (xmlNodePtr node)
62 char *refid_str = (char*) xmlGetProp (node, BAD_CAST "refid");
65 refid = atoi (refid_str+1);
71 getNodeTypeId (xmlNodePtr node)
73 char *type_str = (char*) xmlGetProp (node, BAD_CAST "type");
76 type_id = atoi (type_str+1);
82 *getNodeTypeStr (xmlNodePtr node)
84 const char *type_str = (char*) xmlGetProp (node, BAD_CAST "type");
91 *getNodeEntityStr (xmlNodePtr node)
93 const char *ent_str = (char*) xmlGetProp (node, BAD_CAST "entity");
100 parseArg (xmlDocPtr doc, xmlNodePtr argelm)
107 CHECK_NAME (argelm, arg);
108 /* fprintf (stdout, "arg node \t0x%08x\n", (int) argelm); */
110 id = getNodeId (argelm);
111 /* fprintf (stdout, "arg->id = \"%d\"\n", id); */
112 num_str = (char*) xmlGetProp (argelm, BAD_CAST "number");
113 num = atoi (num_str);
114 /* fprintf (stdout, "arg->no = \"%d\"\n", no); */
125 *parseValref (xmlDocPtr doc, xmlNodePtr valelm)
129 CHECK_NAME (valelm, valref);
130 /* fprintf (stdout, "valref node \t0x%08x\n", (int) valelm); */
132 ref_id = getNodeRefId (valelm);
133 /* fprintf (stdout, "val->refid = \"%d\"\n", ref_id); */
135 valref = NEW (valref_t);
136 valref->kind = eff_valref;
137 valref->refid = ref_id;
143 *parseSelect (xmlDocPtr doc, xmlNodePtr selelm)
145 char *entity_str = (char*) xmlGetProp (selelm, BAD_CAST "entity");
146 const int entity_id = atoi (entity_str+1);
149 valref_t *valref = NULL;
150 select_t *sel = NEW (select_t);
151 sel->kind = eff_select;
153 CHECK_NAME (selelm, select);
154 /* fprintf (stdout, "select node \t0x%08x\n", (int) selelm); */
156 ent = getEntityById (entity_id);
158 child = selelm->xmlChildrenNode;
161 valref = parseValref (doc, child);
164 sel->valrefid = valref ? valref->refid : -1;
175 *parseLoad (xmlDocPtr doc, xmlNodePtr loadelm)
180 load_t *load = NEW (load_t);
181 load->kind = eff_load;
183 CHECK_NAME (loadelm, load);
184 /* fprintf (stdout, "load node \t0x%08x\n", (int) loadelm); */
185 id = getNodeId (loadelm);
187 child = loadelm->xmlChildrenNode;
189 sel = parseSelect (doc, child);
192 load->ptrrefid = sel->valrefid;
193 load->ent = sel->ent;
201 *parseStore (xmlDocPtr doc, xmlNodePtr storeelm)
206 store_t *store = NEW (store_t);
207 store->kind = eff_store;
209 CHECK_NAME (storeelm, store);
210 /* fprintf (stdout, "store node \t0x%08x\n", (int) storeelm); */
212 child = storeelm->xmlChildrenNode;
214 sel = parseSelect (doc, child);
218 valref = parseValref (doc, child);
220 store->ent = sel->ent;
221 store->ptrrefid = sel->valrefid;
222 store->valrefid = valref->refid;
231 *parseAlloc (xmlDocPtr doc, xmlNodePtr allocelm)
235 alloc_t *alloc = NEW (alloc_t); /* ...! */
236 alloc->kind = eff_alloc;
238 CHECK_NAME (allocelm, alloc);
239 /* fprintf (stdout, "alloc node \t0x%08x\n", (int) allocelm); */
240 id = getNodeId (allocelm);
241 /* fprintf (stdout, "alloc->id = \"%d\"\n", id); */
242 type_id = getNodeTypeId (allocelm);
243 /* fprintf (stdout, "alloc->type_id = \"%d\"\n", type_id); */
246 alloc->tp_id = type_id;
252 *parseCall (xmlDocPtr doc, xmlNodePtr callelm)
259 call_t *call = NEW (call_t);
260 call->kind = eff_call;
262 CHECK_NAME (callelm, call);
263 /* fprintf (stdout, "call node \t0x%08x\n", (int) callelm); */
264 id = getNodeId (callelm);
265 /* fprintf (stdout, "call->id = \"%d\"\n", id); */
267 child = callelm->xmlChildrenNode;
269 sel = parseSelect (doc, child);
271 arg = child = child->next;
275 while (NULL != child) {
282 call->valrefid = sel->valrefid;
283 call->ent = sel->ent;
284 call->n_args = n_args;
290 int *args = (int*) malloc (n_args * sizeof (int) );
293 while (NULL != arg) {
294 valref_t *valref = parseValref (doc, arg);
295 args [i ++] = valref->refid;
308 *parseJoin (xmlDocPtr doc, xmlNodePtr joinelm)
315 join_t *join = NEW (join_t);
316 join->kind = eff_join;
318 CHECK_NAME (joinelm, join);
319 /* fprintf (stdout, "join node \t0x%08x\n", (int) joinelm); */
320 id = getNodeId (joinelm);
321 /* fprintf (stdout, "join->id = \"%d\"\n", id); */
323 child = joinelm->xmlChildrenNode;
327 while (NULL != child) {
332 ins = (int*) malloc (n_ins * sizeof (int) );
335 child = joinelm->xmlChildrenNode;
337 while (NULL != child) {
338 valref_t *valref = parseValref (doc, child);
339 ins [i ++] = valref->refid;
352 *parseUnknown (xmlDocPtr doc, xmlNodePtr unknownelm)
355 unknown_t *unknown = NEW (unknown_t);
356 unknown->kind = eff_unknown;
358 CHECK_NAME (unknownelm, unknown);
359 /* fprintf (stdout, "unknown node \t0x%08x\n", (int) unknownelm); */
360 id = getNodeId (unknownelm);
368 *parseReturn (xmlDocPtr doc, xmlNodePtr retelm)
371 ret_t *ret = NEW (ret_t);
374 CHECK_NAME (retelm, ret);
375 /* fprintf (stdout, "ret node \t0x%08x\n", (int) retelm); */
377 child = retelm->xmlChildrenNode;
380 valref_t *valref = parseValref (doc, child);
381 ret->ret_id = valref->refid;
391 *parseRaise (xmlDocPtr doc, xmlNodePtr raiseelm)
396 raise_t *raise = NEW (raise_t);
397 raise->kind = eff_raise;
399 CHECK_NAME (raiseelm, raise);
400 /* fprintf (stdout, "raise node \t0x%08x\n", (int) raiseelm); */
402 tp_id = getNodeTypeId (raiseelm);
403 /* fprintf (stdout, "raise->type = \"%d\"\n", tp_id); */
405 child = raiseelm->xmlChildrenNode;
407 assert (NULL != child);
409 valref = parseValref (doc, child);
411 raise->valref = valref->refid;
412 raise->tp_id = tp_id;
423 /** parse a type node and insert it into the list */
425 parseType (xmlDocPtr doc, xmlNodePtr typeelm)
428 const int tp_id = getNodeId (typeelm);
429 /* fprintf (stdout, "type node \t0x%08x (%d)\n", (int) typeelm, tp_id); */
430 fprintf (stdout, "type = \"%s\"\n", getNodeTypeStr (typeelm));
432 type = (type_t*) malloc (sizeof (type_t));
434 type->name = (char*) strdup (getNodeTypeStr (typeelm));
440 if (_ent_id <= tp_id) {
445 /** parse an entity node and insert it into the list */
447 parseEntity (xmlDocPtr doc, xmlNodePtr entelm)
449 entity_t *ent = NEW (entity_t);
452 const int ent_id = getNodeId (entelm);
453 /* fprintf (stdout, "entity node \t0x%08x (%d)\n", (int) entelm, ent_id); */
454 fprintf (stdout, "ent = \"%s.%s\"\n",
455 getNodeTypeStr (entelm),
456 getNodeEntityStr (entelm));
459 ent->name = (char*) strdup (getNodeEntityStr (entelm));
460 ent->tp_name = (char*) strdup (getNodeTypeStr (entelm));
463 ent->prev = entities;
466 if (_ent_id <= ent_id) {
471 /** parse any effect, and turn it into an eff_t (TODO) */
473 parseEffect (xmlDocPtr doc, xmlNodePtr effelm)
475 xmlNodePtr cur = effelm->xmlChildrenNode;
476 char *procname = getNodeProcName (effelm);
477 effs_t *curr_effs = NULL;
481 fprintf (stdout, "effect for \"%s\"\n", procname);
483 while (NULL != cur) {
488 curr_effs = NEW (effs_t);
489 curr_effs->procname = procname;
490 curr_effs->n_effs = n_effs;
491 curr_effs->effs = (eff_t**) malloc (n_effs * sizeof (eff_t*));
493 while (NULL != cur) {
496 if (NODE_NAME (cur, arg)) {
497 eff = (eff_t*) parseArg (doc, cur);
498 } else if (NODE_NAME (cur, load)) {
499 eff = (eff_t*) parseLoad (doc, cur);
500 } else if (NODE_NAME (cur, store)) {
501 eff = (eff_t*) parseStore (doc, cur);
502 } else if (NODE_NAME (cur, alloc)) {
503 eff = (eff_t*) parseAlloc (doc, cur);
504 } else if (NODE_NAME (cur, call)) {
505 eff = (eff_t*) parseCall (doc, cur);
506 } else if (NODE_NAME (cur, join)) {
507 eff = (eff_t*) parseJoin (doc, cur);
508 } else if (NODE_NAME (cur, unknown)) {
509 eff = (eff_t*) parseUnknown (doc, cur);
510 } else if (NODE_NAME (cur, ret)) {
511 eff = (eff_t*) parseReturn (doc, cur);
512 } else if (NODE_NAME (cur, raise)) {
513 eff = (eff_t*) parseRaise (doc, cur);
514 } else if (NODE_NAME (cur, comment)) {
517 fprintf (stderr, "wrong element \"%s\"\n", BAD_CAST cur->name);
523 curr_effs->effs [i ++] = eff;
526 curr_effs->next = effs;
533 type_t *getTypeByName (const char *name)
535 type_t *curr = types;
537 while (NULL != curr) {
538 if (0 == strcmp (name, curr->name)) {
548 type_t *getTypeById (const int id)
550 type_t *curr = types;
552 while (NULL != curr) {
553 if (id == curr->id) {
563 entity_t *getEntityByNames (const char *name, const char *tp_name)
565 entity_t *curr = entities;
567 while (NULL != curr) {
568 if ((0 == strcmp (name, curr->name)) && (0 == strcmp (tp_name, curr->tp_name))) {
578 entity_t *getEntityById (const int id)
580 entity_t *curr = entities;
582 while (NULL != curr) {
583 if (id == curr->id) {
593 effs_t *getEffectByName (const char *procname)
595 effs_t *curr_effs = effs;
597 while (NULL != curr_effs) {
598 if (0 == strcmp (procname, curr_effs->procname)) {
602 curr_effs = curr_effs->next;
613 void extern_read (const char *filename)
615 /* xmlNsPtr ns = NULL; */ /* no namespace for us */
616 xmlDocPtr doc; /* whole document */
617 xmlNodePtr cur; /* current node */
619 /* i've got no idea what the VERSION cast is all about. voodoo
620 programming at its finest. */
621 LIBXML_TEST_VERSION xmlKeepBlanksDefault (0);
622 doc = xmlParseFile (filename);
623 CHECK (doc, "xmlParseFile");
625 cur = xmlDocGetRootElement (doc);
626 CHECK (cur, "xmlDocGetRootElement");
628 if (! NODE_NAME (cur, effects)) {
629 fprintf (stderr,"root node \"%s\" != \"effects\"\n", BAD_CAST cur->name);
635 if (EXTERN_VERBOSE) {
636 const char *mod_str = getNodeModule (cur);
638 if (NULL != mod_str) {
639 fprintf (stdout, "effects for \"%s\"\n", mod_str);
641 fprintf (stdout, "effects \t0x%08x\n", (int) cur);
646 cur = cur->xmlChildrenNode;
647 while (cur != NULL) {
648 if (NODE_NAME (cur, type)) {
649 parseType (doc, cur);
650 } else if (NODE_NAME (cur, entity)) {
651 parseEntity (doc, cur);
652 } else if (NODE_NAME (cur, effect)) {
653 parseEffect (doc, cur);
654 } else if ((NODE_NAME (cur, comment))) {
657 fprintf (stderr, "wrong element \"%s\"\n", BAD_CAST cur->name);
665 /** clean up our mess */
666 void extern_cleanup ()
676 free ((char*) curr->name);
677 memset (curr, 0x00, sizeof (type_t));
686 entity_t *ent = entities;
688 while (NULL != ent) {
689 entity_t *curr = ent;
692 free ((char*) curr->name);
693 free ((char*) curr->tp_name);
694 memset (curr, 0x00, sizeof (entity_t));
705 while (NULL != eff) {
710 for (i = 0; i < curr->n_effs; i ++) {
711 free (curr->effs [i]);
722 void test_getEffectByName ()
724 /* test getEffectByName */
726 "store_unknown_proc",
733 "no_this_doesn't_really_exist",
740 while (NULL != names [i]) {
741 effs_t *the_eff = getEffectByName (names [i]);
744 fprintf (stdout, "Effect for \"%s\" is at 0x%08x\n",
745 names [i], (int) the_eff);
747 fprintf (stdout, "Effect for \"%s\" not found\n",
759 * Revision 1.2 2004/10/11 15:56:09 liekweg
760 * Cleanup, comments ...
761 * Added init func --flo
763 * Revision 1.1 2004/10/11 09:31:06 liekweg
764 * First Import of XML reading procs --flo