home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c006 / 1.ddi / PUTBTREE.C / CBTREE / LIBRARY / PUTBTREE.C
Encoding:
C/C++ Source or Header  |  1987-11-06  |  3.3 KB  |  110 lines

  1. /* (C) Copyright 1984,85,86,87 Walter L. Peacock   All Rights Reserved    */
  2. /* p u t b t r e e . c       9/15/84                 */
  3.  
  4. /*---------------------------------------------------------------------------- 
  5.  * putroot() will write the B+tree root pointer value to disk.
  6.  *---------------------------------------------------------------------------*/
  7.  
  8. #include "cbtree.h"
  9.  
  10. void putroot(fd, rootptr, ptrloc)   /* put btree root record   */
  11. int fd;
  12. long rootptr;
  13. long ptrloc;
  14. {
  15.    extern long lseek();
  16.  
  17.    if (lseek(fd, ptrloc, 0) == -1L)
  18.       ckerror(- CK_SEEK, "63");
  19.    if (write(fd, (char *)&rootptr, sizeof(long)) == ERR)
  20.       ckerror(- CK_WRIT, "64");
  21. }
  22.  
  23. /*---------------------------------------------------------------------------- 
  24.  * putidxr() will write the B+tree index record to disk.
  25.  *---------------------------------------------------------------------------*/
  26.  
  27. void putidxr(fd, recnum, idxblk, btcp) /* put btree index record   */
  28. int       fd;
  29. long      recnum;
  30. BTIDXBLK *idxblk;
  31. BTC      *btcp;   /* btcommo structure pointer */
  32. {
  33.    extern char *calloc();
  34.    extern char *keyadd();
  35.    extern void  free();
  36.    extern long  lseek();
  37.    char   *buff;
  38.    char   *cptr;
  39.    uword  *uptr;
  40.    long   *lptr;
  41.    uword   reclen = btcp->btidxlen;
  42.    register uword u;
  43.    register uword cellcnt;
  44.  
  45.    cellcnt = idxblk->cellicnt;   /* must be initialized separately for EC */
  46.    if ((buff = calloc(reclen + 1, SZCHAR)) == NULL)    /* main buffer */
  47.    {
  48.       printf("\nPUTBTREE.C:putidxr(): can't allocat %d bytes of memory.",
  49.             reclen + 1);
  50.       ckerror(- CK_NOMEM, "65");
  51.    }
  52.  
  53.    uptr = (uword *)buff;         /* do unsigned ints first */
  54.    *uptr++ = idxblk->blktype;
  55.    *uptr++ = idxblk->cellicnt;
  56. #if 0
  57. printf("\nPUTBTREE: *uptr (cellicnt) = %x", *(uptr-1));
  58. #endif
  59.    lptr = (long *)uptr;        /* now add longs */
  60.    *lptr++ = idxblk->fwdpage;
  61.    *lptr++ = idxblk->bwdpage;
  62. #if NOALIGN
  63.    cptr = (char *)(lptr + 1);              /* pointer is with key */
  64. #else
  65.    cptr = (char *)(lptr + idxblk->cellicnt);   /* all ptrs are together */
  66. #endif
  67.  
  68.    for (u = 0; u < cellcnt; ++u)
  69.    {
  70.       *lptr++ = idxblk->btpage[u].btptr;
  71. #if NOALIGN
  72.       lptr = (long *)((char *)lptr + strlen(idxblk->btpage[u].skeynme) + 1);    /* skip over key */
  73. #endif
  74.       cptr = keyadd(cptr, idxblk->btpage[u].skeynme); /* like strcpy() */
  75. #if NOALIGN
  76.       cptr += sizeof(long);                     /* skip over ptr */
  77. #endif
  78.       if ((cptr - buff) - sizeof(long) > reclen - 2)
  79.             ckerror(- CK_INDX, "43");
  80.    }
  81.    buff[reclen - 2] = '\r';
  82.    buff[reclen - 1] = '\n';
  83.  
  84.    if (btseek(fd, recnum, reclen) == -1L)
  85.       ckerror(- CK_SEEK, "66");
  86.    if (write(fd, buff, (int)reclen) == ERR)
  87.       ckerror(- CK_WRIT, "67");
  88.    FREE(buff);
  89. }
  90.  
  91.  
  92. char *keyadd(dst, src)    /* like strcpy() but returns FOLLOWING s */
  93. char *dst;
  94. char *src;
  95. {
  96.    register char *d;
  97.    register char *s;
  98.  
  99.    for (d = dst, s = src; (*d++ = *s++) != NUL; )
  100.       ;
  101.    return (d);  /* location of NEXT string to copy */
  102. }
  103.  
  104.  
  105. /* (C) Copyright 1984 Walter L. Peacock   All Rights Reserved    11/05/84 */
  106.  
  107. /* THIS PROGRAM BELONGS TO WALTER L. PEACOCK.  IT IS CONSIDERED A TRADE */
  108. /* SECRET AND IS NOT TO BE DIVULGED OR USED BY PARTIES WHO HAVE NOT    */
  109. /* RECEIVED WRITTEN AUTHORIZATION FROM THE OWNER.                   */
  110.