X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=data1%2Fd1_write.c;h=9ff319932d3c7697690dd6293692e957cf22b44d;hb=4f8a19742e1f4ddb422fa515ff9c3f1d37e5641f;hp=6f125558390bceaea751437097bb0ffd1cd9b8e5;hpb=cc67354cd95116f6580ebab21b67afa6523cb4bf;p=idzebra-moved-to-github.git diff --git a/data1/d1_write.c b/data1/d1_write.c index 6f12555..9ff3199 100644 --- a/data1/d1_write.c +++ b/data1/d1_write.c @@ -1,6 +1,6 @@ -/* $Id: d1_write.c,v 1.5 2004-10-20 10:36:40 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 - Index Data Aps +/* $Id: d1_write.c,v 1.8 2006-05-10 08:13:18 adam Exp $ + Copyright (C) 1995-2005 + Index Data ApS This file is part of the Zebra server. @@ -69,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) { @@ -106,8 +131,8 @@ static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col, { if (pretty_format) indent (b, col); - wrbuf_puts (b, "<"); - wrbuf_xmlputs (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) @@ -118,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"); @@ -211,7 +236,7 @@ char *data1_nodetoidsgml (data1_handle dh, data1_node *n, int select, int *len) 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 */)) @@ -219,9 +244,17 @@ 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 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +