X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fmarcread.c;h=96c9eead06b79c0f09512ece39ec7daebfc3e687;hb=a9eae0225b1a51b0257f80d9da9f95475dd04f53;hp=323e96f784abcc43b3f6df08059adff112619270;hpb=3985f957cc12ed8006b9b6aa024367c8596388d8;p=idzebra-moved-to-github.git diff --git a/recctrl/marcread.c b/recctrl/marcread.c index 323e96f..96c9eea 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,4 +1,4 @@ -/* $Id: marcread.c,v 1.24 2004-06-16 22:12:30 adam Exp $ +/* $Id: marcread.c,v 1.26 2004-09-28 10:15:03 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -27,15 +27,20 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include "grsread.h" +#include #include "marcomp.h" #include "inline.h" #define MARC_DEBUG 0 #define MARCOMP_DEBUG 0 +struct marc_info { + char type[256]; +}; + static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) { + struct marc_info *mi = (struct marc_info*) p->clientData; char buf[100000]; int entry_p; int record_length; @@ -76,7 +81,7 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) if (p->endf) (*p->endf)(p->fh, cur_offset - 1); } - absynName = p->type; + absynName = mi->type; res_root = data1_mk_root (p->dh, p->mem, absynName); if (!res_root) { @@ -96,7 +101,7 @@ static data1_node *grs_read_iso2709 (struct grs_read_info *p, int marc_xml) else res_top = data1_mk_tag (p->dh, p->mem, absynName, 0, res_root); - if ((marctab = res_root->u.root.absyn->marc)) + if ((marctab = data1_absyn_getmarctab(p->dh, res_root->u.root.absyn))) { memcpy(marctab->leader, buf, 24); memcpy(marctab->implementation_codes, buf+6, 4); @@ -657,7 +662,7 @@ static int is_empty(char *s) static void parse_data1_tree(struct grs_read_info *p, const char *mc_stmnt, data1_node *root) { - data1_marctab *marctab = root->u.root.absyn->marc; + data1_marctab *marctab = data1_absyn_getmarctab(p->dh, root->u.root.absyn); data1_node *top = root->child; data1_node *field; mc_context *c; @@ -738,7 +743,7 @@ data1_node *grs_read_marcxml(struct grs_read_info *p) if (!root) return 0; - for (e=root->u.root.absyn->main_elements; e; e=e->next) + for (e = data1_absyn_getelements(p->dh, root->u.root.absyn); e; e=e->next) { data1_tag *tag = e->tag; @@ -757,7 +762,7 @@ data1_node *grs_read_marc(struct grs_read_info *p) if (!root) return 0; - for (e=root->u.root.absyn->main_elements; e; e=e->next) + for (e = data1_absyn_getelements(p->dh, root->u.root.absyn); e; e=e->next) { data1_tag *tag = e->tag; @@ -768,29 +773,75 @@ data1_node *grs_read_marc(struct grs_read_info *p) return root; } -static void *grs_init_marc(void) +static void *init_marc(Res res, RecType rt) { - return 0; + struct marc_info *p = xmalloc(sizeof(*p)); + strcpy(p->type, ""); + return p; +} + +static void config_marc(void *clientData, Res res, const char *args) +{ + struct marc_info *p = (struct marc_info*) clientData; + if (strlen(args) < sizeof(p->type)) + strcpy(p->type, args); +} + +static void destroy_marc(void *clientData) +{ + struct marc_info *p = (struct marc_info*) clientData; + xfree (p); +} + + +static int extract_marc(void *clientData, struct recExtractCtrl *ctrl) +{ + return zebra_grs_extract(clientData, ctrl, grs_read_marc); } -static void grs_destroy_marc(void *clientData) +static int retrieve_marc(void *clientData, struct recRetrieveCtrl *ctrl) { + return zebra_grs_retrieve(clientData, ctrl, grs_read_marc); } -static struct recTypeGrs marc_type = { - "marc", - grs_init_marc, - grs_destroy_marc, - grs_read_marc +static struct recType marc_type = { + "grs.marc", + init_marc, + config_marc, + destroy_marc, + extract_marc, + retrieve_marc, }; -RecTypeGrs recTypeGrs_marc = &marc_type; +static int extract_marcxml(void *clientData, struct recExtractCtrl *ctrl) +{ + return zebra_grs_extract(clientData, ctrl, grs_read_marcxml); +} -static struct recTypeGrs marcxml_type = { - "marcxml", - grs_init_marc, - grs_destroy_marc, - grs_read_marcxml +static int retrieve_marcxml(void *clientData, struct recRetrieveCtrl *ctrl) +{ + return zebra_grs_retrieve(clientData, ctrl, grs_read_marcxml); +} + +static struct recType marcxml_type = { + "grs.marcxml", + init_marc, + config_marc, + destroy_marc, + extract_marcxml, + retrieve_marcxml, }; -RecTypeGrs recTypeGrs_marcxml = &marcxml_type; +RecType +#ifdef IDZEBRA_STATIC_GRS_MARC +idzebra_filter_grs_marc +#else +idzebra_filter +#endif + +[] = { + &marc_type, + &marcxml_type, + 0, +}; +