1 /*************************************************************************************************
2 * The test cases of the utility API
3 * Copyright (C) 2006-2008 Mikio Hirabayashi
4 * This file is part of Tokyo Cabinet.
5 * Tokyo Cabinet is free software; you can redistribute it and/or modify it under the terms of
6 * the GNU Lesser General Public License as published by the Free Software Foundation; either
7 * version 2.1 of the License or any later version. Tokyo Cabinet is distributed in the hope
8 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
10 * License for more details.
11 * You should have received a copy of the GNU Lesser General Public License along with Tokyo
12 * Cabinet; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
13 * Boston, MA 02111-1307 USA.
14 *************************************************************************************************/
20 #define RECBUFSIZ 32 // buffer for records
23 /* global variables */
24 const char *g_progname; // program name
27 /* function prototypes */
28 int main(int argc, char **argv);
29 static void usage(void);
30 static void iprintf(const char *format, ...);
31 static int myrand(int range);
32 static int runxstr(int argc, char **argv);
33 static int runlist(int argc, char **argv);
34 static int runmap(int argc, char **argv);
35 static int runmdb(int argc, char **argv);
36 static int runmisc(int argc, char **argv);
37 static int runwicked(int argc, char **argv);
38 static int procxstr(int rnum);
39 static int proclist(int rnum, int anum);
40 static int procmap(int rnum, int bnum);
41 static int procmdb(int rnum, int bnum);
42 static int procmisc(int rnum);
43 static int procwicked(int rnum);
47 int main(int argc, char **argv){
49 srand((unsigned int)(tctime() * 1000) % UINT_MAX);
52 if(!strcmp(argv[1], "xstr")){
53 rv = runxstr(argc, argv);
54 } else if(!strcmp(argv[1], "list")){
55 rv = runlist(argc, argv);
56 } else if(!strcmp(argv[1], "map")){
57 rv = runmap(argc, argv);
58 } else if(!strcmp(argv[1], "mdb")){
59 rv = runmdb(argc, argv);
60 } else if(!strcmp(argv[1], "misc")){
61 rv = runmisc(argc, argv);
62 } else if(!strcmp(argv[1], "wicked")){
63 rv = runwicked(argc, argv);
71 /* print the usage and exit */
72 static void usage(void){
73 fprintf(stderr, "%s: test cases of the utility API of Tokyo Cabinet\n", g_progname);
74 fprintf(stderr, "\n");
75 fprintf(stderr, "usage:\n");
76 fprintf(stderr, " %s xstr rnum\n", g_progname);
77 fprintf(stderr, " %s list rnum [anum]\n", g_progname);
78 fprintf(stderr, " %s map rnum [bnum]\n", g_progname);
79 fprintf(stderr, " %s mdb rnum [bnum]\n", g_progname);
80 fprintf(stderr, " %s misc rnum\n", g_progname);
81 fprintf(stderr, " %s wicked rnum\n", g_progname);
82 fprintf(stderr, "\n");
87 /* print formatted information string and flush the buffer */
88 static void iprintf(const char *format, ...){
97 /* get a random number */
98 static int myrand(int range){
99 return (int)((double)range * rand() / (RAND_MAX + 1.0));
103 /* parse arguments of xstr command */
104 static int runxstr(int argc, char **argv){
106 for(int i = 2; i < argc; i++){
107 if(!rstr && argv[i][0] == '-'){
116 int rnum = atoi(rstr);
117 if(rnum < 1) usage();
118 int rv = procxstr(rnum);
123 /* parse arguments of list command */
124 static int runlist(int argc, char **argv){
127 for(int i = 2; i < argc; i++){
128 if(!rstr && argv[i][0] == '-'){
139 int rnum = atoi(rstr);
140 if(rnum < 1) usage();
141 int anum = astr ? atoi(astr) : -1;
142 int rv = proclist(rnum, anum);
147 /* parse arguments of map command */
148 static int runmap(int argc, char **argv){
151 for(int i = 2; i < argc; i++){
152 if(!rstr && argv[i][0] == '-'){
163 int rnum = atoi(rstr);
164 if(rnum < 1) usage();
165 int bnum = bstr ? atoi(bstr) : -1;
166 int rv = procmap(rnum, bnum);
171 /* parse arguments of mdb command */
172 static int runmdb(int argc, char **argv){
175 for(int i = 2; i < argc; i++){
176 if(!rstr && argv[i][0] == '-'){
187 int rnum = atoi(rstr);
188 if(rnum < 1) usage();
189 int bnum = bstr ? atoi(bstr) : -1;
190 int rv = procmdb(rnum, bnum);
195 /* parse arguments of misc command */
196 static int runmisc(int argc, char **argv){
198 for(int i = 2; i < argc; i++){
199 if(!rstr && argv[i][0] == '-'){
208 int rnum = atoi(rstr);
209 if(rnum < 1) usage();
210 int rv = procmisc(rnum);
215 /* parse arguments of wicked command */
216 static int runwicked(int argc, char **argv){
218 for(int i = 2; i < argc; i++){
219 if(!rstr && argv[i][0] == '-'){
228 int rnum = atoi(rstr);
229 if(rnum < 1) usage();
230 int rv = procwicked(rnum);
235 /* perform xstr command */
236 static int procxstr(int rnum){
237 iprintf("<Extensible String Writing Test>\n rnum=%d\n\n", rnum);
238 double stime = tctime();
239 TCXSTR *xstr = tcxstrnew();
240 for(int i = 1; i <= rnum; i++){
242 int len = sprintf(buf, "%08d", i);
243 tcxstrcat(xstr, buf, len);
244 if(rnum > 250 && i % (rnum / 250) == 0){
247 if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
251 iprintf("time: %.3f\n", tctime() - stime);
257 /* perform list command */
258 static int proclist(int rnum, int anum){
259 iprintf("<List Writing Test>\n rnum=%d anum=%d\n\n", rnum, anum);
260 double stime = tctime();
261 TCLIST *list = (anum > 0) ? tclistnew2(anum) : tclistnew();
262 for(int i = 1; i <= rnum; i++){
264 int len = sprintf(buf, "%08d", i);
265 tclistpush(list, buf, len);
266 if(rnum > 250 && i % (rnum / 250) == 0){
269 if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
273 iprintf("time: %.3f\n", tctime() - stime);
279 /* perform map command */
280 static int procmap(int rnum, int bnum){
281 iprintf("<Map Writing Test>\n rnum=%d\n\n", rnum);
282 double stime = tctime();
283 TCMAP *map = (bnum > 0) ? tcmapnew2(bnum) : tcmapnew();
284 for(int i = 1; i <= rnum; i++){
286 int len = sprintf(buf, "%08d", i);
287 tcmapput(map, buf, len, buf, len);
288 if(rnum > 250 && i % (rnum / 250) == 0){
291 if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
295 iprintf("time: %.3f\n", tctime() - stime);
301 /* perform mdb command */
302 static int procmdb(int rnum, int bnum){
303 iprintf("<On-memory Database Writing Test>\n rnum=%d\n\n", rnum);
304 double stime = tctime();
305 TCMDB *mdb = (bnum > 0) ? tcmdbnew2(bnum) : tcmdbnew();
306 for(int i = 1; i <= rnum; i++){
308 int len = sprintf(buf, "%08d", i);
309 tcmdbput(mdb, buf, len, buf, len);
310 if(rnum > 250 && i % (rnum / 250) == 0){
313 if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
316 iprintf("record number: %llu\n", (unsigned long long)tcmdbrnum(mdb));
317 iprintf("size: %llu\n", (unsigned long long)tcmdbmsiz(mdb));
319 iprintf("time: %.3f\n", tctime() - stime);
325 /* perform misc command */
326 static int procmisc(int rnum){
327 iprintf("<Miscellaneous Test>\n rnum=%d\n\n", rnum);
328 double stime = tctime();
330 for(int i = 1; i <= rnum && !err; i++){
331 const char *str = "5%2+3-1=4 \"Yes/No\" <a&b>";
332 int slen = strlen(str);
339 buf = tcmemdup(str, slen);
340 xstr = tcxstrfrommalloc(buf, slen);
341 buf = tcxstrtomalloc(xstr);
342 if(strcmp(buf, str)) err = true;
344 if(tclmax(1, 2) != 2) err = true;
345 if(tclmin(1, 2) != 1) err = true;
347 if(tcdrand() >= 1.0) err = true;
349 if(tcstricmp("abc", "ABC") != 0) err = true;
350 if(!tcstrfwm("abc", "ab") || !tcstrifwm("abc", "AB")) err = true;
351 if(!tcstrbwm("abc", "bc") || !tcstribwm("abc", "BC")) err = true;
352 if(tcstrdist("abcde", "abdfgh") != 4 || tcstrdist("abdfgh", "abcde") != 4) err = true;
353 if(tcstrdistutf("abcde", "abdfgh") != 4 || tcstrdistutf("abdfgh", "abcde") != 4) err = true;
354 buf = tcmemdup("abcde", 5);
356 if(strcmp(buf, "ABCDE")) err = true;
358 if(strcmp(buf, "abcde")) err = true;
360 buf = tcmemdup(" ab cd ", 10);
362 if(strcmp(buf, "ab cd")) err = true;
364 if(strcmp(buf, "ab cd")) err = true;
365 tcstrsubchr(buf, "cd", "C");
366 if(strcmp(buf, "ab C")) err = true;
367 if(tcstrcntutf(buf) != 4) err = true;
369 if(strcmp(buf, "ab")) err = true;
372 int anum = myrand(30);
373 uint16_t ary[anum+1];
374 for(int j = 0; j < anum; j++){
375 ary[j] = myrand(65535) + 1;
378 tcstrucstoutf(ary, anum, ustr);
379 uint16_t dary[anum+1];
381 tcstrutftoucs(ustr, dary, &danum);
385 for(int j = 0; j < danum; j++){
386 if(dary[j] != dary[j]) err = true;
389 list = tcstrsplit(",a,b..c,d,", ",.");
390 if(tclistnum(list) != 7) err = true;
391 buf = tcstrjoin(list, ':');
392 if(strcmp(buf, ":a:b::c:d:")) err = true;
395 if(!tcregexmatch("ABCDEFGHI", "*(b)c[d-f]*g(h)")) err = true;
396 buf = tcregexreplace("ABCDEFGHI", "*(b)c[d-f]*g(h)", "[\\1][\\2][&]");
397 if(strcmp(buf, "A[B][H][BCDEFGH]I")) err = true;
401 date = myrand(INT_MAX - 1000000);
402 jl = 3600 * (myrand(23) - 11);
403 tcdatestrwww(date, jl, buf);
404 ddate = tcstrmktime(buf);
405 if(ddate != date) err = true;
406 tcdatestrhttp(date, jl, buf);
407 ddate = tcstrmktime(buf);
408 if(ddate != date) err = true;
412 for(int j = 0; j < 10; j++){
413 char kbuf[RECBUFSIZ];
414 int ksiz = sprintf(kbuf, "%d", myrand(10));
415 tcmapaddint(map, kbuf, ksiz, 1);
416 const char *vbuf = tcmapget2(map, kbuf);
417 if(*(int *)vbuf < 1) err = true;
421 buf = tcurlencode(str, slen);
422 if(strcmp(buf, "5%252%2B3-1%3D4%20%22Yes%2FNo%22%20%3Ca%26b%3E")) err = true;
423 dec = tcurldecode(buf, &dsiz);
424 if(dsiz != slen || strcmp(dec, str)) err = true;
428 map = tcurlbreak("http://mikio:oikim@estraier.net:1978/foo/bar/baz.cgi?ab=cd&ef=jkl#quux");
430 if(!(elem = tcmapget2(map, "self")) ||
431 strcmp(elem, "http://mikio:oikim@estraier.net:1978/foo/bar/baz.cgi?ab=cd&ef=jkl#quux"))
433 if(!(elem = tcmapget2(map, "scheme")) || strcmp(elem, "http")) err = true;
434 if(!(elem = tcmapget2(map, "host")) || strcmp(elem, "estraier.net")) err = true;
435 if(!(elem = tcmapget2(map, "port")) || strcmp(elem, "1978")) err = true;
436 if(!(elem = tcmapget2(map, "authority")) || strcmp(elem, "mikio:oikim")) err = true;
437 if(!(elem = tcmapget2(map, "path")) || strcmp(elem, "/foo/bar/baz.cgi")) err = true;
438 if(!(elem = tcmapget2(map, "file")) || strcmp(elem, "baz.cgi")) err = true;
439 if(!(elem = tcmapget2(map, "query")) || strcmp(elem, "ab=cd&ef=jkl")) err = true;
440 if(!(elem = tcmapget2(map, "fragment")) || strcmp(elem, "quux")) err = true;
442 buf = tcurlresolve("http://a:b@c.d:1/e/f/g.h?i=j#k", "http://A:B@C.D:1/E/F/G.H?I=J#K");
443 if(strcmp(buf, "http://A:B@c.d:1/E/F/G.H?I=J#K")) err = true;
445 buf = tcurlresolve("http://a:b@c.d:1/e/f/g.h?i=j#k", "/E/F/G.H?I=J#K");
446 if(strcmp(buf, "http://a:b@c.d:1/E/F/G.H?I=J#K")) err = true;
448 buf = tcurlresolve("http://a:b@c.d:1/e/f/g.h?i=j#k", "G.H?I=J#K");
449 if(strcmp(buf, "http://a:b@c.d:1/e/f/G.H?I=J#K")) err = true;
451 buf = tcurlresolve("http://a:b@c.d:1/e/f/g.h?i=j#k", "?I=J#K");
452 if(strcmp(buf, "http://a:b@c.d:1/e/f/g.h?I=J#K")) err = true;
454 buf = tcurlresolve("http://a:b@c.d:1/e/f/g.h?i=j#k", "#K");
455 if(strcmp(buf, "http://a:b@c.d:1/e/f/g.h?i=j#K")) err = true;
458 buf = tcbaseencode(str, slen);
459 if(strcmp(buf, "NSUyKzMtMT00ICJZZXMvTm8iIDxhJmI+")) err = true;
460 dec = tcbasedecode(buf, &dsiz);
461 if(dsiz != slen || strcmp(dec, str)) err = true;
464 buf = tcquoteencode(str, slen);
465 if(strcmp(buf, "5%2+3-1=3D4 \"Yes/No\" <a&b>")) err = true;
466 dec = tcquotedecode(buf, &dsiz);
467 if(dsiz != slen || strcmp(dec, str)) err = true;
470 buf = tcmimeencode(str, "UTF-8", true);
471 if(strcmp(buf, "=?UTF-8?B?NSUyKzMtMT00ICJZZXMvTm8iIDxhJmI+?=")) err = true;
473 dec = tcmimedecode(buf, encname);
474 if(strcmp(dec, str) || strcmp(encname, "UTF-8")) err = true;
477 buf = tcpackencode(str, slen, &bsiz);
478 dec = tcpackdecode(buf, bsiz, &dsiz);
479 if(dsiz != slen || strcmp(dec, str)) err = true;
482 buf = tcbsencode(str, slen, &bsiz);
483 dec = tcbsdecode(buf, bsiz, &dsiz);
484 if(dsiz != slen || strcmp(dec, str)) err = true;
488 buf = tcbwtencode(str, slen, &idx);
489 if(memcmp(buf, "4\"o 5a23s-%+=> 1b/\"<&YNe", slen) || idx != 13) err = true;
490 dec = tcbwtdecode(buf, slen, idx);
491 if(memcmp(dec, str, slen)) err = true;
495 if((buf = tcdeflate(str, slen, &bsiz)) != NULL){
496 if((dec = tcinflate(buf, bsiz, &dsiz)) != NULL){
497 if(slen != dsiz || memcmp(str, dec, dsiz)) err = true;
506 if((buf = tcgzipencode(str, slen, &bsiz)) != NULL){
507 if((dec = tcgzipdecode(buf, bsiz, &dsiz)) != NULL){
508 if(slen != dsiz || memcmp(str, dec, dsiz)) err = true;
517 if(tcgetcrc("hoge", 4) % 10000 != 7034) err = true;
519 int anum = myrand(50)+1;
520 unsigned int ary[anum];
521 for(int j = 0; j < anum; j++){
522 ary[j] = myrand(INT_MAX);
524 buf = tcberencode(ary, anum, &bsiz);
526 unsigned int *dary = tcberdecode(buf, bsiz, &dnum);
527 if(anum != dnum || memcmp(ary, dary, sizeof(*dary) * dnum)) err = true;
530 buf = tcxmlescape(str);
531 if(strcmp(buf, "5%2+3-1=4 "Yes/No" <a&b>")) err = true;
532 dec = tcxmlunescape(buf);
533 if(strcmp(dec, str)) err = true;
537 list = tcxmlbreak("<abc de=\"foo&\" gh='<bar>'>xyz<br>\na<!--<mikio>--></abc>");
538 for(int j = 0; j < tclistnum(list); j++){
539 const char *elem = tclistval2(list, j);
540 TCMAP *attrs = tcxmlattrs(elem);
546 for(int16_t j = 1; j <= 0x2000; j *= 2){
547 for(int16_t num = j - 1; num <= j + 1; num++){
548 int16_t nnum = TCHTOIS(num);
549 if(num != TCITOHS(nnum)) err = true;
552 for(int32_t j = 1; j <= 0x20000000; j *= 2){
553 for(int32_t num = j - 1; num <= j + 1; num++){
554 int32_t nnum = TCHTOIL(num);
555 if(num != TCITOHL(nnum)) err = true;
556 char buf[TCNUMBUFSIZ];
558 TCSETVNUMBUF(step, buf, num);
559 TCREADVNUMBUF(buf, nnum, nstep);
560 if(num != nnum || step != nstep) err = true;
563 for(int64_t j = 1; j <= 0x2000000000000000; j *= 2){
564 for(int64_t num = j - 1; num <= j + 1; num++){
565 int64_t nnum = TCHTOILL(num);
566 if(num != TCITOHLL(nnum)) err = true;
567 char buf[TCNUMBUFSIZ];
569 TCSETVNUMBUF64(step, buf, num);
570 TCREADVNUMBUF64(buf, nnum, nstep);
571 if(num != nnum || step != nstep) err = true;
574 char *bitmap = TCBITMAPNEW(100);
575 for(int j = 0; j < 100; j++){
576 if(j % 3 == 0) TCBITMAPON(bitmap, j);
577 if(j % 5 == 0) TCBITMAPOFF(bitmap, j);
579 for(int j = 0; j < 100; j++){
581 if(TCBITMAPCHECK(bitmap, j)) err = true;
582 } else if(j % 3 == 0){
583 if(!TCBITMAPCHECK(bitmap, j)) err = true;
587 buf = tcmalloc(i / 8 + 2);
589 TCBITSTRMINITW(strm, buf);
590 for(int j = 0; j < i; j++){
591 int sign = j % 3 == 0 || j % 7 == 0;
592 TCBITSTRMCAT(strm, sign);
594 TCBITSTRMSETEND(strm);
595 int bnum = TCBITSTRMNUM(strm);
596 if(bnum != i) err = true;
597 TCBITSTRMINITR(strm, buf, bsiz);
598 for(int j = 0; j < i; j++){
600 TCBITSTRMREAD(strm, sign);
601 if(sign != (j % 3 == 0 || j % 7 == 0)) err = true;
605 if(rnum > 250 && i % (rnum / 250) == 0){
608 if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
611 iprintf("time: %.3f\n", tctime() - stime);
613 iprintf("error\n\n");
621 /* perform wicked command */
622 static int procwicked(int rnum){
623 iprintf("<Wicked Writing Test>\n rnum=%d\n\n", rnum);
624 double stime = tctime();
625 TCMPOOL *mpool = tcmpoolglobal();
626 TCXSTR *xstr = myrand(2) > 0 ? tcxstrnew() : tcxstrnew2("hello world");
627 tcmpoolputxstr(mpool, xstr);
628 TCLIST *list = myrand(2) > 0 ? tclistnew() : tclistnew2(myrand(rnum) + rnum / 2);
629 tcmpoolputlist(mpool, list);
630 TCMAP *map = myrand(2) > 0 ? tcmapnew() : tcmapnew2(myrand(rnum) + rnum / 2);
631 tcmpoolputmap(mpool, map);
632 TCMDB *mdb = myrand(2) > 0 ? tcmdbnew() : tcmdbnew2(myrand(rnum) + rnum / 2);
633 tcmpoolput(mpool, mdb, (void (*)(void*))tcmdbdel);
634 for(int i = 1; i <= rnum; i++){
635 char kbuf[RECBUFSIZ];
636 int ksiz = sprintf(kbuf, "%d", myrand(i));
637 char vbuf[RECBUFSIZ];
638 int vsiz = sprintf(vbuf, "%d", myrand(i));
643 tcxstrcat(xstr, kbuf, ksiz);
647 tcxstrcat2(xstr, kbuf);
651 if(myrand(rnum / 100 + 1) == 0) tcxstrclear(xstr);
655 tcxstrprintf(xstr, "[%s:%d]", kbuf, i);
659 tclistpush(list, kbuf, ksiz);
663 tclistpush2(list, kbuf);
667 tmp = tcmemdup(kbuf, ksiz);
668 tclistpushmalloc(list, tmp, strlen(tmp));
672 if(myrand(10) == 0) free(tclistpop(list, &ksiz));
676 if(myrand(10) == 0) free(tclistpop2(list));
680 tclistunshift(list, kbuf, ksiz);
684 tclistunshift2(list, kbuf);
688 if(myrand(10) == 0) free(tclistshift(list, &ksiz));
692 if(myrand(10) == 0) free(tclistshift2(list));
696 tclistinsert(list, i / 10, kbuf, ksiz);
700 tclistinsert2(list, i / 10, kbuf);
704 if(myrand(10) == 0) free(tclistremove(list, i / 10, &ksiz));
708 if(myrand(10) == 0) free(tclistremove2(list, i / 10));
712 tclistover(list, i / 10, kbuf, ksiz);
716 tclistover2(list, i / 10, kbuf);
720 if(myrand(rnum / 1000 + 1) == 0) tclistsort(list);
724 if(myrand(rnum / 1000 + 1) == 0) tclistsortci(list);
728 if(myrand(rnum / 1000 + 1) == 0) tclistlsearch(list, kbuf, ksiz);
732 if(myrand(rnum / 1000 + 1) == 0) tclistbsearch(list, kbuf, ksiz);
736 if(myrand(rnum / 100 + 1) == 0) tclistclear(list);
740 if(myrand(rnum / 100 + 1) == 0){
742 char *dbuf = tclistdump(list, &dsiz);
743 tclistdel(tclistload(dbuf, dsiz));
749 if(myrand(100) == 0){
751 for(int j = 0; j < tclistnum(list); j++){
753 tclistval(list, j, &rsiz);
756 for(int j = 0; j < tclistnum(list); j++){
764 tcmapput(map, kbuf, ksiz, vbuf, vsiz);
768 tcmapput2(map, kbuf, vbuf);
772 tcmapput3(map, kbuf, ksiz, vbuf, vsiz, vbuf, vsiz);
776 tcmapputkeep(map, kbuf, ksiz, vbuf, vsiz);
780 tcmapputkeep2(map, kbuf, vbuf);
784 tcmapputcat(map, kbuf, ksiz, vbuf, vsiz);
788 tcmapputcat2(map, kbuf, vbuf);
792 if(myrand(10) == 0) tcmapout(map, kbuf, ksiz);
796 if(myrand(10) == 0) tcmapout2(map, kbuf);
800 tcmapget3(map, kbuf, ksiz, &vsiz);
804 tcmapmove(map, kbuf, ksiz, true);
808 tcmapmove(map, kbuf, ksiz, false);
812 tcmapmove2(map, kbuf, true);
816 if(myrand(100) == 0) tcmapiterinit(map);
820 tcmapiternext(map, &vsiz);
828 if(myrand(100) == 0){
830 tclistdel(tcmapkeys(map));
832 tclistdel(tcmapvals(map));
838 if(myrand(rnum / 100 + 1) == 0) tcmapclear(map);
842 if(myrand(20) == 0) tcmapcutfront(map, myrand(10));
846 if(myrand(rnum / 100 + 1) == 0){
848 char *dbuf = tcmapdump(map, &dsiz);
849 free(tcmaploadone(dbuf, dsiz, kbuf, ksiz, &vsiz));
850 tcmapdel(tcmapload(dbuf, dsiz));
856 tcmdbput(mdb, kbuf, ksiz, vbuf, vsiz);
860 tcmdbput2(mdb, kbuf, vbuf);
864 tcmdbputkeep(mdb, kbuf, ksiz, vbuf, vsiz);
868 tcmdbputkeep2(mdb, kbuf, vbuf);
872 tcmdbputcat(mdb, kbuf, ksiz, vbuf, vsiz);
876 tcmdbputcat2(mdb, kbuf, vbuf);
880 if(myrand(10) == 0) tcmdbout(mdb, kbuf, ksiz);
884 if(myrand(10) == 0) tcmdbout2(mdb, kbuf);
888 free(tcmdbget(mdb, kbuf, ksiz, &vsiz));
892 free(tcmdbget3(mdb, kbuf, ksiz, &vsiz));
896 if(myrand(100) == 0) tcmdbiterinit(mdb);
900 free(tcmdbiternext(mdb, &vsiz));
904 tmp = tcmdbiternext2(mdb);
909 if(myrand(rnum / 100 + 1) == 0) tcmdbvanish(mdb);
913 if(myrand(200) == 0) tcmdbcutfront(mdb, myrand(100));
917 if(myrand(100) == 0) tcmpoolmalloc(mpool, 1);
921 if(myrand(100) == 0) tcmpoolxstrnew(mpool);
925 if(myrand(100) == 0) tcmpoollistnew(mpool);
929 if(myrand(100) == 0) tcmpoolmapnew(mpool);
933 if(myrand(10000) == 0) srand((unsigned int)(tctime() * 1000) % UINT_MAX);
936 if(i % 50 == 0) iprintf(" (%08d)\n", i);
938 if(rnum % 50 > 0) iprintf(" (%08d)\n", rnum);
939 iprintf("time: %.3f\n", tctime() - stime);