* Sebastian Hammer, Adam Dickmeiss
*
* $Log: marcread.c,v $
- * Revision 1.1 1997-09-04 13:54:40 adam
+ * 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.<syntax> where syntax refers
* to abstract syntax. New method tellf in retrieve/extract method.
*
#include <marcdisp.h>
#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;
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;
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;
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;
data1_node *res_root;
data1_absyn *absyn;
char *absynName;
+ data1_marctab *marctab;
if ((*p->readf)(p->fh, buf, 5) != 5)
return NULL;
}
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 = data1_mk_node_wp (p->dh, p->mem, NULL);
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;
- 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);
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);
#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; j<indicator_length; j++)
fprintf (outf, "%c", buf[j+i]);
{
if (memcmp (tag, "00", 2) && identifier_length)
{
- data1_node *res = data1_mk_node_tag (p->mem, 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; j<identifier_length; j++)
#endif
i++;
}
- data1_mk_node_text (p->mem, res, buf + i0, i - i0);
+ data1_mk_node_text (p->dh, p->mem, res, buf + i0, i - i0);
i0 = i;
}
else
}
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");