X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=retrieval%2Fd1_sumout.c;fp=retrieval%2Fd1_sumout.c;h=fbe5e64f0d3794fff6c6cf6dc9171b926d9f71d6;hb=09127934b3646ba7d5bc0a853b693792d64d3bac;hp=0000000000000000000000000000000000000000;hpb=7b975f32e5bb0ae39b62167f9eb09b02be36d3f6;p=yaz-moved-to-github.git diff --git a/retrieval/d1_sumout.c b/retrieval/d1_sumout.c new file mode 100644 index 0000000..fbe5e64 --- /dev/null +++ b/retrieval/d1_sumout.c @@ -0,0 +1,105 @@ +/* + * 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 +#include +#include + +#include +#include +#include + +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; +}