From: Adam Dickmeiss Date: Thu, 18 Dec 1997 10:51:30 +0000 (+0000) Subject: Implemented sub-trees feature for schemas - including forward X-Git-Tag: YAZ.1.8~548 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=f7d86f5de3de80dcd56b7f5206d46203095eaf36 Implemented sub-trees feature for schemas - including forward references. --- diff --git a/CHANGELOG b/CHANGELOG index 24ca58a..c7d37ac 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,9 @@ Possible compatibility problems with earlier versions marked with '*'. +Implemented sub-tree feature for schemas. Sub-trees are +referenced in *.abs-files. See explain.abs for an example +of the use of this feature. + Modified bib1.att; local attributes for ANY didn't include ANY itself (only affects use of the retrieval module). diff --git a/include/data1.h b/include/data1.h index 54b4d3b..4178b55 100644 --- a/include/data1.h +++ b/include/data1.h @@ -24,7 +24,11 @@ * OF THIS SOFTWARE. * * $Log: data1.h,v $ - * Revision 1.32 1997-12-09 16:18:16 adam + * Revision 1.33 1997-12-18 10:51:30 adam + * Implemented sub-trees feature for schemas - including forward + * references. + * + * Revision 1.32 1997/12/09 16:18:16 adam * Work on EXPLAIN schema. First implementation of sub-schema facility * in the *.abs files. * @@ -318,6 +322,7 @@ typedef struct data1_element char *name; data1_tag *tag; data1_termlist *termlists; + char *sub_name; struct data1_element *children; struct data1_element *next; } data1_element; diff --git a/retrieval/d1_absyn.c b/retrieval/d1_absyn.c index 1b4b44b..b38d7aa 100644 --- a/retrieval/d1_absyn.c +++ b/retrieval/d1_absyn.c @@ -4,7 +4,11 @@ * 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. * @@ -160,6 +164,30 @@ data1_element *data1_getelementbyname (data1_handle dh, data1_absyn *absyn, 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]; @@ -213,7 +241,7 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file) { 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; @@ -253,29 +281,24 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file) 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) { @@ -316,7 +339,6 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file) fclose(f); return 0; } - /* parse termList definitions */ p = termlists; if (*p == '-') @@ -367,7 +389,6 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file) 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")) @@ -591,13 +612,14 @@ data1_absyn *data1_read_absyn (data1_handle dh, const char *file) } } 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; } diff --git a/tab/explain.abs b/tab/explain.abs index f146f45..273556d 100644 --- a/tab/explain.abs +++ b/tab/explain.abs @@ -55,8 +55,7 @@ elm (4,604) languageCode HumanStringLanguage 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 - @@ -78,12 +77,10 @@ elm (4,1)/(4,118) dbCombinations - 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 - @@ -120,5 +117,4 @@ elm (4,2)/(4,222) copyrightNotice - 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 -