X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frecctrl.c;h=9530959a2e85621d4343f2910521d1a79be14e67;hb=e5ebc859654d84aa9098142b34015648d8e333de;hp=b0e7b9b2b4a467bb6abae9847401f6b1b85b9080;hpb=c325477904a47c61586ad9b756b9280c22351c6b;p=idzebra-moved-to-github.git diff --git a/recctrl/recctrl.c b/recctrl/recctrl.c index b0e7b9b..9530959 100644 --- a/recctrl/recctrl.c +++ b/recctrl/recctrl.c @@ -1,10 +1,19 @@ /* - * Copyright (C) 1994-1996, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: recctrl.c,v $ - * Revision 1.2 1996-10-29 14:03:16 adam + * Revision 1.5 1999-05-26 07:49:14 adam + * C++ compilation. + * + * Revision 1.4 1999/05/20 12:57:18 adam + * Implemented TCL filter. Updated recctrl system. + * + * Revision 1.3 1998/10/16 08:14:36 adam + * Updated record control system. + * + * Revision 1.2 1996/10/29 14:03:16 adam * Include zebrautl.h instead of alexutil.h. * * Revision 1.1 1996/10/11 10:57:24 adam @@ -37,8 +46,54 @@ #include "rectext.h" #include "recgrs.h" -RecType recType_byName (const char *name, char *subType) +struct recTypeEntry { + RecType recType; + struct recTypeEntry *next; + int init_flag; + void *clientData; +}; + +struct recTypes { + data1_handle dh; + struct recTypeEntry *entries; +}; + +RecTypes recTypes_init (data1_handle dh) +{ + RecTypes p = (RecTypes) nmem_malloc (data1_nmem_get (dh), sizeof(*p)); + + p->dh = dh; + p->entries = 0; + return p; +} + +void recTypes_destroy (RecTypes rts) +{ + struct recTypeEntry *rte; + + for (rte = rts->entries; rte; rte = rte->next) + if (rte->init_flag) + (*(rte->recType)->destroy)(rte->clientData); +} + +void recTypes_add_handler (RecTypes rts, RecType rt) +{ + struct recTypeEntry *rte; + + rte = (struct recTypeEntry *) + nmem_malloc (data1_nmem_get (rts->dh), sizeof(*rte)); + + rte->recType = rt; + rte->init_flag = 0; + rte->clientData = 0; + rte->next = rts->entries; + rts->entries = rte; +} + +RecType recType_byName (RecTypes rts, const char *name, char *subType, + void **clientDataP) { + struct recTypeEntry *rte; char *p; char tmpname[256]; @@ -50,10 +105,23 @@ RecType recType_byName (const char *name, char *subType) } else *subType = '\0'; - if (!strcmp (recTypeGrs->name, tmpname)) - return recTypeGrs; - if (!strcmp (recTypeText->name, tmpname)) - return recTypeText; - return NULL; + for (rte = rts->entries; rte; rte = rte->next) + if (!strcmp (rte->recType->name, tmpname)) + { + if (!rte->init_flag) + { + rte->init_flag = 1; + rte->clientData = + (*(rte->recType)->init)(rte->recType); + } + *clientDataP = rte->clientData; + return rte->recType; + } + return 0; } +void recTypes_default_handlers (RecTypes rts) +{ + recTypes_add_handler (rts, recTypeGrs); + recTypes_add_handler (rts, recTypeText); +}