X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=recctrl%2Fmarcread.c;h=4e82a01fb82c8076d5ff673a9deb5512901174af;hp=3f09254f304edcf844669a0631431ec49058afff;hb=ef696645cc3b7e0f4027008d1dc589c0f0f90c1f;hpb=1f793b6c2f61fd47c7a26c0274f0c7e6ab9d1a07 diff --git a/recctrl/marcread.c b/recctrl/marcread.c index 3f09254..4e82a01 100644 --- a/recctrl/marcread.c +++ b/recctrl/marcread.c @@ -1,10 +1,32 @@ /* - * 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.1 1997-09-04 13:54:40 adam + * 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. + * + * 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. * @@ -18,9 +40,9 @@ #include #include "grsread.h" -data1_node *data1_mk_node_wp (NMEM mem, data1_node *parent) +data1_node *data1_mk_node_wp (data1_handle dh, NMEM mem, data1_node *parent) { - data1_node *res = data1_mk_node (mem); + data1_node *res = data1_mk_node (dh, mem); if (!parent) res->root = res; @@ -32,7 +54,6 @@ data1_node *data1_mk_node_wp (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; @@ -44,16 +65,16 @@ static void destroy_data (struct data1_node *n) xfree (n->u.data.data); } -data1_node *data1_mk_node_text (NMEM mem, data1_node *parent, +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 (mem, parent); + 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->u.data.data = (char *) xmalloc (res->u.data.len); res->destroy = destroy_data; } else @@ -62,16 +83,16 @@ data1_node *data1_mk_node_text (NMEM mem, data1_node *parent, return res; } -data1_node *data1_mk_node_tag (NMEM mem, data1_node *parent, +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(parent); + data1_node *partag = get_parent_tag(dh, parent); data1_node *res; data1_element *e = NULL; int localtag = 0; - res = data1_mk_node_wp (mem, parent); + res = data1_mk_node_wp (dh, mem, parent); res->which = DATA1N_tag; res->u.tag.tag = res->lbuf; @@ -89,7 +110,7 @@ data1_node *data1_mk_node_tag (NMEM mem, data1_node *parent, if (!(e = partag->u.tag.element)) localtag = 1; - elem = data1_getelementbytagname (res->root->u.root.absyn, e, + 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; @@ -119,6 +140,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; @@ -144,22 +166,30 @@ data1_node *grs_read_marc (struct grs_read_info *p) } absynName = p->type; logf (LOG_DEBUG, "absynName = %s", absynName); - if (!(absyn = data1_get_absyn (absynName))) + if (!(absyn = data1_get_absyn (p->dh, absynName))) { logf (LOG_WARN, "Unknown abstract syntax: %s", absynName); return NULL; } - res_root = data1_mk_node_wp (p->mem, NULL); - res_root->u.root.type = nmem_malloc (p->mem, strlen(absynName)+1); + res_root = data1_mk_node_wp (p->dh, p->mem, NULL); + 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); @@ -182,7 +212,7 @@ data1_node *grs_read_marc (struct grs_read_info *p) tag[3] = '\0'; /* generate field node */ - res = data1_mk_node_tag (p->mem, res_root, tag, 3); + res = data1_mk_node_tag (p->dh, p->mem, res_root, tag, 3); #if MARC_DEBUG fprintf (outf, "%s ", tag); @@ -200,7 +230,8 @@ data1_node *grs_read_marc (struct grs_read_info *p) #if MARC_DEBUG int j; #endif - res = data1_mk_node_tag (p->mem, res, buf+i, indicator_length); + res = data1_mk_node_tag (p->dh, p->mem, res, buf+i, + indicator_length); #if MARC_DEBUG for (j = 0; jmem, parent, buf+i+1, - identifier_length-1); + data1_node *res = + data1_mk_node_tag (p->dh, p->mem, parent, + buf+i+1, identifier_length-1); #if MARC_DEBUG fprintf (outf, " $"); for (j = 1; jmem, res, buf + i0, i - i0); + data1_mk_node_text (p->dh, p->mem, res, buf + i0, i - i0); i0 = i; } else @@ -245,8 +277,9 @@ data1_node *grs_read_marc (struct grs_read_info *p) } if (i > i0) { - data1_node *res = data1_mk_node_tag (p->mem, parent, "@", 1); - data1_mk_node_text (p->mem, res, buf + i0, 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); } #if MARC_DEBUG fprintf (outf, "\n"); @@ -258,3 +291,21 @@ data1_node *grs_read_marc (struct grs_read_info *p) } return res_root; } + +static void *grs_init_marc() +{ + 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;