From 074e63e27b02896c927606ce5bb324a55613dd31 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 29 Mar 2006 10:43:23 +0000 Subject: [PATCH] Fixup data1 tags which makes XML non-wellformed.. This effectively but not elegantly fixes records produced by the grs.marc filter. If a tag t is bad, it is changed to from to . --- data1/d1_handle.c | 15 +++++---------- data1/d1_write.c | 37 +++++++++++++++++++++++++++++++------ include/idzebra/data1.h | 4 +--- index/zebraapi.c | 4 ++-- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/data1/d1_handle.c b/data1/d1_handle.c index 723a081..2c5f853 100644 --- a/data1/d1_handle.c +++ b/data1/d1_handle.c @@ -1,4 +1,4 @@ -/* $Id: d1_handle.c,v 1.7 2005-01-15 19:38:18 adam Exp $ +/* $Id: d1_handle.c,v 1.8 2006-03-29 10:43:23 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -26,6 +26,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include +#define DATA1_FLAG_XML 1 + struct data1_handle_info { WRBUF wrbuf; char *tab_path; @@ -41,15 +43,9 @@ struct data1_handle_info { int map_len; NMEM mem; - int flags; }; -data1_handle data1_create (void) -{ - return data1_createx(0); -} - -data1_handle data1_createx (int flags) +data1_handle data1_create(void) { data1_handle p = (data1_handle)xmalloc (sizeof(*p)); if (!p) @@ -64,7 +60,6 @@ data1_handle data1_createx (int flags) p->absyn_cache = NULL; p->attset_cache = NULL; p->mem = nmem_create (); - p->flags = flags; return p; } @@ -162,5 +157,5 @@ FILE *data1_path_fopen (data1_handle dh, const char *file, const char *mode) int data1_is_xmlmode(data1_handle dh) { - return dh->flags & DATA1_FLAG_XML; + return 1; } diff --git a/data1/d1_write.c b/data1/d1_write.c index cecc25f..cdaf1b8 100644 --- a/data1/d1_write.c +++ b/data1/d1_write.c @@ -1,4 +1,4 @@ -/* $Id: d1_write.c,v 1.6 2005-01-15 19:38:18 adam Exp $ +/* $Id: d1_write.c,v 1.7 2006-03-29 10:43:23 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -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,7 +244,7 @@ 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); diff --git a/include/idzebra/data1.h b/include/idzebra/data1.h index a470854..dfdcd03 100644 --- a/include/idzebra/data1.h +++ b/include/idzebra/data1.h @@ -1,4 +1,4 @@ -/* $Id: data1.h,v 1.10 2005-06-23 06:45:46 adam Exp $ +/* $Id: data1.h,v 1.11 2006-03-29 10:43:24 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -367,8 +367,6 @@ typedef struct data1_node YAZ_EXPORT data1_handle data1_create (void); -#define DATA1_FLAG_XML 1 -YAZ_EXPORT data1_handle data1_createx (int flags); YAZ_EXPORT void data1_destroy(data1_handle dh); YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n); diff --git a/index/zebraapi.c b/index/zebraapi.c index e32e590..c91b5b2 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.207 2006-03-28 12:39:07 adam Exp $ +/* $Id: zebraapi.c,v 1.208 2006-03-29 10:43:24 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -297,7 +297,7 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, yaz_log (YLOG_DEBUG, "zebra_register_open rw=%d useshadow=%d p=%p n=%s rp=%s", rw, useshadow, reg, name, reg_path ? reg_path : "(none)"); - reg->dh = data1_createx (DATA1_FLAG_XML); + reg->dh = data1_create(); if (!reg->dh) { xfree(reg->name); -- 1.7.10.4