home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c023 / 1.img / PROGRAMS / BTPRINT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-11-05  |  2.0 KB  |  83 lines

  1. /************************************************************************
  2.  *
  3.  * btprint.c   -- traverse and print a B+tree to given file stream
  4.  *
  5.  */
  6.  
  7. /* Note: btprint is a recursive function. */
  8.  
  9. #include <stdio.h>
  10. #include "cbtree.h"
  11.  
  12. #if AmigaDOS & LC
  13. #define printf   iprintf
  14. #define fprintf ifprintf
  15. #endif
  16.  
  17. void btprint(fdix, fpr, ptrloc, pwidth, btcp, idxprnt)
  18. int fdix;
  19. FILE *fpr;
  20. long ptrloc;
  21. int pwidth;
  22. BTC *btcp;
  23. int idxprnt;
  24. {
  25.    extern char *calloc();
  26.    extern void  prnode();
  27.    BTIDXBLK *pblk;
  28.    register int m;
  29.  
  30.    if( !(pblk = (BTIDXBLK *)calloc(sizeof(BTIDXBLK) + btcp->btcells *
  31.          sizeof(BTIDX), SZCHAR) ))
  32.       ckerror(- CK_NOMEM, "zz");
  33.    pblk->blkalloc = 0;
  34.  
  35.    getidxr(fdix, ptrloc, pblk, btcp->btidxlen, btcp->btkeylen);
  36.    printf("\nProcessing Index Node     %ld", ptrloc);
  37.  
  38.    if (pblk->blktype == 0){   /* INDEX node */
  39.  
  40.       if (idxprnt)
  41.          prnode(fpr, ptrloc, pblk, pwidth);   /* print this node */
  42.  
  43.       for (m = 0; m < pblk->cellicnt; m++)
  44.          btprint(fdix, fpr, pblk->btpage[m].btptr, pwidth, btcp, idxprnt);
  45.    }
  46.    else    /* LEAF node */
  47.       prnode(fpr, ptrloc, pblk, pwidth);
  48.  
  49.    freekeys(pblk);
  50.    FREE(pblk);
  51. }
  52.  
  53. void prnode(fpr, ptrloc, pblk, pwidth)
  54. FILE     *fpr;
  55. long      ptrloc;
  56. BTIDXBLK *pblk;
  57. int       pwidth;
  58. {
  59.    int m, fldlen, lncnt = 0;
  60.    char lbuff[13];
  61.  
  62.    fprintf(fpr,
  63.          "\n%s%ld  cells: %u fwdptr: %ld bwdptr: %ld  =========\n",
  64.          pblk->blktype ? "=========  Record number: " :
  65.                          "= INDEX =  Record number: " ,
  66.          ptrloc, pblk->cellicnt, pblk->fwdpage, pblk->bwdpage);
  67.  
  68.    for (m = 0; m < pblk->cellicnt; m++)
  69.    {
  70.       fldlen = strlen(pblk->btpage[m].skeynme) +
  71.                bt_ltoa( (long) pblk->btpage[m].btptr, lbuff) + 7;
  72.       if( (lncnt + fldlen) > pwidth ){
  73.          lncnt = 0;
  74.          fprintf(fpr,"\n");
  75.       }
  76.  
  77.       lncnt += fldlen;
  78.       fprintf(fpr, "[ %s %ld] ", pblk->btpage[m].skeynme,
  79.             pblk->btpage[m].btptr);
  80.    }
  81.    fprintf(fpr,"\n");
  82. }
  83.