X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fmarcread.c;h=49a27fcbbc4d293a7709aaec6b6e0b5d9e2791b6;hb=33ca955198b19dbf989edfeda20922628d183943;hp=49d724d28d4506079a953a50b00b528b5523df6f;hpb=3c5f6226f97612c0d6ac40591f600587c5ffa858;p=idzebra-moved-to-github.git diff --git a/recctrl/marcread.c b/recctrl/marcread.c index 49d724d..49a27fc 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,117 +1,34 @@ -/* - * Copyright (C) 1997-1999, Index Data - * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: marcread.c,v $ - * Revision 1.6 1999-02-02 14:51:27 adam - * Updated WIN32 code specific sections. Changed header. - * - * Revision 1.5 1997/11/18 10:03:24 adam - * Member num_children removed from data1_node. - * - * Revision 1.4 1997/10/27 14:34:26 adam - * Fixed bug - data1 root node wasn't tagged at all! - * - * Revision 1.3 1997/09/24 13:36:51 adam - * *** empty log message *** - * - * Revision 1.2 1997/09/17 12:19:21 adam - * Zebra version corresponds to YAZ version 1.4. - * Changed Zebra server so that it doesn't depend on global common_resource. - * - * Revision 1.1 1997/09/04 13:54:40 adam - * Added MARC filter - type grs.marc. where syntax refers - * to abstract syntax. New method tellf in retrieve/extract method. - * - */ -#include -#include -#include +/* $Id: marcread.c,v 1.17 2002-08-02 19:26:56 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 + Index Data Aps -#include -#include -#include -#include "grsread.h" +This file is part of the Zebra server. -data1_node *data1_mk_node_wp (data1_handle dh, NMEM mem, data1_node *parent) -{ - data1_node *res = data1_mk_node (dh, mem); - - if (!parent) - res->root = res; - else - { - res->root = parent->root; - res->parent = parent; - if (!parent->child) - parent->child = parent->last_child = res; - else - parent->last_child->next = res; - parent->last_child = res; - } - return res; -} +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. -static void destroy_data (struct data1_node *n) -{ - assert (n->which == DATA1N_data); - xfree (n->u.data.data); -} - -data1_node *data1_mk_node_text (data1_handle dh, NMEM mem, data1_node *parent, - const char *buf, size_t len) -{ - data1_node *res = data1_mk_node_wp (dh, mem, parent); - res->which = DATA1N_data; - res->u.data.formatted_text = 0; - res->u.data.what = DATA1I_text; - res->u.data.len = len; - if (res->u.data.len > DATA1_LOCALDATA) { - res->u.data.data = xmalloc (res->u.data.len); - res->destroy = destroy_data; - } - else - res->u.data.data = res->lbuf; - memcpy (res->u.data.data, buf, res->u.data.len); - return res; -} +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. -data1_node *data1_mk_node_tag (data1_handle dh, NMEM mem, data1_node *parent, - const char *tag, size_t len) -{ - data1_element *elem = NULL; - data1_node *partag = get_parent_tag(dh, parent); - data1_node *res; - data1_element *e = NULL; - int localtag = 0; - - res = data1_mk_node_wp (dh, mem, parent); +You should have received a copy of the GNU General Public License +along with Zebra; see the file LICENSE.zebra. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. +*/ - res->which = DATA1N_tag; - res->u.tag.tag = res->lbuf; - res->u.tag.get_bytes = -1; - if (len >= DATA1_LOCALDATA) - len = DATA1_LOCALDATA-1; +#include +#include +#include - memcpy (res->u.tag.tag, tag, len); - res->u.tag.tag[len] = '\0'; - - if (parent->which == DATA1N_variant) - return res; - if (partag) - if (!(e = partag->u.tag.element)) - localtag = 1; - - elem = data1_getelementbytagname (dh, res->root->u.root.absyn, e, - res->u.tag.tag); - res->u.tag.element = elem; - res->u.tag.node_selected = 0; - res->u.tag.make_variantlist = 0; - res->u.tag.no_data_requested = 0; - return res; -} +#include +#include +#include +#include "grsread.h" #define MARC_DEBUG 0 @@ -130,9 +47,7 @@ data1_node *grs_read_marc (struct grs_read_info *p) #if MARC_DEBUG FILE *outf = stdout; #endif - - data1_node *res_root; - data1_absyn *absyn; + data1_node *res_root, *res_top; char *absynName; data1_marctab *marctab; @@ -154,24 +69,21 @@ data1_node *grs_read_marc (struct grs_read_info *p) if (read_bytes == record_length - 4) { off_t cur_offset = (*p->tellf)(p->fh); - assert (cur_offset > 26); + if (cur_offset <= 27) + return NULL; if (p->endf) (*p->endf)(p->fh, cur_offset - 1); } absynName = p->type; - logf (LOG_DEBUG, "absynName = %s", absynName); - if (!(absyn = data1_get_absyn (p->dh, absynName))) + res_root = data1_mk_root (p->dh, p->mem, absynName); + if (!res_root) { - logf (LOG_WARN, "Unknown abstract syntax: %s", absynName); - return NULL; + yaz_log (LOG_WARN, "cannot read MARC without an abstract syntax"); + return 0; } - res_root = data1_mk_node_wp (p->dh, p->mem, NULL); - res_root->which = DATA1N_root; - res_root->u.root.type = nmem_malloc (p->mem, strlen(absynName)+1); - strcpy (res_root->u.root.type, absynName); - res_root->u.root.absyn = absyn; + res_top = data1_mk_tag (p->dh, p->mem, absynName, 0, res_root); - marctab = absyn->marc; + marctab = res_root->u.root.absyn->marc; if (marctab && marctab->force_indicator_length >= 0) indicator_length = marctab->force_indicator_length; @@ -183,7 +95,6 @@ data1_node *grs_read_marc (struct grs_read_info *p) identifier_length = atoi_n (buf+11, 1); base_address = atoi_n (buf+12, 4); - length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); @@ -199,14 +110,15 @@ data1_node *grs_read_marc (struct grs_read_info *p) int i, i0; char tag[4]; data1_node *res; - data1_node *parent = res_root; + data1_node *parent = res_top; memcpy (tag, buf+entry_p, 3); entry_p += 3; tag[3] = '\0'; + /* generate field node */ - res = data1_mk_node_tag (p->dh, p->mem, res_root, tag, 3); + res = data1_mk_tag_n (p->dh, p->mem, tag, 3, 0 /* attr */, parent); #if MARC_DEBUG fprintf (outf, "%s ", tag); @@ -224,8 +136,8 @@ data1_node *grs_read_marc (struct grs_read_info *p) #if MARC_DEBUG int j; #endif - res = data1_mk_node_tag (p->dh, p->mem, res, buf+i, - indicator_length); + res = data1_mk_tag_n (p->dh, p->mem, + buf+i, indicator_length, 0 /* attr */, res); #if MARC_DEBUG for (j = 0; jdh, p->mem, parent, - buf+i+1, identifier_length-1); + data1_mk_tag_n (p->dh, p->mem, + buf+i+1, identifier_length-1, + 0 /* attr */, parent); #if MARC_DEBUG fprintf (outf, " $"); for (j = 1; jdh, p->mem, res, buf + i0, i - i0); + data1_mk_text_n (p->dh, p->mem, buf + i0, i - i0, res); i0 = i; } else @@ -271,9 +184,7 @@ data1_node *grs_read_marc (struct grs_read_info *p) } if (i > i0) { - data1_node *res = data1_mk_node_tag (p->dh, p->mem, - parent, "@", 1); - data1_mk_node_text (p->dh, p->mem, res, buf + i0, i - i0); + data1_mk_text_n (p->dh, p->mem, buf + i0, i - i0, parent); } #if MARC_DEBUG fprintf (outf, "\n"); @@ -285,3 +196,21 @@ data1_node *grs_read_marc (struct grs_read_info *p) } return res_root; } + +static void *grs_init_marc(void) +{ + return 0; +} + +static void grs_destroy_marc(void *clientData) +{ +} + +static struct recTypeGrs marc_type = { + "marc", + grs_init_marc, + grs_destroy_marc, + grs_read_marc +}; + +RecTypeGrs recTypeGrs_marc = &marc_type;