2 * Copyright (C) 1994-1996, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.1 1996-05-13 14:23:07 adam
8 * Work on compaction of set/use bytes in dictionary.
24 struct zebSUInfo info;
25 struct zebSUInfoB *next;
28 struct zebDatabaseInfo {
29 struct zebSUInfoB *SUInfo;
33 struct zebDatabaseInfo *next;
36 struct zebTargetInfo {
40 struct zebDatabaseInfo *databaseInfo;
41 struct zebDatabaseInfo *curDatabaseInfo;
44 void zebTargetInfo_close (ZebTargetInfo *zti, int writeFlag)
46 struct zebDatabaseInfo *zdi, *zdi1;
51 char p0[4096], *p = p0;
53 memcpy (p, &zti->dictNum, sizeof(zti->dictNum));
54 p += sizeof(zti->dictNum);
55 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
57 if (zdi->readFlag || !zdi->sysno)
59 char q0[4096], *q = q0;
60 struct zebSUInfoB *zsui;
65 drec = rec_get (zti->records, zdi->sysno);
68 drec = rec_new (zti->records);
69 zdi->sysno = drec->sysno;
72 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
74 memcpy (q, &no, sizeof(no));
76 for (zsui = zdi->SUInfo; zsui; zsui=zsui->next)
78 memcpy (q, &zsui->info, sizeof(zsui->info));
79 q += sizeof(zsui->info);
81 xfree (drec->info[0]);
83 drec->info[0] = xmalloc (drec->size[0]);
84 memcpy (drec->info[0], q0, drec->size[0]);
85 rec_put (zti->records, &drec);
87 strcpy (p, zdi->databaseName);
89 memcpy (p, &zdi->sysno, sizeof(zdi->sysno));
90 p += sizeof(zdi->sysno);
93 grec = rec_get (zti->records, 1);
94 xfree (grec->info[0]);
96 grec->info[0] = xmalloc (grec->size[0]);
97 memcpy (grec->info[0], p0, grec->size[0]);
98 rec_put (zti->records, &grec);
100 for (zdi = zti->databaseInfo; zdi; zdi = zdi1)
102 struct zebSUInfoB *zsui, *zsui1;
105 for (zsui = zdi->SUInfo; zsui; zsui = zsui1)
110 xfree (zdi->databaseName);
116 ZebTargetInfo *zebTargetInfo_open (Records records, int writeFlag)
120 struct zebDatabaseInfo **zdi;
122 zti = xmalloc (sizeof(*zti));
124 zti->curDatabaseInfo = NULL;
125 zti->records = records;
127 zdi = &zti->databaseInfo;
129 rec = rec_get (records, 1);
136 memcpy (&zti->dictNum, p, sizeof(zti->dictNum));
137 p += sizeof(zti->dictNum);
140 *zdi = xmalloc (sizeof(**zdi));
141 (*zdi)->SUInfo = NULL;
142 (*zdi)->databaseName = xstrdup (p);
144 memcpy (&(*zdi)->sysno, p, sizeof((*zdi)->sysno));
145 p += sizeof((*zdi)->sysno);
146 (*zdi)->readFlag = 1;
149 assert (p - rec->info[0] == rec->size[0]-1);
156 rec = rec_new (records);
157 rec->info[0] = xmalloc (1+sizeof(zti->dictNum));
158 memcpy (rec->info[0], &zti->dictNum, sizeof(zti->dictNum));
159 rec->info[0][sizeof(zti->dictNum)] = '\0';
160 rec_put (records, &rec);
168 static void zebTargetInfo_readDatabase (ZebTargetInfo *zti,
169 struct zebDatabaseInfo *zdi)
172 struct zebSUInfoB **zsuip = &zdi->SUInfo;
176 rec = rec_get (zti->records, zdi->sysno);
179 memcpy (&no, p, sizeof(no));
181 for (i = 0; i<no; i++)
183 *zsuip = xmalloc (sizeof(**zsuip));
184 memcpy (&(*zsuip)->info, p, sizeof((*zsuip)->info));
185 p += sizeof((*zsuip)->info);
186 zsuip = &(*zsuip)->next;
193 int zebTargetInfo_curDatabase (ZebTargetInfo *zti, const char *database)
195 struct zebDatabaseInfo *zdi;
198 if (zti->curDatabaseInfo &&
199 !strcmp (zti->curDatabaseInfo->databaseName, database))
201 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
203 if (!strcmp (zdi->databaseName, database))
209 zebTargetInfo_readDatabase (zti, zdi);
210 zti->curDatabaseInfo = zdi;
214 int zebTargetInfo_newDatabase (ZebTargetInfo *zti, const char *database)
216 struct zebDatabaseInfo *zdi;
219 for (zdi = zti->databaseInfo; zdi; zdi=zdi->next)
221 if (!strcmp (zdi->databaseName, database))
226 zdi = xmalloc (sizeof(*zdi));
227 zdi->next = zti->databaseInfo;
228 zti->databaseInfo = zdi;
231 zdi->databaseName = xstrdup (database);
233 zti->curDatabaseInfo = zdi;
237 int zebTargetInfo_lookupSU (ZebTargetInfo *zti, int set, int use)
239 struct zebSUInfoB *zsui;
241 assert (zti->curDatabaseInfo);
242 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
243 if (zsui->info.use == use && zsui->info.set == set)
244 return zsui->info.ordinal;
248 int zebTargetInfo_addSU (ZebTargetInfo *zti, int set, int use)
250 struct zebSUInfoB *zsui;
252 assert (zti->curDatabaseInfo);
253 for (zsui = zti->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)
254 if (zsui->info.use == use && zsui->info.set == set)
256 zsui = xmalloc (sizeof(*zsui));
257 zsui->next = zti->curDatabaseInfo->SUInfo;
258 zti->curDatabaseInfo->SUInfo = zsui;
259 zsui->info.set = set;
260 zsui->info.use = use;
261 zsui->info.ordinal = (zti->dictNum)++;
262 return zsui->info.ordinal;