X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Fmarcread.c;h=7e072aa85cc5c23af053ae984e5f229acf4257c3;hb=15ded665c8ca37e3c7a99ce48c2e78acdb727bd6;hp=44d93f552e86e0b61b7343eed4730c7f51166bc7;hpb=b9093505b17a074e79137ed64595c8269f77d330;p=idzebra-moved-to-github.git diff --git a/recctrl/marcread.c b/recctrl/marcread.c index 44d93f5..7e072aa 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,10 +1,40 @@ /* - * Copyright (C) 1997, Index Data I/S + * Copyright (C) 1997-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: marcread.c,v $ - * Revision 1.2 1997-09-17 12:19:21 adam + * Revision 1.12 2002-04-09 14:36:53 adam + * Fix XML attributes for MARC reader + * + * Revision 1.11 2000/05/15 15:32:51 adam + * Added support for 64 bit input file support. + * + * Revision 1.10 1999/11/30 13:48:04 adam + * Improved installation. Updated for inclusion of YAZ header files. + * + * Revision 1.9 1999/06/25 13:47:25 adam + * Minor change that prevents MSVC warning. + * + * Revision 1.8 1999/05/26 07:49:14 adam + * C++ compilation. + * + * Revision 1.7 1999/05/20 12:57:18 adam + * Implemented TCL filter. Updated recctrl system. + * + * 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. * @@ -17,9 +47,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include "grsread.h" data1_node *data1_mk_node_wp (data1_handle dh, NMEM mem, data1_node *parent) @@ -36,7 +66,6 @@ data1_node *data1_mk_node_wp (data1_handle dh, NMEM mem, data1_node *parent) parent->child = parent->last_child = res; else parent->last_child->next = res; - parent->num_children++; parent->last_child = res; } return res; @@ -57,7 +86,7 @@ data1_node *data1_mk_node_text (data1_handle dh, NMEM mem, data1_node *parent, 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->u.data.data = (char *) xmalloc (res->u.data.len); res->destroy = destroy_data; } else @@ -80,6 +109,9 @@ data1_node *data1_mk_node_tag (data1_handle dh, NMEM mem, data1_node *parent, res->which = DATA1N_tag; res->u.tag.tag = res->lbuf; res->u.tag.get_bytes = -1; +#if DATA1_USING_XATTR + res->u.tag.attributes = 0; +#endif if (len >= DATA1_LOCALDATA) len = DATA1_LOCALDATA-1; @@ -123,6 +155,7 @@ data1_node *grs_read_marc (struct grs_read_info *p) data1_node *res_root; data1_absyn *absyn; char *absynName; + data1_marctab *marctab; if ((*p->readf)(p->fh, buf, 5) != 5) return NULL; @@ -142,7 +175,8 @@ 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); } @@ -154,16 +188,24 @@ data1_node *grs_read_marc (struct grs_read_info *p) return NULL; } res_root = data1_mk_node_wp (p->dh, p->mem, NULL); - res_root->u.root.type = nmem_malloc (p->mem, strlen(absynName)+1); + res_root->which = DATA1N_root; + res_root->u.root.type = (char *) nmem_malloc (p->mem, strlen(absynName)+1); strcpy (res_root->u.root.type, absynName); res_root->u.root.absyn = absyn; - indicator_length = atoi_n (buf+10, 1); - identifier_length = atoi_n (buf+11, 1); + marctab = absyn->marc; + + if (marctab && marctab->force_indicator_length >= 0) + indicator_length = marctab->force_indicator_length; + else + indicator_length = atoi_n (buf+10, 1); + if (marctab && marctab->force_identifier_length >= 0) + identifier_length = marctab->force_identifier_length; + else + identifier_length = atoi_n (buf+11, 1); base_address = atoi_n (buf+12, 4); - length_data_entry = atoi_n (buf+20, 1); - length_data_entry = atoi_n (buf+20, 1); + length_data_entry = atoi_n (buf+20, 1); length_starting = atoi_n (buf+21, 1); length_implementation = atoi_n (buf+22, 1); @@ -265,3 +307,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;