X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frecgrs.c;h=680dde2edae8317dcabfa0c0e6498a667a65b050;hb=6b0310a64df542131c2f4abded39f35844235e4d;hp=b4ef25cd00ca9e6c5888aaae385e7bf8627f5815;hpb=e9b33fe049e35d06dfeedb830feea32553d26cee;p=idzebra-moved-to-github.git diff --git a/recctrl/recgrs.c b/recctrl/recgrs.c index b4ef25c..680dde2 100644 --- a/recctrl/recgrs.c +++ b/recctrl/recgrs.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: recgrs.c,v $ - * Revision 1.26 1999-03-02 16:15:44 quinn + * Revision 1.29 1999-05-26 07:49:14 adam + * C++ compilation. + * + * Revision 1.28 1999/05/21 12:00:17 adam + * Better diagnostics for extraction process. + * + * Revision 1.27 1999/05/20 12:57:18 adam + * Implemented TCL filter. Updated recctrl system. + * + * Revision 1.26 1999/03/02 16:15:44 quinn * Added "tagsysno" and "tagrank" directives to zebra.cfg. * * Revision 1.25 1999/02/18 15:01:26 adam @@ -187,19 +196,23 @@ #define GRS_MAX_WORD 512 -static data1_node *read_grs_type (struct grs_read_info *p, const char *type) +struct grs_handler { + RecTypeGrs type; + void *clientData; + int initFlag; + struct grs_handler *next; +}; + +struct grs_handlers { + struct grs_handler *handlers; +}; + +static int read_grs_type (struct grs_handlers *h, + struct grs_read_info *p, const char *type, + data1_node **root) { - static struct { - char *type; - data1_node *(*func)(struct grs_read_info *p); - } tab[] = { - { "sgml", grs_read_sgml }, - { "regx", grs_read_regx }, - { "marc", grs_read_marc }, - { NULL, NULL } - }; + struct grs_handler *gh = h->handlers; const char *cp = strchr (type, '.'); - int i; if (cp == NULL || cp == type) { @@ -208,20 +221,61 @@ static data1_node *read_grs_type (struct grs_read_info *p, const char *type) } else strcpy (p->type, cp+1); - for (i=0; tab[i].type; i++) + for (gh = h->handlers; gh; gh = gh->next) { - if (!memcmp (type, tab[i].type, cp-type)) - return (tab[i].func)(p); + if (!memcmp (type, gh->type->type, cp-type)) + { + if (!gh->initFlag) + { + gh->initFlag = 1; + gh->clientData = (*gh->type->init)(); + } + p->clientData = gh->clientData; + *root = (gh->type->read)(p); + gh->clientData = p->clientData; + return 0; + } } - return NULL; + return 1; +} + +static void grs_add_handler (struct grs_handlers *h, RecTypeGrs t) +{ + struct grs_handler *gh = (struct grs_handler *) malloc (sizeof(*gh)); + gh->next = h->handlers; + h->handlers = gh; + gh->initFlag = 0; + gh->clientData = 0; + gh->type = t; } -static void grs_init(RecType recType) +static void *grs_init(RecType recType) { + struct grs_handlers *h = (struct grs_handlers *) malloc (sizeof(*h)); + h->handlers = 0; + + grs_add_handler (h, recTypeGrs_sgml); + grs_add_handler (h, recTypeGrs_regx); +#if HAVE_TCL_H + grs_add_handler (h, recTypeGrs_tcl); +#endif + grs_add_handler (h, recTypeGrs_marc); + return h; } -static void grs_destroy(RecType recType) +static void grs_destroy(void *clientData) { + struct grs_handlers *h = (struct grs_handlers *) clientData; + struct grs_handler *gh = h->handlers, *gh_next; + while (gh) + { + gh_next = gh->next; + if (gh->initFlag) + (*gh->type->destroy)(gh->clientData); + free (gh); + gh = gh_next; + } + free (h); } static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level) @@ -349,13 +403,14 @@ int grs_extract_tree(struct recExtractCtrl *p, data1_node *n) return dumpkeys(n, p, 0); } -static int grs_extract(struct recExtractCtrl *p) +static int grs_extract(void *clientData, struct recExtractCtrl *p) { data1_node *n; NMEM mem; struct grs_read_info gri; oident oe; int oidtmp[OID_SIZE]; + struct grs_handlers *h = (struct grs_handlers *) clientData; mem = nmem_create (); gri.readf = p->readf; @@ -367,9 +422,10 @@ static int grs_extract(struct recExtractCtrl *p) gri.mem = mem; gri.dh = p->dh; - n = read_grs_type (&gri, p->subType); + if (read_grs_type (h, &gri, p->subType, &n)) + return RECCTRL_EXTRACT_ERROR; if (!n) - return -1; + return RECCTRL_EXTRACT_EOF; oe.proto = PROTO_Z3950; oe.oclass = CLASS_SCHEMA; @@ -380,11 +436,11 @@ static int grs_extract(struct recExtractCtrl *p) if (dumpkeys(n, p, 0) < 0) { data1_free_tree(p->dh, n); - return -2; + return RECCTRL_EXTRACT_ERROR; } data1_free_tree(p->dh, n); nmem_destroy(mem); - return 0; + return RECCTRL_EXTRACT_OK; } /* @@ -461,7 +517,7 @@ static int process_comp(data1_handle dh, data1_node *n, Z_RecordComposition *c) } } -static int grs_retrieve(struct recRetrieveCtrl *p) +static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p) { data1_node *node = 0, *onode = 0; data1_node *dnew; @@ -470,6 +526,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p) NMEM mem; struct grs_read_info gri; char *tagname; + struct grs_handlers *h = (struct grs_handlers *) clientData; mem = nmem_create(); gri.readf = p->readf; @@ -482,7 +539,12 @@ static int grs_retrieve(struct recRetrieveCtrl *p) gri.dh = p->dh; logf (LOG_DEBUG, "grs_retrieve"); - node = read_grs_type (&gri, p->subType); + if (read_grs_type (h, &gri, p->subType, &node)) + { + p->diagnostic = 14; + nmem_destroy (mem); + return 0; + } if (!node) { p->diagnostic = 14; @@ -555,7 +617,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p) "schemaIdentifier", mem))) { dnew->u.data.what = DATA1I_oid; - dnew->u.data.data = nmem_malloc(mem, p - tmp); + dnew->u.data.data = (char *) nmem_malloc(mem, p - tmp); memcpy(dnew->u.data.data, tmp, p - tmp); dnew->u.data.len = p - tmp; } @@ -609,21 +671,21 @@ static int grs_retrieve(struct recRetrieveCtrl *p) p->odr, &dummy))) p->diagnostic = 238; /* not available in requested syntax */ else - p->rec_len = -1; + p->rec_len = (size_t) (-1); break; case VAL_EXPLAIN: if (!(p->rec_buf = data1_nodetoexplain(p->dh, node, selected, p->odr))) p->diagnostic = 238; else - p->rec_len = -1; + p->rec_len = (size_t) (-1); break; case VAL_SUMMARY: if (!(p->rec_buf = data1_nodetosummary(p->dh, node, selected, p->odr))) p->diagnostic = 238; else - p->rec_len = -1; + p->rec_len = (size_t) (-1); break; case VAL_SUTRS: if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,