* Sebastian Hammer, Adam Dickmeiss
*
* $Log: d1_absyn.c,v $
- * Revision 1.15 1997-12-09 16:18:16 adam
+ * Revision 1.16 1997-12-18 10:51:30 adam
+ * Implemented sub-trees feature for schemas - including forward
+ * references.
+ *
+ * Revision 1.15 1997/12/09 16:18:16 adam
* Work on EXPLAIN schema. First implementation of sub-schema facility
* in the *.abs files.
*
return 0;
}
+
+void fix_element_ref (data1_handle dh, data1_absyn *absyn, data1_element *e)
+{
+ for (; e; e = e->next)
+ {
+ if (!e->sub_name)
+ {
+ if (e->children)
+ fix_element_ref (dh, absyn, e->children);
+ }
+ else
+ {
+ data1_sub_elements *sub_e = absyn->sub_elements;
+ while (sub_e && strcmp (e->sub_name, sub_e->name))
+ sub_e = sub_e->next;
+ if (sub_e)
+ e->children = sub_e->elements;
+ else
+ logf (LOG_WARN, "Unresolved reference to sub-elements %s",
+ e->sub_name);
+ }
+ }
+}
+
data1_absyn *data1_read_absyn (data1_handle dh, const char *file)
{
char line[512], *r, cmd[512], args[512];
{
data1_element *new_element;
int i;
- char path[512], name[512], termlists[512], *p;
+ char path[512], name[512], termlists[512], *p, *sub_p;
int type, value;
data1_termlist **tp;
return 0;
}
level = i;
- if (*p == '$' && level > 0)
- {
- data1_sub_elements *sub_e = res->sub_elements;
-
- p++;
- while (sub_e && strcmp (p, sub_e->name))
- sub_e = sub_e->next;
- if (sub_e)
- *ppl[level] = sub_e->elements;
- if (level)
- level--;
- continue;
- }
new_element = *ppl[level] =
nmem_malloc(data1_nmem_get(dh), sizeof(*new_element));
new_element->next = new_element->children = 0;
new_element->tag = 0;
new_element->termlists = 0;
+ new_element->sub_name = 0;
tp = &new_element->termlists;
ppl[level] = &new_element->next;
ppl[level+1] = &new_element->children;
-
+
+ /* consider subtree (if any) ... */
+ if ((sub_p = strchr (p, ':')) && sub_p[1])
+ {
+ *sub_p++ = '\0';
+ new_element->sub_name =
+ nmem_strdup (data1_nmem_get(dh), sub_p);
+ }
/* well-defined tag */
if (sscanf(p, "(%d,%d)", &type, &value) == 2)
{
fclose(f);
return 0;
}
-
/* parse termList definitions */
p = termlists;
if (*p == '-')
while ((p = strchr(p, ',')) && *(++p));
*tp = all; /* append any ALL entries to the list */
}
-
new_element->name = nmem_strdup(data1_nmem_get (dh), name);
}
else if (!strcmp(cmd, "section"))
}
}
fclose(f);
-
- cur_elements = res->sub_elements;
- while (cur_elements && strcmp (cur_elements->name, "main"))
- cur_elements = cur_elements->next;
- if (cur_elements)
- res->main_elements = cur_elements->elements;
-
+
+ for (cur_elements = res->sub_elements; cur_elements;
+ cur_elements = cur_elements->next)
+ {
+ if (!strcmp (cur_elements->name, "main"))
+ res->main_elements = cur_elements->elements;
+ fix_element_ref (dh, res, cur_elements->elements);
+ }
logf (LOG_DEBUG, "end data1_read_absyn file=%s", file);
return res;
}
section main
elm (4,1) targetInfo ExplainCategory
-elm (4,1)/(4,600) targetCommonInfo -
-elm (4,1)/(4,600)/$commonInfo x -
+elm (4,1)/(4,600):commonInfo targetCommonInfo -
elm (4,1)/(4,102) targetName TargetName
elm (4,1)/(4,103) recentNews -
elm (4,1)/(4,104) icon -
elm (4,1)/(4,118)/(4,605) databaseList -
elm (4,1)/(4,118)/(4,605)/(4,102) databaseName -
elm (4,1)/(4,119) addresses -
-elm (4,1)/(4,500) commonAccessInfo -
-elm (4,1)/(4,500)/$accessInfo x -
+elm (4,1)/(4,500):accessInfo commonAccessInfo -
elm (4,2) databaseInfo ExplainCategory
-elm (4,2)/(4,600) databaseCommonInfo -
-elm (4,2)/(4,600)/$commonInfo x -
+elm (4,2)/(4,600):commonInfo databaseCommonInfo -
elm (4,2)/(4,102) databaseName DatabaseName
elm (4,2)/(4,226) explainDatabase -
elm (4,2)/(4,114) nicknames -
elm (4,2)/(4,223) producerContactInfo -
elm (4,2)/(4,224) supplierContactInfo -
elm (4,2)/(4,225) submissionContactInfo -
-elm (4,2)/(4,500) databaseAccessInfo -
-elm (4,2)/(4,500)/$accessInfo x -
+elm (4,2)/(4,500):accessInfo databaseAccessInfo -