X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=retrieval%2Fd1_read.c;h=a4305657383bed57fe69ecba611b717522999df7;hp=c951c97dc68aa6b4bf05a6f0579e438b363bd4f3;hb=e9728b65671cd921aeefddf5474689b0dbaf2010;hpb=cea212fba995de3fa0d6d6723d828f6fd7ca31df diff --git a/retrieval/d1_read.c b/retrieval/d1_read.c index c951c97..a430565 100644 --- a/retrieval/d1_read.c +++ b/retrieval/d1_read.c @@ -4,7 +4,45 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: d1_read.c,v $ - * Revision 1.1 1995-11-01 11:56:09 quinn + * Revision 1.13 1996-10-29 13:35:38 adam + * Implemented data1_set_tabpath and data1_get_tabpath. + * + * Revision 1.12 1996/10/11 10:35:38 adam + * Fixed a bug that caused data1_read_node to core dump when no abstract + * syntax was defined in a "sgml"-record. + * + * Revision 1.11 1996/07/06 19:58:35 quinn + * System headerfiles gathered in yconfig + * + * Revision 1.10 1996/01/19 15:41:47 quinn + * Fixed uninitialized boolean. + * + * Revision 1.9 1996/01/17 14:52:47 adam + * Changed prototype for reader function parsed to data1_read_record. + * + * Revision 1.8 1995/12/15 16:20:41 quinn + * Added formatted text. + * + * Revision 1.7 1995/12/13 13:44:32 quinn + * Modified Data1-system to use nmem + * + * Revision 1.6 1995/12/12 16:37:08 quinn + * Added destroy element to data1_node. + * + * Revision 1.5 1995/12/11 15:22:37 quinn + * Added last_child field to the node. + * Rewrote schema-mapping. + * + * Revision 1.4 1995/11/13 09:27:36 quinn + * Fiddling with the variant stuff. + * + * Revision 1.3 1995/11/01 16:34:57 quinn + * Making data1 look for tables in data1_tabpath + * + * Revision 1.2 1995/11/01 13:54:48 quinn + * Minor adjustments + * + * Revision 1.1 1995/11/01 11:56:09 quinn * Added Retrieval (data management) functions en masse. * * Revision 1.14 1995/10/30 12:40:55 quinn @@ -58,9 +96,32 @@ #include #include -#include "data1.h" +#include +char *data1_tabpath = 0; /* global path for tables */ + +void data1_set_tabpath(const char *p) +{ + if (data1_tabpath) + { + xfree (data1_tabpath); + data1_tabpath = NULL; + } + if (p) + { + data1_tabpath = xmalloc (strlen(p)+1); + strcpy (data1_tabpath, p); + } +} + +const char *data1_get_tabpath (void) +{ + return data1_tabpath; +} + +#if 0 static data1_node *freelist = 0; +#endif /* * get the tag which is the immediate parent of this node (this may mean @@ -74,25 +135,32 @@ data1_node *get_parent_tag(data1_node *n) return 0; } -data1_node *data1_mk_node(void) +data1_node *data1_mk_node(NMEM m) { data1_node *r; +#if 0 if ((r = freelist)) freelist = r->next; else if (!(r = xmalloc(sizeof(*r)))) abort(); - r->next = r->child = r->parent = 0; +#else + r = nmem_malloc(m, sizeof(*r)); +#endif + r->next = r->child = r->last_child = r->parent = 0; r->num_children = 0; + r->destroy = 0; return r; } +#if 0 static void fr_node(data1_node *n) { n->next = freelist; freelist = n; } +#endif void data1_free_tree(data1_node *t) { @@ -104,7 +172,11 @@ void data1_free_tree(data1_node *t) data1_free_tree(p); p = pn; } + if (t->destroy) + (*t->destroy)(t); +#if 0 fr_node(t); +#endif } /* @@ -113,26 +185,27 @@ void data1_free_tree(data1_node *t) * which can then be modified. */ data1_node *data1_insert_taggeddata(data1_node *root, data1_node *at, - char *tagname) + char *tagname, NMEM m) { - data1_node *tagn = data1_mk_node(); + data1_node *tagn = data1_mk_node(m); data1_node *datn; tagn->which = DATA1N_tag; tagn->line = -1; tagn->u.tag.tag = 0; tagn->u.tag.node_selected = 0; + tagn->u.tag.make_variantlist = 0; + tagn->u.tag.no_data_requested = 0; + tagn->u.tag.get_bytes = -1; if (!(tagn->u.tag.element = data1_getelementbytagname(root->u.root.absyn, 0, tagname))) - { - fr_node(tagn); return 0; - } - tagn->child = datn = data1_mk_node(); + tagn->child = datn = data1_mk_node(m); tagn->num_children = 1; datn->parent = tagn; datn->root = root; datn->which = DATA1N_data; + datn->u.data.formatted_text = 0; tagn->next = at->child; tagn->parent = at; at->child = tagn; @@ -145,7 +218,7 @@ data1_node *data1_insert_taggeddata(data1_node *root, data1_node *at, * 'node' and its children. */ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, - data1_absyn *absyn) + data1_absyn *absyn, NMEM m) { data1_node *res; @@ -220,7 +293,7 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, tag); return 0; } - res = data1_mk_node(); + res = data1_mk_node(m); res->which = DATA1N_root; res->u.root.type = tag; res->u.root.absyn = absyn; @@ -249,7 +322,7 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, */ if (parent->which != DATA1N_variant) { - res = data1_mk_node(); + res = data1_mk_node(m); res->which = DATA1N_variant; res->u.variant.type = 0; res->u.variant.value = 0; @@ -272,7 +345,7 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, return 0; } - res = data1_mk_node(); + res = data1_mk_node(m); res->which = DATA1N_variant; res->root = parent->root; res->u.variant.type = tp; @@ -280,7 +353,7 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, *buf = t + 1; } } - else /* acquire our element in the abstract syntax */ + else /* tag.. acquire our element in the abstract syntax */ { data1_node *partag = get_parent_tag(parent); data1_element *e = 0; @@ -307,11 +380,14 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, #else elem = data1_getelementbytagname(absyn, e, tag); #endif - res = data1_mk_node(); + res = data1_mk_node(m); res->which = DATA1N_tag; res->u.tag.element = elem; res->u.tag.tag = tag; res->u.tag.node_selected = 0; + res->u.tag.make_variantlist = 0; + res->u.tag.no_data_requested = 0; + res->u.tag.get_bytes = -1; res->root = parent->root; *buf = t + 1; } @@ -323,8 +399,9 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, /* * Read child nodes. */ - while ((*pp = data1_read_node(buf, res, line, absyn))) + while ((*pp = data1_read_node(buf, res, line, absyn, m))) { + res->last_child = *pp; res->num_children++; pp = &(*pp)->next; } @@ -337,6 +414,8 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, data1_node *partag = get_parent_tag(parent); #endif + if (!parent) /* abort if abstract syntax is undefined */ + return 0; /* Determine length and remove newlines/extra blanks */ while (**buf && **buf != '<') { @@ -355,46 +434,14 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, } while (isspace(data[len-1])) len--; - res = data1_mk_node(); + res = data1_mk_node(m); res->parent = parent; res->which = DATA1N_data; res->u.data.what = DATA1I_text; res->u.data.len = len; res->u.data.data = data; + res->u.data.formatted_text = 0; res->root = parent->root; - - /* - * if the parent is structured, we'll insert a 'wellKnown' marker - * in front of the data. - */ -#if 0 - if (partag->u.tag.element && partag->u.tag.element->tag->kind == - DATA1K_structured) - { - data1_node *wk = mk_node(); - static data1_element wk_element = { 0, 0, 0, 0, 0}; - - wk->parent = partag; - wk->root = partag->root; - wk->which = DATA1N_tag; - wk->u.tag.tag = 0; - /* - * get well-known tagdef if required. - */ - if (!wk_element.tag && !(wk_element.tag = - data1_gettagbynum(wk->root->u.root.absyn->tagset, 1, 19))) - { - logf(LOG_WARN, - "Failed to initialize 'wellknown' tag from tagsetM"); - return 0; - } - wk->u.tag.element = &wk_element; - wk->child = partag->child; - if (wk->child) - wk->child->parent = wk; - partag->child = wk; - } -#endif } return res; } @@ -402,7 +449,8 @@ data1_node *data1_read_node(char **buf, data1_node *parent, int *line, /* * Read a record in the native syntax. */ -data1_node *data1_read_record(int (*rf)(int, char *, size_t), int fd) +data1_node *data1_read_record(int (*rf)(void *, char *, size_t), void *fh, + NMEM m) { static char *buf = 0; char *bp; @@ -412,16 +460,17 @@ data1_node *data1_read_record(int (*rf)(int, char *, size_t), int fd) if (!buf && !(buf = xmalloc(size = 4096))) abort(); + for (;;) { - if (rd + 4096 > size && !(buf = realloc(buf, size *= 2))) + if (rd + 4096 > size && !(buf =xrealloc(buf, size *= 2))) abort(); - if ((res = (*rf)(fd, buf + rd, 4096)) <= 0) + if ((res = (*rf)(fh, buf + rd, 4096)) <= 0) { if (!res) { bp = buf; - return data1_read_node(&bp, 0, &line, 0); + return data1_read_node(&bp, 0, &line, 0, m); } else return 0;