X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fsgmlread.c;h=1bcce37dd3e2a64a76737a55e6c71899f0b7365f;hb=d9a9544ebf605f5141ced91c4cf2c2fc97b93539;hp=3f0566d86604a0ef24649e38263c56e632a4efcc;hpb=9b426aeb9256cef844693c13f38aba4b10f7056d;p=idzebra-moved-to-github.git diff --git a/recctrl/sgmlread.c b/recctrl/sgmlread.c index 3f0566d..1bcce37 100644 --- a/recctrl/sgmlread.c +++ b/recctrl/sgmlread.c @@ -1,23 +1,125 @@ /* - * Copyright (C) 1994-1996, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: sgmlread.c,v $ - * Revision 1.2 1997-04-30 08:56:08 quinn + * Revision 1.10 1999-11-30 13:48:04 adam + * Improved installation. Updated for inclusion of YAZ header files. + * + * Revision 1.9 1999/07/14 10:56:16 adam + * Filter handles multiple records in one file. + * + * Revision 1.8 1999/06/25 13:47:25 adam + * Minor change that prevents MSVC warning. + * + * Revision 1.7 1999/05/21 12:00:17 adam + * Better diagnostics for extraction process. + * + * Revision 1.6 1999/05/20 12:57:18 adam + * Implemented TCL filter. Updated recctrl system. + * + * Revision 1.5 1999/02/02 14:51:31 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.4 1997/09/17 12:19:22 adam + * Zebra version corresponds to YAZ version 1.4. + * Changed Zebra server so that it doesn't depend on global common_resource. + * + * Revision 1.3 1997/09/04 13:54:41 adam + * Added MARC filter - type grs.marc. where syntax refers + * to abstract syntax. New method tellf in retrieve/extract method. + * + * Revision 1.2 1997/04/30 08:56:08 quinn * null * * Revision 1.1 1996/10/11 10:57:32 adam * New module recctrl. Used to manage records (extract/retrieval). * */ -#include #include -#include +#include #include "grsread.h" -data1_node *grs_read_sgml (struct grs_read_info *p) +struct sgml_getc_info { + char *buf; + int buf_size; + int size; + int off; + int moffset; + void *fh; + int (*readf)(void *, char *, size_t); + WRBUF wrbuf; +}; + +int sgml_getc (void *clientData) +{ + struct sgml_getc_info *p = (struct sgml_getc_info *) clientData; + int res; + + if (p->off < p->size) + return p->buf[(p->off)++]; + if (p->size < p->buf_size) + return 0; + p->moffset += p->off; + p->off = 0; + p->size = 0; + res = (*p->readf)(p->fh, p->buf, p->buf_size); + if (res > 0) + { + p->size += res; + return p->buf[(p->off)++]; + } + return 0; +} + +static data1_node *grs_read_sgml (struct grs_read_info *p) +{ + struct sgml_getc_info *sgi = (struct sgml_getc_info *) p->clientData; + data1_node *node; + int res; + + sgi->moffset = p->offset; + sgi->fh = p->fh; + sgi->readf = p->readf; + sgi->off = 0; + sgi->size = 0; + res = (*sgi->readf)(sgi->fh, sgi->buf, sgi->buf_size); + if (res > 0) + sgi->size += res; + else + return 0; + node = data1_read_nodex (p->dh, p->mem, sgml_getc, sgi, sgi->wrbuf); + if (node && p->endf) + (*p->endf)(sgi->fh, sgi->moffset + sgi->off); + return node; +} + +static void *grs_init_sgml(void) { - return data1_read_record (p->readf, p->fh, p->mem); + struct sgml_getc_info *p = (struct sgml_getc_info *) xmalloc (sizeof(*p)); + p->buf_size = 512; + p->buf = xmalloc (p->buf_size); + p->wrbuf = wrbuf_alloc(); + return p; } + +static void grs_destroy_sgml(void *clientData) +{ + struct sgml_getc_info *p = (struct sgml_getc_info *) clientData; + + wrbuf_free(p->wrbuf, 1); + xfree (p->buf); + xfree (p); +} + +static struct recTypeGrs sgml_type = { + "sgml", + grs_init_sgml, + grs_destroy_sgml, + grs_read_sgml +}; + +RecTypeGrs recTypeGrs_sgml = &sgml_type; +