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

  1. /*
  2.  * dbd - dump a dbm data file
  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.  
  13. #define empty(page)    (((short *) page)[0] == 0)
  14.  
  15. int
  16. main(argc, argv)
  17. 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.         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.     return 0;
  39. }
  40.  
  41. sdump(pagf)
  42. int pagf;
  43. {
  44.     register r;
  45.     register n = 0;
  46.     register o = 0;
  47.     char pag[PBLKSIZ];
  48.  
  49.     while ((r = read(pagf, pag, PBLKSIZ)) > 0) {
  50.         if (!okpage(pag))
  51.             fprintf(stderr, "%d: bad page.\n", n);
  52.         else if (empty(pag))
  53.             o++;
  54.         else
  55.             dispage(pag);
  56.         n++;
  57.     }
  58.  
  59.     if (r == 0)
  60.         fprintf(stderr, "%d pages (%d holes).\n", n, o);
  61.     else
  62.         oops("read failed: block %d", n);
  63. }
  64.  
  65.  
  66. #ifdef OLD
  67. dispage(pag)
  68. char *pag;
  69. {
  70.     register i, n;
  71.     register off;
  72.     register short *ino = (short *) pag;
  73.  
  74.     off = PBLKSIZ;
  75.     for (i = 1; i < ino[0]; i += 2) {
  76.         printf("\t[%d]: ", ino[i]);
  77.         for (n = ino[i]; n < off; n++)
  78.             putchar(pag[n]);
  79.         putchar(' ');
  80.         off = ino[i];
  81.         printf("[%d]: ", ino[i + 1]);
  82.         for (n = ino[i + 1]; n < off; n++)
  83.             putchar(pag[n]);
  84.         off = ino[i + 1];
  85.         putchar('\n');
  86.     }
  87. }
  88. #else
  89. dispage(pag)
  90. char *pag;
  91. {
  92.     register i, n;
  93.     register off;
  94.     register short *ino = (short *) pag;
  95.  
  96.     off = PBLKSIZ;
  97.     for (i = 1; i < ino[0]; i += 2) {
  98.         for (n = ino[i]; n < off; n++)
  99.             if (pag[n] != 0)
  100.                 putchar(pag[n]);
  101.         putchar('\t');
  102.         off = ino[i];
  103.         for (n = ino[i + 1]; n < off; n++)
  104.             if (pag[n] != 0)
  105.                 putchar(pag[n]);
  106.         putchar('\n');
  107.         off = ino[i + 1];
  108.     }
  109. }
  110. #endif
  111.