/[webpac]/trunk/openisis/lrectest.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/openisis/lrectest.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 239 - (show annotations)
Mon Mar 8 17:49:13 2004 UTC (20 years ago) by dpavlin
File MIME type: text/plain
File size: 8348 byte(s)
including openisis 0.9.0 into webpac tree

1 /*
2 openisis - an open implementation of the CDS/ISIS database
3 Version 0.8.x (patchlevel see file Version)
4 Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 see README for more information
21 EOH */
22
23 /*
24 $Id: lrectest.c,v 1.12 2003/05/01 10:05:41 mawag Exp $
25 tests for lrec methods.
26 */
27
28 #include <errno.h>
29 #include <stdarg.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33
34 #include "openisis.h"
35 #include "loi.h"
36 #include "lfdt.h"
37 #include "luti.h"
38
39 #ifdef WIN32
40 #define snprintf _snprintf
41 #define vsnprintf _vsnprintf
42 #endif
43
44 static const char* _TheSummary = "Meeting on the Implementation of the Recommendations of the Third Regional Conference of Ministers of Education and Ministers Responsible for Economic Planning in the Arab States";
45 #define SUMLEN (strlen (_TheSummary))
46
47 static Fd _TheFds[] = {
48 { 20, 0, FTX, 0, 0, 32, "author", "", 0, 0, 0, 0 },
49 { 21, 0, FTX, 1, 0, 32, "names", "", 0, 0, 0, 0 },
50 { 22, 0, FTX, 1, 0, 32, "year", "", 0, 0, 0, 0 },
51 { 42, 0, FTX, 1, 0, 32, "title", "", 0, 0, 0, 0 },
52 { 49, 0, FTX, 1, 0, 32, "summary", "", 0, 0, 0, 0 },
53 { 70, 0, FTX, 1, 0, 32, "country", "", 0, 0, 0, 0 },
54 { 80, 0, FTX, 1, 0, 32, "conference", "", 0, 0, 0, 0 },
55 { 81, 0, FTE, 0, 0, 32, "format", "", 0, 0, 0, 0 },
56 { 81, 0, FTV, 0, 0, 1, "autoformat", "", 0, 0, 0, 0 },
57 { 81, 0, FTV, 0, 0, 2, "naligned", "", 0, 0, 0, 0 },
58 { 81, 0, FTV, 0, 0, 73, "aligned", "", 0, 0, 0, 0 },
59 { 82, 0, FTB, 0, 0, 10, "soldout", "", 0, 0, 0, 0 }
60 };
61
62 static Fdt _TheFdt = {
63 sizeof(_TheFds) / sizeof(_TheFds[0]),
64 _TheFds,
65 0
66 };
67
68 static void check (
69 char *msg, Rec *rec, int *tag, const char **val, int len, int used
70 ) {
71 Field *F;
72 int idx, vlen, ok;
73 if (0 == rec) {
74 fprintf (stderr, "ERR %s: 0 == rec\n", msg);
75 exit (1);
76 }
77 if (! OPENISIS_RECOK (rec)) {
78 fprintf (stderr, "ERR %s: ! RECOK: b %d u %d/%d f %d/%d\n",
79 msg, rec->base, rec->used, rec->bytes, rec->len, rec->fields);
80 exit (1);
81 }
82 if (len != rec->len) {
83 fprintf (stderr, "ERR %s: len %d != %d\n", msg, rec->len, len);
84 log_rec (LOG_ERROR, rec, 0, 0);
85 exit (1);
86 }
87 if (0 <= used && used != rec->used - rec->base) {
88 fprintf (stderr, "ERR %s: used %d (%d-%d) != %d\n",
89 msg, (rec->used - rec->base), rec->used, rec->base, used);
90 log_rec (LOG_ERROR, rec, 0, 0);
91 exit (1);
92 }
93 ok = !0;
94 for (idx = 0; len > idx; ++idx) {
95 vlen = strlen (val[idx]);
96 F = rec->field + idx;
97 if (F->tag != tag[idx]) {
98 fprintf (stderr, "ERR %s: fld[%d] tag %d != %d\n",
99 msg, idx, F->tag, tag[idx]);
100 ok = 0;
101 }
102 if (F->len != vlen ||
103 strncmp (F->val, val[idx], vlen)) {
104 fprintf (stderr, "ERR %s: fld[%d] val <%.*s> != <%s>\n",
105 msg, idx, (int)F->len, F->val, val[idx]);
106 ok = 0;
107 }
108 }
109 if (! ok) {
110 exit (1);
111 }
112 }
113
114 int main (int argc, char **argv) {
115 const char *args[32];
116 const char *vals[32];
117 int tags[32];
118 Rec *rec = 0;
119
120 /* call lio_init to prepare stderr on windows */
121 openIsisCOpen (0);
122
123 if (1 < argc) {
124 #define EXPFLD (1332 + (1000 - 888))
125 int bytes = 0, used = 0, num = atoi (argv[1]);
126 printf ("entering loops (%d) ...\n", num);
127 while (num) {
128 int j;
129 rec = 0;
130 for (j = 1000; 1 <= --j; ) {
131 RADD (rec, j, _TheSummary, SUMLEN, !0);
132 }
133 for (j = 888; 666 <= --j; ) {
134 rec = rSet (rec, RDEL | RNOC, j, 0);
135 }
136 for (j = 666; 444 <= --j; ) {
137 rec = rSet (rec, RDEL, j, 0);
138 }
139 for (j = 444; 222 <= --j; ) {
140 rec = rSet (rec, RDEL | RNOC, j, 0);
141 }
142 for (j = 1333; 222 <= --j; ) {
143 RADD (rec, j, _TheSummary, SUMLEN, !0);
144 }
145 if (EXPFLD != rec->len) {
146 printf ("%d: ERR: #len = %d, expected %d\n",
147 num, rec->len, EXPFLD);
148 exit (1);
149 }
150 if (0 == bytes) {
151 bytes = rec->bytes;
152 used = rec->used;
153 printf ("mem %d use %d ...\n",
154 rec->bytes, rec->used);
155 }
156 else {
157 if (bytes != rec->bytes || used != rec->used) {
158 printf ("%d: ERR: mem = %d use = %d\n",
159 num, rec->bytes, rec->used);
160 exit (1);
161 }
162 if (0 == (num % 100)) {
163 printf ("%d ...\n", num);
164 }
165 }
166 mFree (rec);
167 --num;
168 }
169 printf ("ok.\n");
170 exit (0);
171 }
172
173 args[0] = "20";
174 args[1] = "Mary";
175 rec = rSet (rec, RARGV | 2, args);
176 tags[0] = 20;
177 vals[0] = args[1];
178 check ("A", rec, tags, vals, 1, 4);
179
180 args[0] = "22";
181 args[1] = "1953";
182 args[2] = "70";
183 args[3] = "Italy";
184 args[4] = "98";
185 args[5] = "illegal";
186 args[6] = "20";
187 args[7] = "John";
188 rec = rSet (rec, RARGV | RFDT | 8, &_TheFdt, args);
189 tags[0] = 20;
190 vals[0] = "Mary";
191 tags[1] = 22;
192 vals[1] = "1953";
193 tags[2] = 70;
194 vals[2] = "Italy";
195 tags[3] = 20;
196 vals[3] = "John";
197 check ("B", rec, tags, vals, 3, 13);
198
199 args[0] = "98";
200 args[1] = "illegal";
201 args[2] = "20";
202 args[3] = "John";
203 rec = rSet (rec, RARGV | RFDT | RIGN | 4, &_TheFdt, args);
204 check ("C", rec, tags, vals, 4, 17);
205
206 rec = rSet (rec, RDEL, 20, 0);
207 tags[0] = 22;
208 vals[0] = "1953";
209 tags[1] = 70;
210 vals[1] = "Italy";
211 check ("D", rec, tags, vals, 2, 9);
212
213 rec = rSet (rec, RDFLT | RFDT, &_TheFdt,
214 81, "naligned", 22, "already there", 0);
215 tags[2] = 81;
216 vals[2] = "2";
217 check ("D1", rec, tags, vals, 3, 10);
218
219 tags[3] = 234;
220 vals[3] = "foo";
221 rec = rSet (rec, RDFLT, 234, "foo", 0);
222 check ("D2", rec, tags, vals, 4, 13);
223
224 rec = rSet (rec, RDEL, 234, 81, 0);
225 check ("D3", rec, tags, vals, 2, 13);
226
227 rec = rSet (rec, 0, 20, "Mary", 20, "James", 90, "Alabama", 0);
228 tags[2] = 20;
229 vals[2] = "Mary";
230 tags[3] = 20;
231 vals[3] = "James";
232 tags[4] = 90;
233 vals[4] = "Alabama";
234 check ("E", rec, tags, vals, 5, 29);
235
236 rec = rSet (rec, RFDT | RCHG, &_TheFdt,
237 20, "Lary", 70, "Greece", 70, "Cuba", 42, "Folklore from Africa",
238 81, "invalid", 0);
239 tags[0] = 22;
240 vals[0] = "1953";
241 tags[1] = 70;
242 vals[1] = "Greece";
243 tags[2] = 20;
244 vals[2] = "Lary";
245 tags[3] = 90;
246 vals[3] = "Alabama";
247 tags[4] = 70;
248 vals[4] = "Cuba";
249 tags[5] = 42;
250 vals[5] = "Folklore from Africa";
251 check ("F", rec, tags, vals, 6, 45);
252
253 rec = rSet (rec, 0, 20, "Peter", 20, "Gary", 70, "Egypt", 0);
254 tags[6] = 20;
255 vals[6] = "Peter";
256 tags[7] = 20;
257 vals[7] = "Gary";
258 tags[8] = 70;
259 vals[8] = "Egypt";
260 check ("G", rec, tags, vals, 9, 59);
261
262 args[0] = "author[1]";
263 args[1] = "81";
264 args[2] = "70";
265 rec = rSet (rec, RFDT | RARGV | RDEL | 3, &_TheFdt, args);
266 tags[0] = 22;
267 vals[0] = "1953";
268 tags[1] = 20;
269 vals[1] = "Lary";
270 tags[2] = 90;
271 vals[2] = "Alabama";
272 tags[3] = 42;
273 vals[3] = "Folklore from Africa";
274 tags[4] = 20;
275 vals[4] = "Gary";
276 check ("H", rec, tags, vals, 5, 39);
277
278 args[0] = "author[0]";
279 args[1] = "May";
280 args[2] = "summary";
281 args[3] = _TheSummary;
282 args[4] = "soldout";
283 args[5] = "format";
284 args[6] = "aligned";
285 rec = rSet (rec, RFDT | RARGV | RCHG | RNOC | 7, &_TheFdt, args);
286 vals[1] = "May";
287 tags[5] = 49;
288 vals[5] = _TheSummary;
289 tags[6] = 82;
290 vals[6] = "1";
291 tags[7] = 81;
292 vals[7] = "73";
293 check ("I", rec, tags, vals, 8, 42 + SUMLEN);
294
295 args[0] = "20[0]";
296 args[1] = "Marilyn";
297 args[2] = "49[1]";
298 args[3] = _TheSummary;
299 rec = rSet (rec, RARGV | RCHG | 4, args);
300 vals[1] = "Marilyn";
301 tags[8] = 49;
302 vals[8] = _TheSummary;
303 check ("J", rec, tags, vals, 9, 45 + 2 * SUMLEN);
304
305 rec = rSet (rec, RDEL | 2, 82, 22, 0);
306 tags[0] = 20;
307 vals[0] = "Marilyn";
308 tags[1] = 90;
309 vals[1] = "Alabama";
310 tags[2] = 42;
311 vals[2] = "Folklore from Africa";
312 tags[3] = 20;
313 vals[3] = "Gary";
314 tags[4] = 49;
315 vals[4] = _TheSummary;
316 tags[5] = 81;
317 vals[5] = "73";
318 tags[6] = 49;
319 vals[6] = _TheSummary;
320 check ("K", rec, tags, vals, 7, 40 + 2 * SUMLEN);
321
322 rec = rSet (rec, RFDT | RCHG, &_TheFdt,
323 82, "false", 81, "2", 49, "overview", 0);
324 vals[4] = "overview";
325 vals[5] = "2";
326 tags[6] = 82;
327 vals[6] = "0";
328 check ("L", rec, tags, vals, 7, 48);
329
330 mFree (rec);
331
332 printf ("ok.\n");
333 return 0;
334 }
335

  ViewVC Help
Powered by ViewVC 1.1.26