cdbtest.c
changeset 0 eeadadee24f6
equal deleted inserted replaced
-1:000000000000 0:eeadadee24f6
       
     1 #include "uint32.h"
       
     2 #include "fmt.h"
       
     3 #include "buffer.h"
       
     4 #include "strerr.h"
       
     5 #include "seek.h"
       
     6 #include "cdb.h"
       
     7 
       
     8 #define FATAL "cdbtest: fatal: "
       
     9 
       
    10 void die_read(void)
       
    11 {
       
    12   strerr_die2sys(111,FATAL,"unable to read input: ");
       
    13 }
       
    14 void die_write(void)
       
    15 {
       
    16   strerr_die2sys(111,FATAL,"unable to write output: ");
       
    17 }
       
    18 void put(char *buf,unsigned int len)
       
    19 {
       
    20   if (buffer_put(buffer_1small,buf,len) == -1) die_write();
       
    21 }
       
    22 void putflush(void)
       
    23 {
       
    24   if (buffer_flush(buffer_1small) == -1) die_write();
       
    25 }
       
    26 
       
    27 uint32 pos = 0;
       
    28 
       
    29 void get(char *buf,unsigned int len)
       
    30 {
       
    31   int r;
       
    32   while (len > 0) {
       
    33     r = buffer_get(buffer_0,buf,len);
       
    34     if (r == -1) die_read();
       
    35     if (r == 0)
       
    36       strerr_die2x(111,FATAL,"unable to read input: truncated file");
       
    37     pos += r;
       
    38     buf += r;
       
    39     len -= r;
       
    40   }
       
    41 }
       
    42 
       
    43 void getnum(uint32 *num)
       
    44 {
       
    45   char buf[4];
       
    46   get(buf,4);
       
    47   uint32_unpack(buf,num);
       
    48 }
       
    49 
       
    50 char strnum[FMT_ULONG];
       
    51 
       
    52 void putnum(char *label,unsigned long count)
       
    53 {
       
    54   put(label,str_len(label));
       
    55   put(strnum,fmt_ulong(strnum,count));
       
    56   put("\n",1);
       
    57 }
       
    58 
       
    59 char key[1024];
       
    60 
       
    61 unsigned long numuntested = 0;
       
    62 unsigned long numnotfound = 0;
       
    63 unsigned long numotherpos = 0;
       
    64 unsigned long numbadlen = 0;
       
    65 unsigned long numfound = 0;
       
    66 
       
    67 static struct cdb c;
       
    68 
       
    69 main()
       
    70 {
       
    71   uint32 eod;
       
    72   uint32 klen;
       
    73   uint32 dlen;
       
    74   seek_pos rest;
       
    75   int r;
       
    76 
       
    77   cdb_init(&c,0);
       
    78 
       
    79   getnum(&eod);
       
    80   while (pos < 2048) getnum(&dlen);
       
    81 
       
    82   while (pos < eod) {
       
    83     getnum(&klen);
       
    84     getnum(&dlen);
       
    85     if (klen > sizeof key) {
       
    86       ++numuntested;
       
    87       while (klen) { get(key,1); --klen; }
       
    88     }
       
    89     else {
       
    90       get(key,klen);
       
    91       rest = seek_cur(0);
       
    92       switch(cdb_find(&c,key,klen)) {
       
    93 	case -1:
       
    94 	  die_read();
       
    95 	case 0:
       
    96 	  ++numnotfound;
       
    97 	  break;
       
    98 	default:
       
    99 	  if (cdb_datapos(&c) != pos)
       
   100 	    ++numotherpos;
       
   101 	  else
       
   102 	    if (cdb_datalen(&c) != dlen)
       
   103 	      ++numbadlen;
       
   104 	    else
       
   105 	      ++numfound;
       
   106       }
       
   107       if (seek_set(0,rest) == -1) die_read();
       
   108     }
       
   109     while (dlen) { get(key,1); --dlen; }
       
   110   }
       
   111   
       
   112   putnum("found: ",numfound);
       
   113   putnum("different record: ",numotherpos);
       
   114   putnum("bad length: ",numbadlen);
       
   115   putnum("not found: ",numnotfound);
       
   116   putnum("untested: ",numuntested);
       
   117   putflush();
       
   118   _exit(0);
       
   119 }