-/* $Id: d1_read.c,v 1.4 2003-05-05 20:13:29 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: d1_read.c,v 1.8.2.2 2005-04-23 16:31:54 adam Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
Index Data Aps
This file is part of the Zebra server.
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)
r->root = r;
else
{
r->root = parent->root;
- r->parent = parent;
if (!parent->child)
parent->child = parent->last_child = r;
else
res->u.root.absyn = absyn;
}
+void data1_add_attrs(data1_handle dh, NMEM nmem, const char **attr,
+ data1_xattr **p)
+{
+ while (*p)
+ p = &(*p)->next;
+
+ while (attr && *attr)
+ {
+ *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;
+}
+
data1_node *data1_mk_preprocess (data1_handle dh, NMEM nmem,
const char *target,
const char **attr, data1_node *at)
const char *target, size_t len,
const char **attr, data1_node *at)
{
- data1_xattr **p;
data1_node *res = data1_mk_node2 (dh, nmem, DATA1N_preprocess, at);
res->u.preprocess.target = data1_insert_string_n (dh, res, nmem,
target, len);
- p = &res->u.preprocess.attributes;
- while (attr && *attr)
- {
- *p = (data1_xattr*) nmem_malloc (nmem, sizeof(**p));
- (*p)->name = nmem_strdup (nmem, *attr++);
- (*p)->value = nmem_strdup (nmem, *attr++);
- (*p)->what = DATA1I_text;
+ data1_add_attrs(dh, nmem, attr, &res->u.preprocess.attributes);
+ return res;
+}
- p = &(*p)->next;
- }
- *p = 0;
+data1_node *data1_insert_preprocess (data1_handle dh, NMEM nmem,
+ const char *target,
+ const char **attr, data1_node *at)
+{
+ return data1_insert_preprocess_n (dh, nmem, target, strlen(target),
+ attr, at);
+}
+
+data1_node *data1_insert_preprocess_n (data1_handle dh, NMEM nmem,
+ const char *target, size_t len,
+ const char **attr, data1_node *at)
+{
+ data1_node *res = data1_insert_node (dh, nmem, DATA1N_preprocess, at);
+ res->u.preprocess.target = data1_insert_string_n (dh, res, nmem,
+ target, len);
+
+ data1_add_attrs(dh, nmem, attr, &res->u.preprocess.attributes);
return res;
}
{
data1_node *partag = get_parent_tag(dh, at);
data1_node *res = data1_mk_node2 (dh, nmem, DATA1N_tag, at);
- data1_xattr **p;
data1_element *e = 0;
res->u.tag.tag = data1_insert_string_n (dh, res, nmem, tag, len);
e, res->u.tag.tag);
}
res->u.tag.element = e;
- p = &res->u.tag.attributes;
- while (attr && *attr)
- {
- *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;
+ data1_add_attrs(dh, nmem, attr, &res->u.tag.attributes);
return res;
}
void data1_tag_add_attr (data1_handle dh, NMEM nmem,
data1_node *res, const char **attr)
{
- data1_xattr **p;
-
if (res->which != DATA1N_tag)
return;
- p = &res->u.tag.attributes;
- while (*p)
- p = &(*p)->next;
-
- while (attr && *attr)
- {
- *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;
+ data1_add_attrs(dh, nmem, attr, &res->u.tag.attributes);
}
data1_node *data1_mk_tag (data1_handle dh, NMEM nmem,
{
data1_xattr *xattr;
- char tag[64];
- char args[256];
+ char tag[256];
int null_tag = 0;
int end_tag = 0;
size_t i = 0;
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;
}
tag[i] = '\0';
xattr = data1_read_xattr (dh, m, get_byte, fh, wrbuf, &c, &);
- args[0] = '\0';
if (amp == 0 && c == '/')
{ /* <tag attrs/> or <tag/> */
null_tag = 1;
}
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];
+ /* <var class type value> */
+ 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;
- }
+
if (!(tp =
data1_getvartypebyct(dh,
parent->root->u.root.absyn->varset,
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
WRBUF wrbuf = wrbuf_alloc();
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);
n->u.data.data = ndata;
n->u.data.len = sz;
n->next = np;
+ if (!np && n->parent)
+ n->parent->last_child = n;
+
}
data1_concat_text(dh, m, n->child);
}