X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=data1%2Fd1_read.c;h=0db4c89622b08ed14c8f2d4f152578debf455963;hb=43e4297c07b9c8b29bfc1ea647fc27456198f6ce;hp=91bea6ccf2cc4c3125e4cb8bb4c19763cc1622be;hpb=0955b9f1ed141bfc60beb7afd63a790aa6525a23;p=idzebra-moved-to-github.git diff --git a/data1/d1_read.c b/data1/d1_read.c index 91bea6c..0db4c89 100644 --- a/data1/d1_read.c +++ b/data1/d1_read.c @@ -1,5 +1,5 @@ -/* $Id: d1_read.c,v 1.17 2005-04-28 08:12:28 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: d1_read.c,v 1.25 2007-04-16 08:44:31 adam Exp $ + Copyright (C) 1995-2007 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 + */ @@ -125,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) @@ -154,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; @@ -172,24 +170,11 @@ 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(YLOG_WARN, "Unable to acquire abstract syntax " "for '%s'", @@ -205,7 +190,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; @@ -607,7 +593,6 @@ data1_xattr *data1_read_xattr (data1_handle dh, NMEM m, for (;;) { data1_xattr *p; - int len; while (*amp || (c && d1_isspace(c))) c = ampr (get_byte, fh, amp); if (*amp == 0 && (c == 0 || c == '>' || c == '/')) @@ -624,10 +609,7 @@ data1_xattr *data1_read_xattr (data1_handle dh, NMEM m, wrbuf_putc (wrbuf, c); c = ampr (get_byte, fh, amp); } - wrbuf_putc (wrbuf, '\0'); - len = wrbuf_len(wrbuf); - p->name = (char*) nmem_malloc (m, len); - strcpy (p->name, wrbuf_buf(wrbuf)); + p->name = nmem_strdup (m, wrbuf_cstr(wrbuf)); if (c == '=') { c = ampr (get_byte, fh, amp); @@ -664,10 +646,7 @@ data1_xattr *data1_read_xattr (data1_handle dh, NMEM m, c = ampr (get_byte, fh, amp); } } - wrbuf_putc (wrbuf, '\0'); - len = wrbuf_len(wrbuf); - p->value = (char*) nmem_malloc (m, len); - strcpy (p->value, wrbuf_buf(wrbuf)); + p->value = nmem_strdup(m, wrbuf_cstr(wrbuf)); } } *ch = c; @@ -980,7 +959,7 @@ data1_node *data1_read_node (data1_handle dh, const char **buf, NMEM m) data1_node *node; node = data1_read_nodex(dh, m, getc_mem, (void *) (buf), wrbuf); - wrbuf_free (wrbuf, 1); + wrbuf_destroy(wrbuf); return node; } @@ -1035,14 +1014,15 @@ static int conv_item (NMEM m, yaz_iconv_t t, { char *outbuf = wrbuf->buf + wrbuf->pos; size_t outlen = wrbuf->size - wrbuf->pos; - if (yaz_iconv (t, &inbuf, &inlen, &outbuf, &outlen) == + if (yaz_iconv(t, &inbuf, &inlen, &outbuf, &outlen) == (size_t)(-1) && yaz_iconv_error(t) != YAZ_ICONV_E2BIG) { /* bad data. stop and skip conversion entirely */ return -1; } else if (inlen == 0) - { /* finished converting */ + { /* finished converting, flush it */ + yaz_iconv(t, 0, 0, &outbuf, &outlen); wrbuf->pos = wrbuf->size - outlen; break; } @@ -1090,8 +1070,7 @@ static void data1_iconv_s (data1_handle dh, NMEM m, data1_node *n, conv_item(m, t, wrbuf, p->value, strlen(p->value)) == 0) { - wrbuf_puts (wrbuf, ""); - p->value = nmem_strdup (m, wrbuf->buf); + p->value = nmem_strdup(m, wrbuf_cstr(wrbuf)); } } } @@ -1139,12 +1118,12 @@ int data1_iconv (data1_handle dh, NMEM m, data1_node *n, yaz_iconv_t t = yaz_iconv_open(tocode, fromcode); if (!t) { - wrbuf_free(wrbuf, 1); + wrbuf_destroy(wrbuf); return -1; } data1_iconv_s(dh, m, n, t, wrbuf, tocode); yaz_iconv_close(t); - wrbuf_free(wrbuf, 1); + wrbuf_destroy(wrbuf); } return 0; } @@ -1178,3 +1157,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 + */ +