Implemented TCL filter. Updated recctrl system.
[idzebra-moved-to-github.git] / recctrl / recctrl.c
1 /*
2  * Copyright (C) 1994-1999, Index Data
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: recctrl.c,v $
7  * Revision 1.4  1999-05-20 12:57:18  adam
8  * Implemented TCL filter. Updated recctrl system.
9  *
10  * Revision 1.3  1998/10/16 08:14:36  adam
11  * Updated record control system.
12  *
13  * Revision 1.2  1996/10/29 14:03:16  adam
14  * Include zebrautl.h instead of alexutil.h.
15  *
16  * Revision 1.1  1996/10/11 10:57:24  adam
17  * New module recctrl. Used to manage records (extract/retrieval).
18  *
19  * Revision 1.5  1996/06/04 10:18:59  adam
20  * Minor changes - removed include of ctype.h.
21  *
22  * Revision 1.4  1995/12/04  17:59:24  adam
23  * More work on regular expression conversion.
24  *
25  * Revision 1.3  1995/12/04  14:22:30  adam
26  * Extra arg to recType_byName.
27  * Started work on new regular expression parsed input to
28  * structured records.
29  *
30  * Revision 1.2  1995/11/15  14:46:19  adam
31  * Started work on better record management system.
32  *
33  * Revision 1.1  1995/09/27  12:22:28  adam
34  * More work on extract in record control.
35  * Field name is not in isam keys but in prefix in dictionary words.
36  *
37  */
38 #include <stdio.h>
39 #include <assert.h>
40 #include <string.h>
41
42 #include <zebrautl.h>
43 #include "rectext.h"
44 #include "recgrs.h"
45
46 struct recTypeEntry {
47     RecType recType;
48     struct recTypeEntry *next;
49     int init_flag;
50     void *clientData;
51 };
52
53 struct recTypes {
54     data1_handle dh;
55     struct recTypeEntry *entries;
56 };
57
58 RecTypes recTypes_init (data1_handle dh)
59 {
60     RecTypes p = (RecTypes) nmem_malloc (data1_nmem_get (dh), sizeof(*p));
61
62     p->dh = dh;
63     p->entries = 0;
64     return p;
65 }
66
67 void recTypes_destroy (RecTypes rts)
68 {
69     struct recTypeEntry *rte;
70
71     for (rte = rts->entries; rte; rte = rte->next)
72         if (rte->init_flag)
73             (*(rte->recType)->destroy)(rte->clientData);
74 }
75
76 void recTypes_add_handler (RecTypes rts, RecType rt)
77 {
78     struct recTypeEntry *rte;
79
80     rte = nmem_malloc (data1_nmem_get (rts->dh), sizeof(*rte));
81
82     rte->recType = rt;
83     rte->init_flag = 0;
84     rte->clientData = 0;
85     rte->next = rts->entries;
86     rts->entries = rte;
87 }
88
89 RecType recType_byName (RecTypes rts, const char *name, char *subType,
90                         void **clientDataP)
91 {
92     struct recTypeEntry *rte;
93     char *p;
94     char tmpname[256];
95
96     strcpy (tmpname, name);
97     if ((p = strchr (tmpname, '.')))
98     {
99         *p = '\0';
100         strcpy (subType, p+1);
101     }
102     else
103         *subType = '\0';
104     for (rte = rts->entries; rte; rte = rte->next)
105         if (!strcmp (rte->recType->name, tmpname))
106         {
107             if (!rte->init_flag)
108             {
109                 rte->init_flag = 1;
110                 rte->clientData =
111                     (*(rte->recType)->init)(rte->recType);
112             }
113             *clientDataP = rte->clientData;
114             return rte->recType;
115         }
116     return 0;
117 }
118
119 void recTypes_default_handlers (RecTypes rts)
120 {
121     recTypes_add_handler (rts, recTypeGrs);
122     recTypes_add_handler (rts, recTypeText);
123 }