/*
- * Copyright (C) 1994-1996, Index Data I/S
+ * Copyright (C) 1994-1997, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: recgrs.c,v $
- * Revision 1.1 1996-10-11 10:57:25 adam
+ * Revision 1.10 1997-09-18 08:59:21 adam
+ * Extra generic handle for the character mapping routines.
+ *
+ * Revision 1.9 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.8 1997/09/09 13:38:14 adam
+ * Partial port to WIN95/NT.
+ *
+ * Revision 1.7 1997/09/05 15:30:10 adam
+ * Changed prototype for chr_map_input - added const.
+ * Added support for C++, headers uses extern "C" for public definitions.
+ *
+ * Revision 1.6 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.
+ *
+ * Revision 1.5 1997/07/15 16:29:03 adam
+ * Initialized dummy variable to keep checker gcc happy.
+ *
+ * Revision 1.4 1997/04/30 08:56:08 quinn
+ * null
+ *
+ * Revision 1.2 1996/10/11 16:06:43 quinn
+ * Revision 1.3 1997/02/24 10:41:50 adam
+ * Cleanup of code and commented out the "end element-end-record" code.
+ *
+ * Revision 1.2 1996/10/11 16:06:43 quinn
+ * Fixed arguments to nodetogr
+ *
+ * Revision 1.1 1996/10/11 10:57:25 adam
* New module recctrl. Used to manage records (extract/retrieval).
*
* Revision 1.29 1996/10/08 10:30:21 quinn
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
+#ifndef WINDOWS
#include <unistd.h>
+#endif
#include <log.h>
#include <oid.h>
} tab[] = {
{ "sgml", grs_read_sgml },
{ "regx", grs_read_regx },
+ { "marc", grs_read_marc },
{ NULL, NULL }
};
const char *cp = strchr (type, '.');
static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p,
data1_att *att)
{
- char *b = n->u.data.data;
+ const char *b = n->u.data.data;
int remain;
- char **map = 0;
+ const char **map = 0;
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
while (map)
{
{
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
else
map = 0;
}
i = 0;
while (map && *map && **map != *CHR_SPACE)
{
- char *cp = *map;
+ const char *cp = *map;
while (i < GRS_MAX_WORD && *cp)
buf[i++] = *(cp++);
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
else
map = 0;
}
static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p,
data1_att *att)
{
- char *b = n->u.data.data;
- char buf[GRS_MAX_WORD+1], **map = 0;
+ const char *b = n->u.data.data;
+ char buf[GRS_MAX_WORD+1];
+ const char **map = 0;
RecWord wrd;
int i = 0, remain;
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
while (remain > 0 && i < GRS_MAX_WORD)
{
{
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
else
map = 0;
}
buf[i++] = *CHR_SPACE;
while (map && *map && **map != *CHR_SPACE)
{
- char *cp = *map;
+ const char *cp = *map;
if (i >= GRS_MAX_WORD)
break;
buf[i++] = *(cp++);
remain = n->u.data.len - (b - n->u.data.data);
if (remain > 0)
- map = (*p->map_chrs_input)(&b, remain);
+ map = (*p->map_chrs_input)(0, &b, remain);
else
map = 0;
}
if (n->which == DATA1N_data)
{
- data1_node *par = get_parent_tag(n);
+ data1_node *par = get_parent_tag(p->dh, n);
data1_termlist *tlist = 0;
if (p->flagShowRecords)
*/
while (!par->u.tag.element)
- if (!par->parent || !(par = get_parent_tag(par->parent)))
+ if (!par->parent || !(par = get_parent_tag(p->dh, par->parent)))
break;
if (!par)
tlist = 0;
gri.readf = p->readf;
gri.seekf = p->seekf;
+ gri.tellf = p->tellf;
gri.endf = p->endf;
gri.fh = p->fh;
gri.offset = p->offset;
gri.mem = mem;
+ gri.dh = p->dh;
n = read_grs_type (&gri, p->subType);
if (!n)
return -1;
if (dumpkeys(n, p, 0) < 0)
{
- data1_free_tree(n);
- return -1;
+ data1_free_tree(p->dh, n);
+ return -2;
}
- data1_free_tree(n);
+ data1_free_tree(p->dh, n);
nmem_destroy(mem);
return 0;
}
/*
* Return: -1: Nothing done. 0: Ok. >0: Bib-1 diagnostic.
*/
-static int process_comp(data1_node *n, Z_RecordComposition *c)
+static int process_comp(data1_handle dh, data1_node *n, Z_RecordComposition *c)
{
data1_esetname *eset;
Z_Espec1 *espec = 0;
case Z_RecordComp_simple:
if (c->u.simple->which != Z_ElementSetNames_generic)
return 26; /* only generic form supported. Fix this later */
- if (!(eset = data1_getesetbyname(n->u.root.absyn,
+ if (!(eset = data1_getesetbyname(dh, n->u.root.absyn,
c->u.simple->u.generic)))
{
logf(LOG_LOG, "Unknown esetname '%s'", c->u.simple->u.generic);
switch (p->which)
{
case Z_ElementSpec_elementSetName:
- if (!(eset = data1_getesetbyname(n->u.root.absyn,
- p->u.elementSetName)))
+ if (!(eset =
+ data1_getesetbyname(dh,
+ n->u.root.absyn,
+ p->u.elementSetName)))
{
logf(LOG_LOG, "Unknown esetname '%s'",
p->u.elementSetName);
return 26; /* fix */
}
if (espec)
- return data1_doespec1(n, espec);
+ return data1_doespec1(dh, n, espec);
else
return -1;
}
gri.readf = p->readf;
gri.seekf = p->seekf;
+ gri.tellf = p->tellf;
gri.endf = NULL;
gri.fh = p->fh;
gri.offset = 0;
gri.mem = mem;
+ gri.dh = p->dh;
node = read_grs_type (&gri, p->subType);
-/* node = data1_read_record(p->readf, p->fh, mem); */
if (!node)
{
p->diagnostic = 2;
return 0;
}
- if (p->score >= 0 && (new = data1_insert_taggeddata(node, node, "rank",
- mem)))
+ if (p->score >= 0 && (new =
+ data1_insert_taggeddata(p->dh, node,
+ node, "rank",
+ mem)))
{
new->u.data.what = DATA1I_num;
new->u.data.data = new->u.data.lbuf;
sprintf(new->u.data.data, "%d", p->score);
new->u.data.len = strlen(new->u.data.data);
}
- if ((new = data1_insert_taggeddata(node, node, "localControlNumber", mem)))
+ if ((new = data1_insert_taggeddata(p->dh, node, node,
+ "localControlNumber", mem)))
{
new->u.data.what = DATA1I_text;
new->u.data.data = new->u.data.lbuf;
if ((oid = oid_getoidbyent(&oe)))
{
char tmp[128];
+ data1_handle dh = p->dh;
char *p = tmp;
int *ii;
}
*(p++) = '\0';
- if ((new = data1_insert_taggeddata(node, node, "schemaIdentifier",
- mem)))
+ if ((new = data1_insert_taggeddata(dh, node, node,
+ "schemaIdentifier", mem)))
{
new->u.data.what = DATA1I_oid;
new->u.data.data = nmem_malloc(mem, p - tmp);
if (map->target_absyn_ref == p->input_format)
{
onode = node;
- if (!(node = data1_map_record(onode, map, mem)))
+ if (!(node = data1_map_record(p->dh, onode, map, mem)))
{
p->diagnostic = 14;
return 0;
break;
}
- if (p->comp && (res = process_comp(node, p->comp)) > 0)
+ if (p->comp && (res = process_comp(p->dh, node, p->comp)) > 0)
{
p->diagnostic = res;
if (onode)
- data1_free_tree(onode);
- data1_free_tree(node);
+ data1_free_tree(p->dh, onode);
+ data1_free_tree(p->dh, node);
nmem_destroy(mem);
return 0;
}
p->input_format : VAL_SUTRS))
{
data1_marctab *marctab;
+ int dummy;
case VAL_GRS1:
- if (!(p->rec_buf = data1_nodetogr(node, selected, p->odr)))
+ dummy = 0;
+ if (!(p->rec_buf = data1_nodetogr(p->dh, node, selected,
+ p->odr, &dummy)))
p->diagnostic = 2; /* this should be better specified */
else
p->rec_len = -1;
break;
case VAL_EXPLAIN:
- if (!(p->rec_buf = data1_nodetoexplain(node, selected, p->odr)))
+ if (!(p->rec_buf = data1_nodetoexplain(p->dh, node, selected,
+ p->odr)))
p->diagnostic = 2; /* this should be better specified */
else
p->rec_len = -1;
break;
case VAL_SUMMARY:
- if (!(p->rec_buf = data1_nodetosummary(node, selected, p->odr)))
+ if (!(p->rec_buf = data1_nodetosummary(p->dh, node, selected,
+ p->odr)))
p->diagnostic = 2;
else
p->rec_len = -1;
break;
case VAL_SUTRS:
- if (!(p->rec_buf = data1_nodetobuf(node, selected,
+ if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,
(int*)&p->rec_len)))
{
p->diagnostic = 2;
}
break;
case VAL_SOIF:
- if (!(p->rec_buf = data1_nodetosoif(node, selected,
- (int*)&p->rec_len)))
+ if (!(p->rec_buf = data1_nodetosoif(p->dh, node, selected,
+ (int*)&p->rec_len)))
{
p->diagnostic = 2;
break;
p->diagnostic = 227;
break;
}
- if (!(p->rec_buf = data1_nodetomarc(marctab, node, selected,
- (int*)&p->rec_len)))
+ if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node,
+ selected,
+ (int*)&p->rec_len)))
{
p->diagnostic = 2;
break;
}
}
if (node)
- data1_free_tree(node);
+ data1_free_tree(p->dh, node);
if (onode)
- data1_free_tree(onode);
+ data1_free_tree(p->dh, onode);
nmem_destroy(mem);
return 0;
}