X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=data1%2Fd1_read.c;h=52e2364312f3ea71f08b99c78c4392172d3765a0;hb=b9c1a6fcf5c4821d0190efdecbc14ea5d6c96aec;hp=742e170c0c2bafb2946fe5f04157533c2d5b8b7c;hpb=2e4e9c6def27f1e1463dcb6f205fab6a98054f38;p=idzebra-moved-to-github.git diff --git a/data1/d1_read.c b/data1/d1_read.c index 742e170..52e2364 100644 --- a/data1/d1_read.c +++ b/data1/d1_read.c @@ -1,6 +1,6 @@ -/* $Id: d1_read.c,v 1.9 2004-08-04 08:35:22 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 - Index Data Aps +/* $Id: d1_read.c,v 1.21 2006-08-14 10:40:06 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ @@ -29,10 +29,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include #include -#include -#include +#include data1_node *data1_get_root_tag (data1_handle dh, data1_node *n) { @@ -118,7 +116,7 @@ static void data1_init_node (data1_handle dh, data1_node *r, int type) r->u.preprocess.attributes = 0; break; default: - logf (LOG_WARN, "data_mk_node_type. bad type = %d\n", type); + yaz_log (YLOG_WARN, "data_mk_node_type. bad type = %d\n", type); } } @@ -127,7 +125,6 @@ data1_node *data1_append_node (data1_handle dh, NMEM m, int type, { data1_node *r = (data1_node *)nmem_malloc(m, sizeof(*r)); r->next = r->child = r->last_child = 0; - r->destroy = 0; r->parent = parent; if (!parent) @@ -156,7 +153,6 @@ data1_node *data1_insert_node (data1_handle dh, NMEM m, int type, { 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; @@ -174,27 +170,13 @@ data1_node *data1_insert_node (data1_handle dh, NMEM m, int type, return r; } -void data1_free_tree (data1_handle dh, data1_node *t) -{ - data1_node *p = t->child, *pn; - - while (p) - { - pn = p->next; - data1_free_tree (dh, p); - p = pn; - } - if (t->destroy) - (*t->destroy)(t); -} - data1_node *data1_mk_root (data1_handle dh, NMEM nmem, const char *name) { - data1_absyn *absyn = data1_get_absyn (dh, name); + data1_absyn *absyn = data1_get_absyn(dh, name, 1); data1_node *res; if (!absyn) { - yaz_log(LOG_WARN, "Unable to acquire abstract syntax " "for '%s'", + yaz_log(YLOG_WARN, "Unable to acquire abstract syntax " "for '%s'", name); /* It's now OK for a record not to have an absyn */ } @@ -207,7 +189,8 @@ data1_node *data1_mk_root (data1_handle dh, NMEM nmem, const char *name) void data1_set_root(data1_handle dh, data1_node *res, NMEM nmem, const char *name) { - data1_absyn *absyn = data1_get_absyn (dh, name); + data1_absyn *absyn = data1_get_absyn( + dh, name, DATA1_XPATH_INDEXING_ENABLE); res->u.root.type = data1_insert_string (dh, res, nmem, name); res->u.root.absyn = absyn; @@ -699,8 +682,7 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, { data1_xattr *xattr; - char tag[64]; - char args[256]; + char tag[256]; int null_tag = 0; int end_tag = 0; size_t i = 0; @@ -711,6 +693,33 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, end_tag = 1; c = ampr (get_byte, fh, &); } + else if (amp == 0 && c == '?') + { + int quote_mode = 0; + while ((c = ampr(get_byte, fh, &))) + { + if (amp) + continue; + if (quote_mode == 0) + { + if (c == '"') + quote_mode = c; + else if (c == '\'') + quote_mode = c; + else if (c == '>') + { + c = ampr(get_byte, fh, &); + break; + } + } + else + { + if (amp == 0 && c == quote_mode) + quote_mode = 0; + } + } + continue; + } else if (amp == 0 && c == '!') { int c0, amp0; @@ -778,7 +787,6 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, } tag[i] = '\0'; xattr = data1_read_xattr (dh, m, get_byte, fh, wrbuf, &c, &); - args[0] = '\0'; if (amp == 0 && c == '/') { /* or */ null_tag = 1; @@ -786,7 +794,7 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, } if (amp || c != '>') { - yaz_log(LOG_WARN, "d1: %d: Malformed tag", line); + yaz_log(YLOG_WARN, "d1: %d: Malformed tag", line); return 0; } else @@ -814,7 +822,7 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, } if (i != level) { - yaz_log (LOG_WARN, "%d: no begin tag for %s", + yaz_log (YLOG_WARN, "%d: no begin tag for %s", line, tag); break; } @@ -831,17 +839,20 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, } continue; } - else if (!strcmp(tag, "var")) + else if (!strcmp(tag, "var") + && xattr && xattr->next && xattr->next->next + && xattr->value == 0 + && xattr->next->value == 0 + && xattr->next->next->value == 0) { - char tclass[DATA1_MAX_SYMBOL], type[DATA1_MAX_SYMBOL]; + /* */ + const char *tclass = xattr->name; + const char *type = xattr->next->name; + const char *value = xattr->next->name; data1_vartype *tp; - int val_offset; - if (sscanf(args, "%s %s %n", tclass, type, &val_offset) != 2) - { - yaz_log(LOG_WARN, "Malformed variant triple at '%s'", tag); - continue; - } + yaz_log(YLOG_LOG, "Variant class=%s type=%s value=%s", + tclass, type, value); if (!(tp = data1_getvartypebyct(dh, parent->root->u.root.absyn->varset, @@ -871,7 +882,7 @@ data1_node *data1_read_nodex (data1_handle dh, NMEM m, res = data1_mk_node2 (dh, m, DATA1N_variant, parent); res->u.variant.type = tp; res->u.variant.value = - data1_insert_string (dh, res, m, args + val_offset); + data1_insert_string (dh, res, m, value); } } else @@ -1110,12 +1121,15 @@ int data1_iconv (data1_handle dh, NMEM m, data1_node *n, if (yaz_matchstr (tocode, fromcode)) { WRBUF wrbuf = wrbuf_alloc(); - yaz_iconv_t t = yaz_iconv_open (tocode, fromcode); + yaz_iconv_t t = yaz_iconv_open(tocode, fromcode); if (!t) + { + wrbuf_free(wrbuf, 1); return -1; - data1_iconv_s (dh, m, n, t, wrbuf, tocode); - yaz_iconv_close (t); - wrbuf_free (wrbuf, 1); + } + data1_iconv_s(dh, m, n, t, wrbuf, tocode); + yaz_iconv_close(t); + wrbuf_free(wrbuf, 1); } return 0; } @@ -1149,3 +1163,11 @@ void data1_concat_text(data1_handle dh, NMEM m, data1_node *n) data1_concat_text(dh, m, n->child); } } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +