X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=data1%2Fd1_write.c;h=37e15b850ffa66ed1a1aa79a84bdd706b71bda18;hp=1ccd8e3e143c2c68f3fd131c0f80c26b2331ef31;hb=00d6544408e2de88277e091fb7f8f4dfe3949558;hpb=02266b68e2e2c86d8a8467ee56721926b365d2d0 diff --git a/data1/d1_write.c b/data1/d1_write.c index 1ccd8e3..37e15b8 100644 --- a/data1/d1_write.c +++ b/data1/d1_write.c @@ -1,8 +1,5 @@ -/* $Id: d1_write.c,v 1.2 2002-10-22 13:19:50 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 - Index Data Aps - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + 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 @@ -15,16 +12,19 @@ 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 + */ /* converts data1 tree to XML record */ +#if HAVE_CONFIG_H +#include +#endif #include -#include +#include #include #define IDSGML_MARGIN 75 @@ -47,40 +47,6 @@ static void indent (WRBUF b, int col) wrbuf_putc (b, ' '); } -static void wrbuf_write_cdata(WRBUF b, const char *msg, int len) -{ - int i; - - for (i = 0; i < len; i++) - { - switch (msg[i]) - { - case '"': - wrbuf_puts (b, """); - break; - case '\'': - wrbuf_puts (b, "'"); - break; - case '>': - wrbuf_puts (b, ">"); - break; - case '<': - wrbuf_puts (b, "<"); - break; - case '&': - wrbuf_puts (b, "&"); - break; - default: - wrbuf_putc(b, msg[i]); - } - } -} - -static void wrbuf_put_cdata(WRBUF b, const char *msg) -{ - wrbuf_write_cdata (b, msg, strlen(msg)); -} - static void wrbuf_put_xattr(WRBUF b, data1_xattr *p) { for (; p; p = p->next) @@ -89,13 +55,13 @@ static void wrbuf_put_xattr(WRBUF b, data1_xattr *p) if (p->what == DATA1I_xmltext) wrbuf_puts (b, p->name); else - wrbuf_put_cdata (b, p->name); + wrbuf_xmlputs (b, p->name); if (p->value) { wrbuf_putc (b, '='); wrbuf_putc (b, '"'); if (p->what == DATA1I_text) - wrbuf_put_cdata (b, p->value); + wrbuf_xmlputs (b, p->value); else wrbuf_puts (b, p->value); wrbuf_putc (b, '"'); @@ -103,6 +69,31 @@ static void wrbuf_put_xattr(WRBUF b, data1_xattr *p) } } +static void wrbuf_write_tag(WRBUF b, const char *tag, int opening) +{ + int i, fixup = 0; + + /* see if we must fix the tag.. The grs.marc filter produces + a data1 tree with not well-formed XML */ + if (*tag >= '0' && *tag <= '9') + fixup = 1; + for (i = 0; tag[i]; i++) + if (strchr( " <>$,()[]", tag[i])) + fixup = 1; + if (fixup) + { + wrbuf_puts(b, "tag"); + if (opening) + { + wrbuf_puts(b, " value=\""); + wrbuf_xmlputs(b, tag); + wrbuf_puts(b, "\""); + } + } + else + wrbuf_puts(b, tag); +} + static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, int pretty_format) { @@ -114,12 +105,10 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, if (c->which == DATA1N_preprocess) { - data1_xattr *p; - if (pretty_format) indent (b, col); wrbuf_puts (b, "u.preprocess.target); + wrbuf_xmlputs (b, c->u.preprocess.target); wrbuf_put_xattr (b, c->u.preprocess.attributes); if (c->child) wrbuf_puts(b, " "); @@ -140,12 +129,10 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, } else { - data1_xattr *p; - if (pretty_format) indent (b, col); - wrbuf_puts (b, "<"); - wrbuf_put_cdata (b, tag); + wrbuf_puts(b, "<"); + wrbuf_write_tag(b, tag, 1); wrbuf_put_xattr (b, c->u.tag.attributes); wrbuf_puts(b, ">"); if (pretty_format) @@ -156,7 +143,7 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, if (pretty_format) indent (b, col); wrbuf_puts(b, ""); if (pretty_format) wrbuf_puts (b, "\n"); @@ -181,14 +168,14 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, case DATA1I_text: if (!pretty_format || c->u.data.formatted_text) { - wrbuf_write_cdata (b, p, l); + wrbuf_xmlputs_n (b, p, l); } else { while (l) { int wlen; - + while (l && d1_isspace(*p)) p++, l--; if (!l) @@ -220,12 +207,12 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, } break; case DATA1I_num: - wrbuf_write_cdata(b, c->u.data.data, c->u.data.len); + wrbuf_xmlputs_n(b, c->u.data.data, c->u.data.len); if (pretty_format) wrbuf_puts(b, "\n"); break; case DATA1I_oid: - wrbuf_write_cdata(b, c->u.data.data, c->u.data.len); + wrbuf_xmlputs_n(b, c->u.data.data, c->u.data.len); if (pretty_format) wrbuf_puts(b, "\n"); } @@ -243,13 +230,13 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, char *data1_nodetoidsgml (data1_handle dh, data1_node *n, int select, int *len) { WRBUF b = data1_get_wrbuf (dh); - + wrbuf_rewind(b); - + if (!data1_is_xmlmode (dh)) { wrbuf_puts (b, "<"); - wrbuf_puts (b, n->u.root.type); + wrbuf_write_tag(b, n->u.root.type, 1); wrbuf_puts (b, ">\n"); } if (nodetoidsgml(n, select, b, 0, 0 /* no pretty format */)) @@ -257,9 +244,18 @@ char *data1_nodetoidsgml (data1_handle dh, data1_node *n, int select, int *len) if (!data1_is_xmlmode (dh)) { wrbuf_puts (b, "u.root.type); + wrbuf_write_tag(b, n->u.root.type, 0); wrbuf_puts (b, ">\n"); } *len = wrbuf_len(b); return wrbuf_buf(b); } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +