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

  1. /*
  2.  * dbd - dump a dbm data file
  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.  
  14. #define empty(page)    (((short *) page)[0] == 0)
  15.  
  16. int
  17. main(int argc, char **argv)
  18. {
  19.     int n;
  20.     char *p;
  21.     char *name;
  22.     int pagf;
  23.  
  24.     progname = argv[0];
  25.  
  26.     if (p = argv[1]) {
  27.         name = (char *) malloc((n = strlen(p)) + 5);
  28.         if (!name)
  29.             oops("cannot get memory");
  30.  
  31.         strcpy(name, p);
  32.         strcpy(name + n, ".pag");
  33.  
  34.         if ((pagf = open(name, O_RDONLY)) < 0)
  35.             oops("cannot open %s.", name);
  36.  
  37.         sdump(pagf);
  38.     }
  39.     else
  40.         oops("usage: %s dbname", progname);
  41.     return 0;
  42. }
  43.  
  44. void
  45. sdump(int pagf)
  46. {
  47.     register r;
  48.     register n = 0;
  49.     register o = 0;
  50.     char pag[PBLKSIZ];
  51.  
  52.     while ((r = read(pagf, pag, PBLKSIZ)) > 0) {
  53.         if (!okpage(pag))
  54.             fprintf(stderr, "%d: bad page.\n", n);
  55.         else if (empty(pag))
  56.             o++;
  57.         else
  58.             dispage(pag);
  59.         n++;
  60.     }
  61.  
  62.     if (r == 0)
  63.         fprintf(stderr, "%d pages (%d holes).\n", n, o);
  64.     else
  65.         oops("read failed: block %d", n);
  66. }
  67.  
  68.  
  69. #ifdef OLD
  70. int
  71. dispage(char *pag)
  72. {
  73.     register i, n;
  74.     register off;
  75.     register short *ino = (short *) pag;
  76.  
  77.     off = PBLKSIZ;
  78.     for (i = 1; i < ino[0]; i += 2) {
  79.         printf("\t[%d]: ", ino[i]);
  80.         for (n = ino[i]; n < off; n++)
  81.             putchar(pag[n]);
  82.         putchar(' ');
  83.         off = ino[i];
  84.         printf("[%d]: ", ino[i + 1]);
  85.         for (n = ino[i + 1]; n < off; n++)
  86.             putchar(pag[n]);
  87.         off = ino[i + 1];
  88.         putchar('\n');
  89.     }
  90. }
  91. #else
  92. void
  93. dispage(char *pag)
  94. {
  95.     register i, n;
  96.     register off;
  97.     register short *ino = (short *) pag;
  98.  
  99.     off = PBLKSIZ;
  100.     for (i = 1; i < ino[0]; i += 2) {
  101.         for (n = ino[i]; n < off; n++)
  102.             if (pag[n] != 0)
  103.                 putchar(pag[n]);
  104.         putchar('\t');
  105.         off = ino[i];
  106.         for (n = ino[i + 1]; n < off; n++)
  107.             if (pag[n] != 0)
  108.                 putchar(pag[n]);
  109.         putchar('\n');
  110.         off = ino[i + 1];
  111.     }
  112. }
  113. #endif
  114.