home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / perl / Perl / ext / SDBM_File / sdbm / dba.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-18  |  1.2 KB  |  85 lines

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