-# $Id: Makefile,v 1.6 1996-05-22 08:35:55 adam Exp $
+# $Id: Makefile,v 1.7 1996-06-10 08:56:00 quinn Exp $
SHELL=/bin/sh
RANLIB=ranlib
LIB=../lib/libret.a
PO = d1_read.o d1_attset.o d1_tagset.o d1_absyn.o d1_grs.o \
d1_sutrs.o d1_varset.o d1_espec.o \
- d1_doespec.o d1_map.o d1_marc.o d1_write.o d1_expout.o
+ d1_doespec.o d1_map.o d1_marc.o d1_write.o d1_expout.o d1_sumout.o
CPP=$(CC) -E
all: $(LIB)
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: d1_absyn.c,v $
- * Revision 1.6 1996-05-31 13:52:21 quinn
+ * Revision 1.7 1996-06-10 08:56:01 quinn
+ * Work on Summary.
+ *
+ * Revision 1.6 1996/05/31 13:52:21 quinn
* Fixed uninitialized variable for local tags in abstract syntax.
*
* Revision 1.5 1996/05/09 07:27:43 quinn
char line[512], *r, cmd[512], args[512];
data1_absyn *res = 0;
FILE *f;
- data1_element **ppl[D1_MAX_NESTING];
+ data1_element **ppl[D1_MAX_NESTING], *cur[D1_MAX_NESTING];
data1_esetname **esetpp;
data1_maptab **maptabp;
data1_marctab **marcp;
marcp = &res->marc;
res->elements = 0;
ppl[0] = &res->elements;
+ cur[0] = 0;
esetpp = &res->esetnames;
for (;;)
}
if (i > level + 1)
{
- logf(LOG_WARN, "Bad level inc in %s in '%'", file, args);
+ logf(LOG_WARN, "Bad level inc in %s in '%s'", file, args);
fclose(f);
return 0;
}
level = i;
- if (!(new = *ppl[level] = xmalloc(sizeof(*new))))
+ if (!(new = cur[level] = *ppl[level] = xmalloc(sizeof(*new))))
abort;
new->next = new->children = 0;
new->tag = 0;
new->termlists = 0;
+ new->parent = level ? cur[level - 1] : 0;
tp = &new->termlists;
ppl[level] = &new->next;
ppl[level+1] = &new->children;
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: d1_map.c,v $
- * Revision 1.8 1996-05-01 12:45:31 quinn
+ * Revision 1.9 1996-06-10 08:56:02 quinn
+ * Work on Summary.
+ *
+ * Revision 1.8 1996/05/01 12:45:31 quinn
* Support use of local tag names in abs file.
*
* Revision 1.7 1995/12/13 13:44:31 quinn
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include <oid.h>
#include <xmalloc.h>
#include <tpath.h>
#include <data1.h>
-#include "d1_map.h"
+#include <d1_map.h>
data1_maptab *data1_read_maptab(char *file)
{
int argc;
char *argv[50], line[512];
data1_mapunit **mapp;
+ int local_numeric = 0;
if (!(f = yaz_path_fopen(data1_tabpath, file, "r")))
{
res->target_absyn_name = xmalloc(strlen(argv[1])+1);
strcpy(res->target_absyn_name, argv[1]);
}
+ else if (!yaz_matchstr(argv[0], "localnumeric"))
+ local_numeric = 1;
else if (!strcmp(argv[0], "name"))
{
if (argc != 2)
(*mtp)->new_field = 1;
else
(*mtp)->new_field = 0;
-#if 0
- if ((numval = atoi(valstr)))
- {
+ if ((type != 3 || local_numeric) && isdigit(*valstr))
+ {
(*mtp)->which = D1_MAPTAG_numeric;
- (*mtp)->value.numeric = numval;
+ (*mtp)->value.numeric = atoi(valstr);
}
else
{
-#endif
(*mtp)->which = D1_MAPTAG_string;
(*mtp)->value.string = xmalloc(strlen(valstr)+1);
strcpy((*mtp)->value.string, valstr);
-#if 0
}
-#endif
mtp = &(*mtp)->next;
}
mapp = &(*mapp)->next;
return res;
}
-#if 1
-
/*
- * Locate node with givel elementname.
+ * Locate node with given elementname.
* NOTE: This is stupid - we don't find repeats this way.
*/
static data1_node *find_node(data1_node *p, char *elementname)
return 0;
}
-
-#else
-
-/*
- * See if the node n is equivalent to the tag t.
- */
-static int tagmatch(data1_node *n, data1_maptag *t)
-{
- if (n->which != DATA1N_tag)
- return 0;
- if (n->u.tag.element)
- {
- if (n->u.tag.element->tag->tagset->type != t->type)
- return 0;
- if (n->u.tag.element->tag->which == DATA1T_numeric)
- {
- if (t->which != D1_MAPTAG_numeric)
- return 0;
- if (n->u.tag.element->tag->value.numeric != t->value.numeric)
- return 0;
- }
- else
- {
- if (t->which != D1_MAPTAG_string)
- return 0;
- if (data1_matchstr(n->u.tag.element->tag->value.string,
- t->value.string))
- return 0;
- }
- }
- else /* local tag */
- {
- char str[10];
-
- if (t->type != 3)
- return 0;
- if (t->which == D1_MAPTAG_numeric)
- sprintf(str, "%d", t->value.numeric);
- else
- strcpy(str, t->value.string);
- if (data1_matchstr(n->u.tag.tag, str))
- return 0;
- }
- return 1;
-}
-
-static int map_elements(data1_node *res, data1_node *n, data1_mapunit *m)
-{
- data1_node *c;
-
- for (c = n->child; c; c = c->next)
- {
- if (c->which == DATA1N_tag)
- {
- if (c->u.tag.element && !data1_matchstr(c->u.tag.element->name,
- m->source_element_name))
- {
- /* Process target path specification */
- data1_maptag *mt;
- data1_node *pn = res, *cur = pn->last_child;
-
- for (mt = m->target_path; mt; mt = mt->next)
- {
- if (!cur || !tagmatch(cur, mt))
- {
- cur = data1_mk_node();
- cur->which = DATA1N_tag;
- cur->u.tag.element = 0;
- cur->u.tag.tag = mt->value.string;
- cur->u.tag.node_selected = 0;
- cur->parent = pn;
- cur->root = pn->root;
- if (!pn->child)
- pn->child = cur;
- if (pn->last_child)
- pn->last_child->next = cur;
- pn->last_child = cur;
- pn->num_children++;
- }
- if (mt->next)
- pn = cur;
- else if (!m->no_data)
- {
- cur->child = c->child;
- cur->num_children = c->num_children;
- c->child = 0;
- c->num_children = 0;
- }
- }
- }
- else if (map_elements(res, c, m) < 0)
- return -1;
- }
- }
- return 0;
-}
-
-static int map_record(data1_node *res, data1_node *n, data1_maptab *map)
-{
- data1_mapunit *m;
-
- for (m = map->map; m; m = m->next)
- if (map_elements(res, n, m) < 0)
- return -1;
- return 0;
-}
-
-#endif
-
/*
* Create a (possibly lossy) copy of the given record based on the
* table. The new copy will refer back to the data of the original record,
--- /dev/null
+/*
+ * Copyright (c) 1995, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: d1_sumout.c,v $
+ * Revision 1.1 1996-06-10 08:56:03 quinn
+ * Work on Summary.
+ *
+ *
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <log.h>
+#include <proto.h>
+#include <data1.h>
+
+static int *f_integer(data1_node *c, ODR o)
+{
+ int *r;
+ char intbuf[64];
+
+ if (!c->child || c->child->which != DATA1N_data ||
+ c->child->u.data.len > 63)
+ return 0;
+ r = odr_malloc(o, sizeof(*r));
+ sprintf(intbuf, "%.*s", 63, c->child->u.data.data);
+ *r = atoi(intbuf);
+ return r;
+}
+
+static char *f_string(data1_node *c, ODR o)
+{
+ char *r;
+
+ if (!c->child || c->child->which != DATA1N_data)
+ return 0;
+ r = odr_malloc(o, c->child->u.data.len+1);
+ memcpy(r, c->child->u.data.data, c->child->u.data.len);
+ r[c->child->u.data.len] = '\0';
+ return r;
+}
+
+Z_BriefBib *data1_nodetosummary(data1_node *n, int select, ODR o)
+{
+ Z_BriefBib *res = odr_malloc(o, sizeof(*res));
+ data1_node *c;
+
+ assert(n->which == DATA1N_root);
+ if (strcmp(n->u.root.type, "summary"))
+ {
+ logf(LOG_WARN, "Attempt to convert a non-summary record");
+ return 0;
+ }
+
+ res->title = "[UNKNOWN]";
+ res->author = 0;
+ res->callNumber = 0;
+ res->recordType = 0;
+ res->bibliographicLevel = 0;
+ res->num_format = 0;
+ res->format = 0;
+ res->publicationPlace = 0;
+ res->publicationDate = 0;
+ res->targetSystemKey = 0;
+ res->satisfyingElement = 0;
+ res->rank = 0;
+ res->documentId = 0;
+ res->abstract = 0;
+ res->otherInfo = 0;
+
+ for (c = n->child; c; c = c->next)
+ {
+ if (c->which != DATA1N_tag || !c->u.tag.element)
+ {
+ logf(LOG_WARN, "Malformed element in Summary record");
+ return 0;
+ }
+ if (select && !c->u.tag.node_selected)
+ continue;
+ switch (c->u.tag.element->tag->value.numeric)
+ {
+ case 0: res->title = f_string(c, o); break;
+ case 1: res->author = f_string(c, o); break;
+ case 2: res->callNumber = f_string(c, o); break;
+ case 3: res->recordType = f_string(c, o); break;
+ case 4: res->bibliographicLevel = f_string(c, o); break;
+ case 5: abort(); /* TODO */
+ case 10: res->publicationPlace = f_string(c, o); break;
+ case 11: res->publicationDate = f_string(c, o); break;
+ case 12: res->targetSystemKey = f_string(c, o); break;
+ case 13: res->satisfyingElement = f_string(c, o); break;
+ case 14: res->rank = f_integer(c, o); break;
+ case 15: res->documentId = f_string(c, o); break;
+ case 16: res->abstract = f_string(c, o); break;
+ case 17: abort(); /* TODO */
+ default:
+ logf(LOG_WARN, "Unknown element in Summary record.");
+ }
+ }
+ return res;
+}
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.60 1996-05-30 11:03:10 quinn
+ * Revision 1.61 1996-06-10 08:56:16 quinn
+ * Work on Summary.
+ *
+ * Revision 1.60 1996/05/30 11:03:10 quinn
* Fixed NextresultSetPosition bug fixed.
*
* Revision 1.59 1996/05/14 09:26:46 quinn
case VAL_GRS1: thisext->which = Z_External_grs1; break;
case VAL_EXPLAIN: thisext->which = Z_External_explainRecord;
break;
+ case VAL_SUMMARY: thisext->which = Z_External_summary; break;
+ case VAL_OPAC: thisext->which = Z_External_OPAC; break;
default:
logf(LOG_FATAL, "Unknown structured format from backend.");
varset var1.var
maptab gils-usmarc.map
+maptab gils-summary.map
# Element set names