/* This file is part of the Zebra server.
- Copyright (C) 1994-2010 Index Data
+ Copyright (C) Index Data
Zebra is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
/*
- * This module reads "loose" SGML and converts it to data1 tree
+ * This module reads "loose" SGML and converts it to data1 tree
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
}
return n;
}
-
+
/*
* get the tag which is the immediate parent of this node (this may mean
* traversing intermediate things like variants and stuff.
{
data1_node *r = (data1_node *)nmem_malloc(m, sizeof(*r));
r->next = r->child = r->last_child = 0;
-
+
if (!parent)
r->root = r;
else
if (!absyn)
{
yaz_log(YLOG_WARN, "Unable to acquire abstract syntax " "for '%s'",
- name);
+ name);
/* It's now OK for a record not to have an absyn */
}
res = data1_mk_node2 (dh, nmem, DATA1N_root, 0);
}
*p = 0;
}
-
+
data1_node *data1_mk_preprocess (data1_handle dh, NMEM nmem,
const char *target,
const char **attr, data1_node *at)
data1_node *res = data1_mk_node2 (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 *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 *data1_mk_tag_n (data1_handle dh, NMEM nmem,
+data1_node *data1_mk_tag_n (data1_handle dh, NMEM nmem,
const char *tag, size_t len, const char **attr,
data1_node *at)
{
data1_node *partag = get_parent_tag(dh, at);
data1_node *res = data1_mk_node2 (dh, nmem, DATA1N_tag, at);
data1_element *e = 0;
-
+
res->u.tag.tag = data1_insert_string_n (dh, res, nmem, tag, len);
-
+
if (!partag) /* top tag? */
e = data1_getelementbytagname (dh, at->root->u.root.absyn,
0 /* index as local */,
}
data1_node *data1_mk_tag (data1_handle dh, NMEM nmem,
- const char *tag, const char **attr, data1_node *at)
+ const char *tag, const char **attr, data1_node *at)
{
return data1_mk_tag_n (dh, nmem, tag, strlen(tag), attr, at);
}
return 0;
}
-data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem,
+data1_node *data1_mk_tag_uni (data1_handle dh, NMEM nmem,
const char *tag, data1_node *at)
{
data1_node *node = data1_search_tag (dh, at->child, tag);
data1_node *res = data1_mk_node2 (dh, mem, DATA1N_data, parent);
res->u.data.what = DATA1I_text;
res->u.data.len = len;
-
+
res->u.data.data = data1_insert_string_n (dh, res, mem, buf, len);
return res;
}
data1_node *res = data1_mk_node2 (dh, mem, DATA1N_comment, parent);
res->u.data.what = DATA1I_text;
res->u.data.len = len;
-
+
res->u.data.data = data1_insert_string_n (dh, res, mem, buf, len);
return res;
}
if (!partag)
e = data1_getelementbytagname (dh, root->u.root.absyn, 0, tagname);
- else
+ else
{
e = partag->u.tag.element;
if (e)
NMEM nmem)
{
data1_node *node_data;
-
+
node_data = data1_mk_tag_data (dh, at, tag, nmem);
if (!node_data)
return 0;
data1_node *node_data;
char str[128], *p = str;
Odr_oid *ii;
-
+
node_data = data1_mk_tag_data (dh, at, tag, nmem);
if (!node_data)
return 0;
-
+
for (ii = oid; *ii >= 0; ii++)
{
if (ii != oid)
NMEM nmem)
{
data1_node *node_data;
-
+
node_data = data1_mk_tag_data (dh, at, tag, nmem);
if (!node_data)
return 0;
{
char ent[20];
int i = 0;
-
+
while (1)
{
c = (*get_byte)(fh);
if (c == ';')
{
ent[i] = 0;
-
+
c = ' ';
if (!strcmp (ent, "quot"))
c = '"';
pp = &p->next;
p->value = 0;
p->what = DATA1I_xmltext;
-
+
wrbuf_rewind(wrbuf);
while (c && c != '=' && c != '>' && c != '/' && !d1_isspace(c))
{
c = ampr (get_byte, fh, amp);
if (*amp == 0 && c == '"')
{
- c = ampr (get_byte, fh, amp);
+ c = ampr (get_byte, fh, amp);
wrbuf_rewind(wrbuf);
while (*amp || (c && c != '"'))
{
}
else if (*amp == 0 && c == '\'')
{
- c = ampr (get_byte, fh, amp);
+ c = ampr (get_byte, fh, amp);
wrbuf_rewind(wrbuf);
while (*amp || (c && c != '\''))
{
break;
}
}
- else
+ else
{
if (amp == 0 && c == quote_mode)
quote_mode = 0;
else if (amp == 0 && c == '!')
{
int c0, amp0;
-
+
wrbuf_rewind(wrbuf);
-
+
c0 = ampr (get_byte, fh, &0);
if (amp0 == 0 && c0 == '\0')
break;
c = ampr (get_byte, fh, &);
-
+
if (amp0 == 0 && c0 == '-' && amp == 0 && c == '-')
{
/* COMMENT: <!-- ... --> */
int no_dash = 0;
-
+
c = ampr (get_byte, fh, &);
while (amp || c)
{
else if (amp == 0 && c == '>' && no_dash >= 2)
{
if (level > 0)
- d1_stack[level] =
+ d1_stack[level] =
data1_mk_comment_n (
dh, m,
wrbuf_buf(wrbuf), wrbuf_len(wrbuf)-2,
}
else
{ /* DIRECTIVE: <! .. > */
-
+
int blevel = 0;
while (amp || c)
{
c = ampr (get_byte, fh, &);
/* End tag? */
- if (end_tag)
+ if (end_tag)
{
if (*tag == '\0')
--level; /* </> */
return d1_stack[0];
}
continue;
- }
- else if (!strcmp(tag, "var")
+ }
+ else if (!strcmp(tag, "var")
&& xattr && xattr->next && xattr->next->next
- && xattr->value == 0
+ && xattr->value == 0
&& xattr->next->value == 0
&& xattr->next->next->value == 0)
{
const char *type = xattr->next->name;
const char *value = xattr->next->name;
data1_vartype *tp;
-
+
yaz_log(YLOG_LOG, "Variant class=%s type=%s value=%s",
tclass, type, value);
if (!(tp =
tclass, type)))
continue;
/*
- * If we're the first variant in this group, create a parent
+ * If we're the first variant in this group, create a parent
* variant, and insert it before the current variant.
*/
if (parent->which != DATA1N_variant)
data1_insert_string (dh, res, m, value);
}
}
- else
+ else
{
-
+
/* tag .. acquire our element in the abstract syntax */
if (level == 0)
{
else /* != '<'... this is a body of text */
{
int len;
-
+
if (level == 0)
{
c = ampr (get_byte, fh, &);
res->u.data.what = DATA1I_xmltext;
res->u.data.formatted_text = 0;
d1_stack[level] = res;
-
+
wrbuf_rewind(wrbuf);
while (amp || (c && c != '<'))
res->u.data.data = (char*) nmem_malloc (m, len);
else
res->u.data.data = res->lbuf;
-
+
if (len)
memcpy (res->u.data.data, wrbuf_buf(wrbuf), len);
else
char **buf = data1_get_read_buf (dh, &size);
const char *bp;
int rd = 0, res;
-
+
if (!*buf)
*buf = (char *)xmalloc(*size = 4096);
-
+
for (;;)
{
if (rd + 2048 >= *size && !(*buf =(char *)xrealloc(*buf, *size *= 2)))
}
-static int conv_item(NMEM m, yaz_iconv_t t,
+static int conv_item(NMEM m, yaz_iconv_t t,
WRBUF wrbuf, char *inbuf, size_t inlen)
{
wrbuf_rewind(wrbuf);
== 0)
{
n->u.tag.tag =
- data1_insert_string_n (dh, n, m,
+ data1_insert_string_n (dh, n, m,
wrbuf->buf, wrbuf->pos);
}
if (n->u.tag.attributes)
}
int data1_iconv (data1_handle dh, NMEM m, data1_node *n,
- const char *tocode,
+ const char *tocode,
const char *fromcode)
{
if (yaz_matchstr (tocode, fromcode))
{
if (n->which == DATA1N_data)
{
-
+
int sz = n->u.data.len;
const char *ndata = n->u.data.data;
int off = 0;
-
+
for (off = 0; off < sz; off++)
if (!d1_isspace(ndata[off]))
break;
sz = sz - off;
ndata += off;
-
+
while (sz && d1_isspace(ndata[sz - 1]))
sz--;
n->u.data.data = nmem_malloc(m, sz);
n->u.data.len = sz;
memcpy(n->u.data.data, ndata, sz);
-
+
}
data1_chop_text(dh, m, n->child);
}
{
for (; n; n = n->next)
{
- if (n->which == DATA1N_data && n->next &&
+ if (n->which == DATA1N_data && n->next &&
n->next->which == DATA1N_data)
{
int sz = 0;
n->next = np;
if (!np && n->parent)
n->parent->last_child = n;
-
+
}
data1_concat_text(dh, m, n->child);
}