cdbstats.c
author "Tomas Zeman <tomas.zeman@sun.com>"
Fri, 19 Oct 2007 11:01:15 +0200
changeset 0 eeadadee24f6
permissions -rw-r--r--
Imported cdb-0.75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     1
#include "uint32.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     2
#include "fmt.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     3
#include "buffer.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     4
#include "strerr.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     5
#include "seek.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     6
#include "cdb.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     7
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     8
#define FATAL "cdbstats: fatal: "
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     9
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    10
void die_read(void)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    11
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    12
  strerr_die2sys(111,FATAL,"unable to read input: ");
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    13
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    14
void die_readformat(void)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    15
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    16
  strerr_die2x(111,FATAL,"unable to read input: truncated file");
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    17
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    18
void die_write(void)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    19
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    20
  strerr_die2sys(111,FATAL,"unable to write output: ");
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    21
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    22
void put(char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    23
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    24
  if (buffer_put(buffer_1small,buf,len) == -1) die_write();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    25
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    26
void putflush(void)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    27
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    28
  if (buffer_flush(buffer_1small) == -1) die_write();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    29
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    30
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    31
uint32 pos = 0;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    32
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    33
void get(char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    34
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    35
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    36
  while (len > 0) {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    37
    r = buffer_get(buffer_0,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    38
    if (r == -1) die_read();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    39
    if (r == 0) die_readformat();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    40
    pos += r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    41
    buf += r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    42
    len -= r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    43
  }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    44
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    45
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    46
void getnum(uint32 *num)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    47
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    48
  char buf[4];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    49
  get(buf,4);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    50
  uint32_unpack(buf,num);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    51
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    52
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    53
char strnum[FMT_ULONG];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    54
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    55
void putnum(char *label,unsigned long count)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    56
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    57
  unsigned int i;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    58
  put(label,str_len(label));
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    59
  for (i = fmt_ulong(0,count);i < 10;++i) put(" ",1);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    60
  put(strnum,fmt_ulong(strnum,count));
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    61
  put("\n",1);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    62
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    63
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    64
char key[1024];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    65
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    66
static struct cdb c;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    67
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    68
static unsigned long numrecords;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    69
static unsigned long numd[11];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    70
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    71
main()
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    72
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    73
  uint32 eod;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    74
  uint32 klen;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    75
  uint32 dlen;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    76
  seek_pos rest;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    77
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    78
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    79
  cdb_init(&c,0);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    80
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    81
  getnum(&eod);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    82
  while (pos < 2048) getnum(&dlen);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    83
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    84
  while (pos < eod) {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    85
    getnum(&klen);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    86
    getnum(&dlen);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    87
    if (klen > sizeof key) {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    88
      while (klen) { get(key,1); --klen; }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    89
    }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    90
    else {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    91
      get(key,klen);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    92
      rest = seek_cur(0);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    93
      cdb_findstart(&c);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    94
      do {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    95
        switch(cdb_findnext(&c,key,klen)) {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    96
	  case -1: die_read();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    97
	  case 0: die_readformat();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    98
        }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    99
      } while (cdb_datapos(&c) != pos);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   100
      if (!c.loop) die_readformat();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   101
      ++numrecords;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   102
      if (c.loop > 10)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   103
	++numd[10];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   104
      else
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   105
	++numd[c.loop - 1];
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   106
      if (seek_set(0,rest) == -1) die_read();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   107
    }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   108
    while (dlen) { get(key,1); --dlen; }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   109
  }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   110
  
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   111
  putnum("records ",numrecords);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   112
  putnum("d0      ",numd[0]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   113
  putnum("d1      ",numd[1]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   114
  putnum("d2      ",numd[2]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   115
  putnum("d3      ",numd[3]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   116
  putnum("d4      ",numd[4]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   117
  putnum("d5      ",numd[5]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   118
  putnum("d6      ",numd[6]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   119
  putnum("d7      ",numd[7]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   120
  putnum("d8      ",numd[8]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   121
  putnum("d9      ",numd[9]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   122
  putnum(">9      ",numd[10]);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   123
  putflush();
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   124
  _exit(0);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
   125
}