X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=ztest%2Fread-grs.c;h=1726ef6abc83249af2885dd8f8edee20716098f3;hp=3312ff4d6764e6134dd2018d2e172bdee4edf4ee;hb=dc86a5103817732735d2591d3775114a86de94ae;hpb=b440dce0831a72bebe4f4821ab7771cc05e8facb diff --git a/ztest/read-grs.c b/ztest/read-grs.c index 3312ff4..1726ef6 100644 --- a/ztest/read-grs.c +++ b/ztest/read-grs.c @@ -1,44 +1,25 @@ -/* - * Copyright (c) 1995-1999, Index Data. +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: read-grs.c,v $ - * Revision 1.4 1999-08-27 09:40:32 adam - * Renamed logf function to yaz_log. Removed VC++ project files. - * - * Revision 1.3 1999/03/31 11:18:25 adam - * Implemented odr_strdup. Added Reference ID to backend server API. - * - * Revision 1.2 1998/02/11 11:53:36 adam - * Changed code so that it compiles as C++. - * - * Revision 1.1 1997/09/01 08:55:53 adam - * New windows NT/95 port using MSV5.0. Test server ztest now in - * separate directory. When using NT, this test server may operate - * as an NT service. Note that the service.[ch] should be part of - * generic, but it isn't yet. - * - * Revision 1.1 1995/08/17 12:45:23 quinn - * Fixed minor problems with GRS-1. Added support in c&s. - * - * */ - -/* - * Little toy-thing to read a GRS-1 record from a file. +/** \file + * \brief Little toy-thing to read GRS-1 records from a file. */ +#if HAVE_CONFIG_H +#include +#endif #include -#include #include -#include -#include +#include +#include + +#include "ztest.h" #define GRS_MAX_FIELDS 50 -Z_GenericRecord *read_grs1(FILE *f, ODR o) +static Z_GenericRecord *read_grs1(FILE *f, ODR o) { char line[512], *buf; int type, ivalue; @@ -47,73 +28,100 @@ Z_GenericRecord *read_grs1(FILE *f, ODR o) for (;;) { - Z_TaggedElement *t; - Z_ElementData *c; + Z_TaggedElement *t; + Z_ElementData *c; - while (fgets(buf = line, 512, f)) - { - while (*buf && isspace(*buf)) - buf++; - if (!*buf || *buf == '#') - continue; - break; - } - if (*buf == '}') - return r; - if (sscanf(buf, "(%d,%[^)])", &type, value) != 2) - { - yaz_log(LOG_WARN, "Bad data in '%s'", buf); - return 0; - } - if (!type && *value == '0') - return r; - if (!(buf = strchr(buf, ')'))) - return 0; - buf++; - while (*buf && isspace(*buf)) - buf++; - if (!*buf) - return 0; - if (!r) - { - r = (Z_GenericRecord *)odr_malloc(o, sizeof(*r)); - r->elements = (Z_TaggedElement **) + while (fgets(buf = line, 512, f)) + { + while (*buf && yaz_isspace(*buf)) + buf++; + if (!*buf || *buf == '#') + continue; + break; + } + if (*buf == '}') + return r; + if (sscanf(buf, "(%d,%[^)])", &type, value) != 2) + { + yaz_log(YLOG_WARN, "Bad data in '%s'", buf); + return 0; + } + if (!type && *value == '0') + return r; + if (!(buf = strchr(buf, ')'))) + return 0; + buf++; + while (*buf && yaz_isspace(*buf)) + buf++; + if (!*buf) + return 0; + if (!r) + { + r = (Z_GenericRecord *)odr_malloc(o, sizeof(*r)); + r->elements = (Z_TaggedElement **) odr_malloc(o, sizeof(Z_TaggedElement*) * GRS_MAX_FIELDS); - r->num_elements = 0; - } - r->elements[r->num_elements] = t = (Z_TaggedElement *) + r->num_elements = 0; + } + r->elements[r->num_elements] = t = (Z_TaggedElement *) odr_malloc(o, sizeof(Z_TaggedElement)); - t->tagType = (int *)odr_malloc(o, sizeof(int)); - *t->tagType = type; - t->tagValue = (Z_StringOrNumeric *) + t->tagType = odr_intdup(o, type); + t->tagValue = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric)); - if ((ivalue = atoi(value))) - { - t->tagValue->which = Z_StringOrNumeric_numeric; - t->tagValue->u.numeric = (int *)odr_malloc(o, sizeof(int)); - *t->tagValue->u.numeric = ivalue; - } - else - { - t->tagValue->which = Z_StringOrNumeric_string; - t->tagValue->u.string = (char *)odr_malloc(o, strlen(value)+1); - strcpy(t->tagValue->u.string, value); - } - t->tagOccurrence = 0; - t->metaData = 0; - t->appliedVariant = 0; - t->content = c = (Z_ElementData *)odr_malloc(o, sizeof(Z_ElementData)); - if (*buf == '{') - { - c->which = Z_ElementData_subtree; - c->u.subtree = read_grs1(f, o); - } - else - { - c->which = Z_ElementData_string; - buf[strlen(buf)-1] = '\0'; - c->u.string = odr_strdup(o, buf); - } - r->num_elements++; + if ((ivalue = atoi(value))) + { + t->tagValue->which = Z_StringOrNumeric_numeric; + t->tagValue->u.numeric = odr_intdup(o, ivalue); + } + else + { + t->tagValue->which = Z_StringOrNumeric_string; + t->tagValue->u.string = (char *)odr_malloc(o, strlen(value)+1); + strcpy(t->tagValue->u.string, value); + } + t->tagOccurrence = 0; + t->metaData = 0; + t->appliedVariant = 0; + t->content = c = (Z_ElementData *)odr_malloc(o, sizeof(Z_ElementData)); + if (*buf == '{') + { + c->which = Z_ElementData_subtree; + c->u.subtree = read_grs1(f, o); + } + else + { + c->which = Z_ElementData_string; + buf[strlen(buf)-1] = '\0'; + c->u.string = odr_strdup(o, buf); + } + r->num_elements++; } } + +Z_GenericRecord *dummy_grs_record (int num, ODR o) +{ + FILE *f = fopen("dummy-grs", "r"); + char line[512]; + Z_GenericRecord *r = 0; + int n; + + if (!f) + return 0; + while (fgets(line, 512, f)) + if (*line == '#' && sscanf(line, "#%d", &n) == 1 && n == num) + { + r = read_grs1(f, o); + break; + } + fclose(f); + return r; +} + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +