X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=retrieval%2Fd1_read.c;h=281f7caf5494f9c845e58a50d81548eafc444b64;hb=5b690aebb8dc2d05cad8f668de8fd821a1c231fa;hp=2660283d3cb9268d4a8cfa59c8769266a6a4c5b2;hpb=263fe1daee74b19f379ed1a68222d09ef4c2752d;p=yaz-moved-to-github.git diff --git a/retrieval/d1_read.c b/retrieval/d1_read.c index 2660283..281f7ca 100644 --- a/retrieval/d1_read.c +++ b/retrieval/d1_read.c @@ -3,7 +3,7 @@ * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * - * $Id: d1_read.c,v 1.52 2002-09-24 07:58:59 adam Exp $ + * $Id: d1_read.c,v 1.54 2002-10-08 23:00:09 adam Exp $ */ #include @@ -60,29 +60,8 @@ data1_node *data1_mk_node_type (data1_handle dh, NMEM m, int type) return data1_mk_node2 (dh, m, type, 0); } -data1_node *data1_mk_node2 (data1_handle dh, NMEM m, int type, - data1_node *parent) +static void data1_init_node (data1_handle dh, data1_node *r, int type) { - data1_node *r; - - r = (data1_node *)nmem_malloc(m, sizeof(*r)); - r->next = r->child = r->last_child = 0; - r->destroy = 0; - - if (!parent) - { - r->root = r; - } - else - { - r->root = parent->root; - r->parent = parent; - if (!parent->child) - parent->child = parent->last_child = r; - else - parent->last_child->next = r; - parent->last_child = r; - } r->which = type; switch(type) { @@ -122,6 +101,57 @@ data1_node *data1_mk_node2 (data1_handle dh, NMEM m, int type, default: logf (LOG_WARN, "data_mk_node_type. bad type = %d\n", type); } +} + +data1_node *data1_append_node (data1_handle dh, NMEM m, int type, + data1_node *parent) +{ + data1_node *r = (data1_node *)nmem_malloc(m, sizeof(*r)); + r->next = r->child = r->last_child = 0; + r->destroy = 0; + + if (!parent) + r->root = r; + else + { + r->root = parent->root; + r->parent = parent; + if (!parent->child) + parent->child = parent->last_child = r; + else + parent->last_child->next = r; + parent->last_child = r; + } + data1_init_node(dh, r, type); + return r; +} + +data1_node *data1_mk_node2 (data1_handle dh, NMEM m, int type, + data1_node *parent) +{ + return data1_append_node (dh, m, type, parent); +} + +data1_node *data1_insert_node (data1_handle dh, NMEM m, int type, + data1_node *parent) +{ + data1_node *r = (data1_node *)nmem_malloc(m, sizeof(*r)); + r->next = r->child = r->last_child = 0; + r->destroy = 0; + + if (!parent) + r->root = r; + else + { + r->root = parent->root; + r->parent = parent; + if (!parent->child) + parent->last_child = r; + else + r->next = parent->child; + parent->child = r; + } + data1_init_node(dh, r, type); return r; } @@ -187,6 +217,8 @@ data1_node *data1_mk_preprocess_n (data1_handle dh, NMEM nmem, *p = (data1_xattr*) nmem_malloc (nmem, sizeof(**p)); (*p)->name = nmem_strdup (nmem, *attr++); (*p)->value = nmem_strdup (nmem, *attr++); + (*p)->what = DATA1I_text; + p = &(*p)->next; } *p = 0; @@ -223,6 +255,7 @@ data1_node *data1_mk_tag_n (data1_handle dh, NMEM nmem, *p = (data1_xattr*) nmem_malloc (nmem, sizeof(**p)); (*p)->name = nmem_strdup (nmem, *attr++); (*p)->value = nmem_strdup (nmem, *attr++); + (*p)->what = DATA1I_text; p = &(*p)->next; } *p = 0; @@ -246,6 +279,7 @@ void data1_tag_add_attr (data1_handle dh, NMEM nmem, *p = (data1_xattr*) nmem_malloc (nmem, sizeof(**p)); (*p)->name = nmem_strdup (nmem, *attr++); (*p)->value = nmem_strdup (nmem, *attr++); + (*p)->what = DATA1I_text; p = &(*p)->next; } *p = 0; @@ -352,7 +386,8 @@ char *data1_insert_string (data1_handle dh, data1_node *res, static data1_node *data1_add_insert_taggeddata(data1_handle dh, data1_node *at, const char *tagname, NMEM m, - int local_allowed) + int local_allowed, + int insert_mode) { data1_node *root = at->root; data1_node *partag = get_parent_tag (dh, at); @@ -370,7 +405,10 @@ static data1_node *data1_add_insert_taggeddata(data1_handle dh, } if (local_allowed || e) { - tagn = data1_mk_node2 (dh, m, DATA1N_tag, at); + if (insert_mode) + tagn = data1_insert_node (dh, m, DATA1N_tag, at); + else + tagn = data1_append_node (dh, m, DATA1N_tag, at); tagn->u.tag.tag = data1_insert_string (dh, tagn, m, tagname); tagn->u.tag.element = e; datn = data1_mk_node2 (dh, m, DATA1N_data, tagn); @@ -381,7 +419,7 @@ static data1_node *data1_add_insert_taggeddata(data1_handle dh, data1_node *data1_mk_tag_data(data1_handle dh, data1_node *at, const char *tagname, NMEM m) { - return data1_add_insert_taggeddata (dh, at, tagname, m, 1); + return data1_add_insert_taggeddata (dh, at, tagname, m, 1, 0); } @@ -393,21 +431,21 @@ data1_node *data1_mk_tag_data(data1_handle dh, data1_node *at, data1_node *data1_mk_tag_data_wd(data1_handle dh, data1_node *at, const char *tagname, NMEM m) { - return data1_add_insert_taggeddata (dh, at, tagname, m, 0); + return data1_add_insert_taggeddata (dh, at, tagname, m, 0, 1); } data1_node *data1_insert_taggeddata (data1_handle dh, data1_node *root, data1_node *at, const char *tagname, NMEM m) { - return data1_add_insert_taggeddata (dh, at, tagname, m, 0); + return data1_add_insert_taggeddata (dh, at, tagname, m, 0, 1); } data1_node *data1_add_taggeddata (data1_handle dh, data1_node *root, data1_node *at, const char *tagname, NMEM m) { - return data1_add_insert_taggeddata (dh, at, tagname, m, 1); + return data1_add_insert_taggeddata (dh, at, tagname, m, 1, 0); } data1_node *data1_mk_tag_data_int (data1_handle dh, data1_node *at, @@ -489,6 +527,11 @@ data1_node *data1_mk_tag_data_text_uni (data1_handle dh, data1_node *at, static int ampr (int (*get_byte)(void *fh), void *fh, int *amp) { +#if 1 + int c = (*get_byte)(fh); + *amp = 0; + return c; +#else int c = (*get_byte)(fh); *amp = 0; if (c == '&') @@ -524,6 +567,7 @@ static int ampr (int (*get_byte)(void *fh), void *fh, int *amp) } } return c; +#endif } data1_xattr *data1_read_xattr (data1_handle dh, NMEM m, @@ -545,6 +589,7 @@ data1_xattr *data1_read_xattr (data1_handle dh, NMEM m, p->next = 0; pp = &p->next; p->value = 0; + p->what = DATA1I_xmltext; wrbuf_rewind(wrbuf); while (c && c != '=' && c != '>' && c != '/' && !d1_isspace(c)) @@ -837,7 +882,7 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, continue; } res = data1_mk_node2 (dh, m, DATA1N_data, parent); - res->u.data.what = DATA1I_text; + res->u.data.what = DATA1I_xmltext; res->u.data.formatted_text = 0; d1_stack[level] = res;