X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=retrieval%2Fd1_absyn.c;fp=retrieval%2Fd1_absyn.c;h=0000000000000000000000000000000000000000;hp=349e4d54f174778dcf34c5813e50c0dab8404691;hb=95a7ea9b644c520d7d7b7c5d0c71ca44dd58a225;hpb=6866fce7b026f5ce8b75945f72a844d7b44abd85 diff --git a/retrieval/d1_absyn.c b/retrieval/d1_absyn.c deleted file mode 100644 index 349e4d5..0000000 --- a/retrieval/d1_absyn.c +++ /dev/null @@ -1,700 +0,0 @@ -/* - * Copyright (c) 1995-2002, Index Data. - * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Id: d1_absyn.c,v 1.34 2002-08-29 21:26:08 mike Exp $ - */ - -#include -#include -#include -#include - -#include -#include -#include - -#define D1_MAX_NESTING 128 - -struct data1_absyn_cache_info -{ - char *name; - data1_absyn *absyn; - data1_absyn_cache next; -}; - -struct data1_attset_cache_info -{ - char *name; - data1_attset *attset; - data1_attset_cache next; -}; - -data1_absyn *data1_absyn_search (data1_handle dh, const char *name) -{ - data1_absyn_cache p = *data1_absyn_cache_get (dh); - - while (p) - { - if (!strcmp (name, p->name)) - return p->absyn; - p = p->next; - } - return NULL; -} - -void data1_absyn_trav (data1_handle dh, void *handle, - void (*fh)(data1_handle dh, void *h, data1_absyn *a)) -{ - data1_absyn_cache p = *data1_absyn_cache_get (dh); - - while (p) - { - (*fh)(dh, handle, p->absyn); - p = p->next; - } -} - -data1_absyn *data1_absyn_add (data1_handle dh, const char *name) -{ - char fname[512]; - NMEM mem = data1_nmem_get (dh); - - data1_absyn_cache p = (data1_absyn_cache)nmem_malloc (mem, sizeof(*p)); - data1_absyn_cache *pp = data1_absyn_cache_get (dh); - - sprintf(fname, "%s.abs", name); - p->absyn = data1_read_absyn (dh, fname, 0); - p->name = nmem_strdup (mem, name); - p->next = *pp; - *pp = p; - return p->absyn; -} - -data1_absyn *data1_get_absyn (data1_handle dh, const char *name) -{ - data1_absyn *absyn; - - if (!(absyn = data1_absyn_search (dh, name))) - absyn = data1_absyn_add (dh, name); - return absyn; -} - -data1_attset *data1_attset_search_name (data1_handle dh, const char *name) -{ - data1_attset_cache p = *data1_attset_cache_get (dh); - - while (p) - { - if (!strcmp (name, p->name)) - return p->attset; - p = p->next; - } - return NULL; -} - -data1_attset *data1_attset_search_id (data1_handle dh, int id) -{ - data1_attset_cache p = *data1_attset_cache_get (dh); - - while (p) - { - if (id == p->attset->reference) - return p->attset; - p = p->next; - } - return NULL; -} - -data1_attset *data1_attset_add (data1_handle dh, const char *name) -{ - char fname[512], aname[512]; - NMEM mem = data1_nmem_get (dh); - data1_attset *attset; - - strcpy (aname, name); - sprintf(fname, "%s.att", name); - attset = data1_read_attset (dh, fname); - if (!attset) - { - char *cp; - attset = data1_read_attset (dh, name); - if (attset && (cp = strrchr (aname, '.'))) - *cp = '\0'; - } - if (!attset) - yaz_log (LOG_WARN|LOG_ERRNO, "Couldn't load attribute set %s", name); - else - { - data1_attset_cache p = (data1_attset_cache) - nmem_malloc (mem, sizeof(*p)); - data1_attset_cache *pp = data1_attset_cache_get (dh); - - attset->name = p->name = nmem_strdup (mem, aname); - p->attset = attset; - p->next = *pp; - *pp = p; - } - return attset; -} - -data1_attset *data1_get_attset (data1_handle dh, const char *name) -{ - data1_attset *attset; - - if (!(attset = data1_attset_search_name (dh, name))) - attset = data1_attset_add (dh, name); - return attset; -} - -data1_esetname *data1_getesetbyname(data1_handle dh, data1_absyn *a, - const char *name) -{ - data1_esetname *r; - - for (r = a->esetnames; r; r = r->next) - if (!data1_matchstr(r->name, name)) - return r; - return 0; -} - -data1_element *data1_getelementbytagname (data1_handle dh, data1_absyn *abs, - data1_element *parent, - const char *tagname) -{ - data1_element *r; - - /* It's now possible to have a data1 tree with no abstract syntax */ - if ( !abs ) - return 0; - - if (!parent) - r = abs->main_elements; - else - r = parent->children; - - for (; r; r = r->next) - { - data1_name *n; - - for (n = r->tag->names; n; n = n->next) - if (!data1_matchstr(tagname, n->name)) - return r; - } - return 0; -} - -data1_element *data1_getelementbyname (data1_handle dh, data1_absyn *absyn, - const char *name) -{ - data1_element *r; - - /* It's now possible to have a data1 tree with no abstract syntax */ - if ( !absyn ) - return 0; - for (r = absyn->main_elements; r; r = r->next) - if (!data1_matchstr(r->name, name)) - return r; - return 0; -} - - -void fix_element_ref (data1_handle dh, data1_absyn *absyn, data1_element *e) -{ - /* It's now possible to have a data1 tree with no abstract syntax */ - if ( !absyn ) - return; - - 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 - yaz_log (LOG_WARN, "Unresolved reference to sub-elements %s", - e->sub_name); - } - } -} - - -static int parse_termlists (data1_handle dh, data1_termlist ***tpp, - char *p, const char *file, int lineno, - const char *element_name, data1_absyn *res) -{ - data1_termlist **tp = *tpp; - do - { - char attname[512], structure[512]; - char *source; - int r; - - if (!(r = sscanf(p, "%511[^:,]:%511[^,]", attname, - structure))) - { - yaz_log(LOG_WARN, - "%s:%d: Syntax error in termlistspec '%s'", - file, lineno, p); - return -1; - } - if (*attname == '!') - strcpy(attname, element_name); - *tp = (data1_termlist *) - nmem_malloc(data1_nmem_get(dh), sizeof(**tp)); - (*tp)->next = 0; - if (!((*tp)->att = data1_getattbyname(dh, res->attset, - attname))) - { - yaz_log(LOG_WARN, - "%s:%d: Couldn't find att '%s' in attset", - file, lineno, attname); - return -1; - } - if (r == 2 && (source = strchr(structure, ':'))) - *source++ = '\0'; /* cut off structure .. */ - else - source = "data"; /* ok: default is leaf data */ - (*tp)->source = (char *) - nmem_strdup (data1_nmem_get (dh), source); - - if (r < 2) /* is the structure qualified? */ - (*tp)->structure = "w"; - else - (*tp)->structure = (char *) - nmem_strdup (data1_nmem_get (dh), structure); - tp = &(*tp)->next; - } - while ((p = strchr(p, ',')) && *(++p)); - *tpp = tp; - return 0; -} - -data1_absyn *data1_read_absyn (data1_handle dh, const char *file, - int file_must_exist) -{ - data1_sub_elements *cur_elements = NULL; - data1_absyn *res = 0; - FILE *f; - data1_element **ppl[D1_MAX_NESTING]; - data1_esetname **esetpp; - data1_maptab **maptabp; - data1_marctab **marcp; - data1_termlist *all = 0; - data1_attset_child **attset_childp; - data1_tagset **tagset_childp; - int level = 0; - int lineno = 0; - int argc; - char *argv[50], line[512]; - - if (!(f = data1_path_fopen(dh, file, "r"))) - { - yaz_log(LOG_WARN|LOG_ERRNO, "Couldn't open %s", file); - if (file_must_exist) - return 0; - } - - res = (data1_absyn *) nmem_malloc(data1_nmem_get(dh), sizeof(*res)); - res->name = 0; - res->reference = VAL_NONE; - res->tagset = 0; - res->encoding = 0; - res->enable_xpath_indexing = (f ? 0 : 1); - tagset_childp = &res->tagset; - - res->attset = data1_empty_attset (dh); - attset_childp = &res->attset->children; - - res->varset = 0; - res->esetnames = 0; - esetpp = &res->esetnames; - res->maptabs = 0; - maptabp = &res->maptabs; - res->marc = 0; - marcp = &res->marc; - - res->sub_elements = NULL; - res->main_elements = NULL; - - while (f && (argc = readconf_line(f, &lineno, line, 512, argv, 50))) - { - char *cmd = *argv; - if (!strcmp(cmd, "elm") || !strcmp(cmd, "element")) - { - data1_element *new_element; - int i; - char *p, *sub_p, *path, *name, *termlists; - int type, value; - data1_termlist **tp; - - if (argc < 4) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to elm", file, lineno); - continue; - } - path = argv[1]; - name = argv[2]; - termlists = argv[3]; - - if (!cur_elements) - { - cur_elements = (data1_sub_elements *) - nmem_malloc(data1_nmem_get(dh), sizeof(*cur_elements)); - cur_elements->next = res->sub_elements; - cur_elements->elements = NULL; - cur_elements->name = "main"; - res->sub_elements = cur_elements; - - level = 0; - ppl[level] = &cur_elements->elements; - } - p = path; - for (i = 1;; i++) - { - char *e; - - if ((e = strchr(p, '/'))) - p = e+1; - else - break; - } - if (i > level+1) - { - yaz_log(LOG_WARN, "%s:%d: Bad level increase", file, lineno); - fclose(f); - return 0; - } - level = i; - new_element = *ppl[level-1] = (data1_element *) - 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-1] = &new_element->next; - ppl[level] = &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) - { - if (!res->tagset) - { - yaz_log(LOG_WARN, "%s:%d: No tagset loaded", file, lineno); - fclose(f); - return 0; - } - if (!(new_element->tag = data1_gettagbynum (dh, res->tagset, - type, value))) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't find tag %s in tagset", - file, lineno, p); - fclose(f); - return 0; - } - } - /* private tag */ - else if (*p) - { - data1_tag *nt = - new_element->tag = (data1_tag *) - nmem_malloc(data1_nmem_get (dh), - sizeof(*new_element->tag)); - nt->which = DATA1T_string; - nt->value.string = nmem_strdup(data1_nmem_get (dh), p); - nt->names = (data1_name *) - nmem_malloc(data1_nmem_get(dh), - sizeof(*new_element->tag->names)); - nt->names->name = nt->value.string; - nt->names->next = 0; - nt->kind = DATA1K_string; - nt->next = 0; - nt->tagset = 0; - } - else - { - yaz_log(LOG_WARN, "%s:%d: Bad element", file, lineno); - fclose(f); - return 0; - } - /* parse termList definitions */ - p = termlists; - if (*p != '-') - { - assert (res->attset); - - if (parse_termlists (dh, &tp, p, file, lineno, name, res)) - { - fclose (f); - return 0; - } - *tp = all; /* append any ALL entries to the list */ - } - new_element->name = nmem_strdup(data1_nmem_get (dh), name); - } - else if (!strcmp(cmd, "section")) - { - char *name; - - if (argc < 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to section", - file, lineno); - continue; - } - name = argv[1]; - - cur_elements = (data1_sub_elements *) - nmem_malloc(data1_nmem_get(dh), sizeof(*cur_elements)); - cur_elements->next = res->sub_elements; - cur_elements->elements = NULL; - cur_elements->name = nmem_strdup (data1_nmem_get(dh), name); - res->sub_elements = cur_elements; - - level = 0; - ppl[level] = &cur_elements->elements; - } - else if (!strcmp(cmd, "xpath")) - { - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to 'xpath' directive", - file, lineno); - continue; - } - if (!strcmp(argv[1], "enable")) - res->enable_xpath_indexing = 1; - else if (!strcmp (argv[1], "disable")) - res->enable_xpath_indexing = 0; - else - { - yaz_log(LOG_WARN, "%s:%d: Expecting disable/enable " - "after 'xpath' directive", file, lineno); - } - } - else if (!strcmp(cmd, "all")) - { - data1_termlist **tp = &all; - if (all) - { - yaz_log(LOG_WARN, "%s:%d: Too many 'all' directives - ignored", - file, lineno); - continue; - } - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to 'all' directive", - file, lineno); - continue; - } - if (parse_termlists (dh, &tp, argv[1], file, lineno, 0, res)) - { - fclose (f); - return 0; - } - } - else if (!strcmp(cmd, "name")) - { - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to name directive", - file, lineno); - continue; - } - res->name = nmem_strdup(data1_nmem_get(dh), argv[1]); - } - else if (!strcmp(cmd, "reference")) - { - char *name; - - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to reference", - file, lineno); - continue; - } - name = argv[1]; - if ((res->reference = oid_getvalbyname(name)) == VAL_NONE) - { - yaz_log(LOG_WARN, "%s:%d: Unknown tagset ref '%s'", - file, lineno, name); - continue; - } - } - else if (!strcmp(cmd, "attset")) - { - char *name; - data1_attset *attset; - - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to attset", - file, lineno); - continue; - } - name = argv[1]; - if (!(attset = data1_get_attset (dh, name))) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't find attset %s", - file, lineno, name); - continue; - } - *attset_childp = (data1_attset_child *) - nmem_malloc (data1_nmem_get(dh), sizeof(**attset_childp)); - (*attset_childp)->child = attset; - (*attset_childp)->next = 0; - attset_childp = &(*attset_childp)->next; - } - else if (!strcmp(cmd, "tagset")) - { - char *name; - int type = 0; - if (argc < 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args to tagset", - file, lineno); - continue; - } - name = argv[1]; - if (argc == 3) - type = atoi(argv[2]); - *tagset_childp = data1_read_tagset (dh, name, type); - if (!(*tagset_childp)) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't load tagset %s", - file, lineno, name); - continue; - } - tagset_childp = &(*tagset_childp)->next; - } - else if (!strcmp(cmd, "varset")) - { - char *name; - - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args in varset", - file, lineno); - continue; - } - name = argv[1]; - if (!(res->varset = data1_read_varset (dh, name))) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't load Varset %s", - file, lineno, name); - continue; - } - } - else if (!strcmp(cmd, "esetname")) - { - char *name, *fname; - - if (argc != 3) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args in esetname", - file, lineno); - continue; - } - name = argv[1]; - fname = argv[2]; - - *esetpp = (data1_esetname *) - nmem_malloc(data1_nmem_get(dh), sizeof(**esetpp)); - (*esetpp)->name = nmem_strdup(data1_nmem_get(dh), name); - (*esetpp)->next = 0; - if (*fname == '@') - (*esetpp)->spec = 0; - else if (!((*esetpp)->spec = data1_read_espec1 (dh, fname))) - { - yaz_log(LOG_WARN, "%s:%d: Espec-1 read failed for %s", - file, lineno, fname); - continue; - } - esetpp = &(*esetpp)->next; - } - else if (!strcmp(cmd, "maptab")) - { - char *name; - - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # of args for maptab", - file, lineno); - continue; - } - name = argv[1]; - if (!(*maptabp = data1_read_maptab (dh, name))) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't load maptab %s", - file, lineno, name); - continue; - } - maptabp = &(*maptabp)->next; - } - else if (!strcmp(cmd, "marc")) - { - char *name; - - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # or args for marc", - file, lineno); - continue; - } - name = argv[1]; - if (!(*marcp = data1_read_marctab (dh, name))) - { - yaz_log(LOG_WARN, "%s:%d: Couldn't read marctab %s", - file, lineno, name); - continue; - } - marcp = &(*marcp)->next; - } - else if (!strcmp(cmd, "encoding")) - { - if (argc != 2) - { - yaz_log(LOG_WARN, "%s:%d: Bad # or args for encoding", - file, lineno); - continue; - } - res->encoding = nmem_strdup (data1_nmem_get(dh), argv[1]); - } - else - { - yaz_log(LOG_WARN, "%s:%d: Unknown directive '%s'", file, - lineno, cmd); - continue; - } - } - if (f) - fclose(f); - - 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); - } - yaz_log (LOG_DEBUG, "%s: data1_read_absyn end", file); - return res; -}