-/* $Id: danbibr.c,v 1.1 2004-05-21 11:58:56 adam Exp $
- Copyright (C) 2004
- Index Data Aps
+/* $Id: danbibr.c,v 1.9 2005-01-15 19:38:32 adam Exp $
+ Copyright (C) 1995-2005
+ Index Data ApS
This file is part of the Zebra server.
#include <yaz/log.h>
-#include "grsread.h"
+#include <idzebra/recgrs.h>
#include <yaz/xmalloc.h>
-#include <yaz/log.h>
-#include <data1.h>
#define READ_CHUNK 200
char read_buf[READ_CHUNK+1]; /* space for \0 */
};
-static void *grs_init_danbib(void)
+static void *init_danbib(Res res, RecType rt)
{
struct danbibr_info *p = (struct danbibr_info *) xmalloc (sizeof(*p));
static data1_node *mk_tree(struct grs_read_info *p, const char *rec_buf)
{
data1_node *root = data1_mk_root(p->dh, p->mem, "danbib");
+ data1_node *root_tag = data1_mk_tag(p->dh, p->mem, "danbib", 0, root);
const char *cp = rec_buf;
if (1) /* <text> all </text> */
{
- data1_node *text_node = data1_mk_tag(p->dh, p->mem, "text", 0, root);
+ data1_node *text_node = data1_mk_tag(p->dh, p->mem, "text", 0, root_tag);
data1_mk_text_n(p->dh, p->mem, rec_buf, strlen(rec_buf), text_node);
}
while (*cp)
cp++;
continue;
}
- if (*cp == ' ') /* continuation */
+ else if (*cp == ' ') /* bad continuation */
{
while (*cp && *cp != '\n')
cp++;
data1_node *hnode;
sprintf(elemstr, "head%d", no);
- hnode = data1_mk_tag(p->dh, p->mem, elemstr, 0, root);
+ hnode = data1_mk_tag(p->dh, p->mem, elemstr, 0, root_tag);
data1_mk_text_n(p->dh, p->mem, start_text,
cp - start_text, hnode);
start_text = cp+1;
{
data1_node *tag_node =
data1_mk_tag_n(p->dh, p->mem,
- start_tag, cp - start_tag, 0, root);
+ start_tag, cp - start_tag, 0, root_tag);
cp++;
start_text = cp;
while (*cp != '\n' && *cp)
data1_mk_tag_n(p->dh, p->mem, cp, 1, 0, tag_node);
cp++;
start_text = cp;
- while (*cp && *cp != '\n'&& *cp != '*')
- cp++;
+ while (*cp)
+ {
+ if (*cp == '\n' && cp[1] == ' ')
+ {
+ cp++;
+ if (start_text != cp)
+ data1_mk_text_n(p->dh, p->mem, start_text,
+ cp-start_text, sub_tag_node);
+ while (*cp == ' ')
+ cp++;
+ start_text = cp;
+ }
+ else if (*cp == '\n')
+ break;
+ else if (*cp == '*')
+ break;
+ else
+ cp++;
+ }
if (start_text != cp)
data1_mk_text_n(p->dh, p->mem, start_text,
cp-start_text, sub_tag_node);
return root;
}
-static data1_node *grs_read_danbib (struct grs_read_info *p)
+static data1_node *read_danbib (struct grs_read_info *p)
{
struct danbibr_info *info = p->clientData;
return 0;
}
-static void grs_destroy_danbib(void *clientData)
+static void destroy_danbib(void *clientData)
{
struct danbibr_info *p = (struct danbibr_info *) clientData;
xfree (p);
}
-static struct recTypeGrs danbib_type = {
- "danbib",
- grs_init_danbib,
- grs_destroy_danbib,
- grs_read_danbib
+
+static int extract_danbib(void *clientData, struct recExtractCtrl *ctrl)
+{
+ return zebra_grs_extract(clientData, ctrl, read_danbib);
+}
+
+static int retrieve_danbib(void *clientData, struct recRetrieveCtrl *ctrl)
+{
+ return zebra_grs_retrieve(clientData, ctrl, read_danbib);
+}
+
+static struct recType danbib_type = {
+ "grs.danbib",
+ init_danbib,
+ 0,
+ destroy_danbib,
+ extract_danbib,
+ retrieve_danbib,
+};
+
+RecType
+#ifdef IDZEBRA_STATIC_GRS_DANBIB
+idzebra_filter_grs_danbib
+#else
+idzebra_filter
+#endif
+
+[] = {
+ &danbib_type,
+ 0,
};
+
-RecTypeGrs recTypeGrs_danbib = &danbib_type;