home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- *
- * btprint.c -- traverse and print a B+tree to given file stream
- *
- */
-
- /* Note: btprint is a recursive function. */
-
- #include <stdio.h>
- #include "cbtree.h"
-
- #if AmigaDOS & LC
- #define printf iprintf
- #define fprintf ifprintf
- #endif
-
- void btprint(fdix, fpr, ptrloc, pwidth, btcp, idxprnt)
- int fdix;
- FILE *fpr;
- long ptrloc;
- int pwidth;
- BTC *btcp;
- int idxprnt;
- {
- extern char *calloc();
- extern void prnode();
- BTIDXBLK *pblk;
- register int m;
-
- if( !(pblk = (BTIDXBLK *)calloc(sizeof(BTIDXBLK) + btcp->btcells *
- sizeof(BTIDX), SZCHAR) ))
- ckerror(- CK_NOMEM, "zz");
- pblk->blkalloc = 0;
-
- getidxr(fdix, ptrloc, pblk, btcp->btidxlen, btcp->btkeylen);
- printf("\nProcessing Index Node %ld", ptrloc);
-
- if (pblk->blktype == 0){ /* INDEX node */
-
- if (idxprnt)
- prnode(fpr, ptrloc, pblk, pwidth); /* print this node */
-
- for (m = 0; m < pblk->cellicnt; m++)
- btprint(fdix, fpr, pblk->btpage[m].btptr, pwidth, btcp, idxprnt);
- }
- else /* LEAF node */
- prnode(fpr, ptrloc, pblk, pwidth);
-
- freekeys(pblk);
- FREE(pblk);
- }
-
- void prnode(fpr, ptrloc, pblk, pwidth)
- FILE *fpr;
- long ptrloc;
- BTIDXBLK *pblk;
- int pwidth;
- {
- int m, fldlen, lncnt = 0;
- char lbuff[13];
-
- fprintf(fpr,
- "\n%s%ld cells: %u fwdptr: %ld bwdptr: %ld =========\n",
- pblk->blktype ? "========= Record number: " :
- "= INDEX = Record number: " ,
- ptrloc, pblk->cellicnt, pblk->fwdpage, pblk->bwdpage);
-
- for (m = 0; m < pblk->cellicnt; m++)
- {
- fldlen = strlen(pblk->btpage[m].skeynme) +
- bt_ltoa( (long) pblk->btpage[m].btptr, lbuff) + 7;
- if( (lncnt + fldlen) > pwidth ){
- lncnt = 0;
- fprintf(fpr,"\n");
- }
-
- lncnt += fldlen;
- fprintf(fpr, "[ %s %ld] ", pblk->btpage[m].skeynme,
- pblk->btpage[m].btptr);
- }
- fprintf(fpr,"\n");
- }