home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / ext / SDBM_File / sdbm / dba.c next >
C/C++ Source or Header  |  1999-07-20  |  1KB  |  88 lines

  1. /*
  2.  * dba    dbm analysis/recovery
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <sys/file.h>
  7. #include "EXTERN.h"
  8. #include "sdbm.h"
  9.  
  10. char *progname;
  11. extern void oops();
  12.  
  13. int
  14. main(int argc, char **argv)
  15. {
  16.     int n;
  17.     char *p;
  18.     char *name;
  19.     int pagf;
  20.  
  21.     progname = argv[0];
  22.  
  23.     if (p = argv[1]) {
  24.         name = (char *) malloc((n = strlen(p)) + 5);
  25.         if (!name)
  26.             oops("cannot get memory");
  27.  
  28.         strcpy(name, p);
  29.         strcpy(name + n, ".pag");
  30.  
  31.         if ((pagf = open(name, O_RDONLY)) < 0)
  32.             oops("cannot open %s.", name);
  33.  
  34.         sdump(pagf);
  35.     }
  36.     else
  37.         oops("usage: %s dbname", progname);
  38.  
  39.     return 0;
  40. }
  41.  
  42. void
  43. sdump(int pagf)
  44. {
  45.     register b;
  46.     register n = 0;
  47.     register t = 0;
  48.     register o = 0;
  49.     register e;
  50.     char pag[PBLKSIZ];
  51.  
  52.     while ((b = read(pagf, pag, PBLKSIZ)) > 0) {
  53.         printf("#%d: ", n);
  54.         if (!okpage(pag))
  55.             printf("bad\n");
  56.         else {
  57.             printf("ok. ");
  58.             if (!(e = pagestat(pag)))
  59.                 o++;
  60.             else
  61.                 t += e;
  62.         }
  63.         n++;
  64.     }
  65.  
  66.     if (b == 0)
  67.         printf("%d pages (%d holes):  %d entries\n", n, o, t);
  68.     else
  69.         oops("read failed: block %d", n);
  70. }
  71.  
  72. int
  73. pagestat(char *pag)
  74. {
  75.     register n;
  76.     register free;
  77.     register short *ino = (short *) pag;
  78.  
  79.     if (!(n = ino[0]))
  80.         printf("no entries.\n");
  81.     else {
  82.         free = ino[n] - (n + 1) * sizeof(short);
  83.         printf("%3d entries %2d%% used free %d.\n",
  84.                n / 2, ((PBLKSIZ - free) * 100) / PBLKSIZ, free);
  85.     }
  86.     return n / 2;
  87. }
  88.