home *** CD-ROM | disk | FTP | other *** search
- /* (C) Copyright 1984,85,86,87 Walter L. Peacock All Rights Reserved */
- /* p u t b t r e e . c 9/15/84 */
-
- /*----------------------------------------------------------------------------
- * putroot() will write the B+tree root pointer value to disk.
- *---------------------------------------------------------------------------*/
-
- #include "cbtree.h"
-
- void putroot(fd, rootptr, ptrloc) /* put btree root record */
- int fd;
- long rootptr;
- long ptrloc;
- {
- extern long lseek();
-
- if (lseek(fd, ptrloc, 0) == -1L)
- ckerror(- CK_SEEK, "63");
- if (write(fd, (char *)&rootptr, sizeof(long)) == ERR)
- ckerror(- CK_WRIT, "64");
- }
-
- /*----------------------------------------------------------------------------
- * putidxr() will write the B+tree index record to disk.
- *---------------------------------------------------------------------------*/
-
- void putidxr(fd, recnum, idxblk, btcp) /* put btree index record */
- int fd;
- long recnum;
- BTIDXBLK *idxblk;
- BTC *btcp; /* btcommo structure pointer */
- {
- extern char *calloc();
- extern char *keyadd();
- extern void free();
- extern long lseek();
- char *buff;
- char *cptr;
- uword *uptr;
- long *lptr;
- uword reclen = btcp->btidxlen;
- register uword u;
- register uword cellcnt;
-
- cellcnt = idxblk->cellicnt; /* must be initialized separately for EC */
- if ((buff = calloc(reclen + 1, SZCHAR)) == NULL) /* main buffer */
- {
- printf("\nPUTBTREE.C:putidxr(): can't allocat %d bytes of memory.",
- reclen + 1);
- ckerror(- CK_NOMEM, "65");
- }
-
- uptr = (uword *)buff; /* do unsigned ints first */
- *uptr++ = idxblk->blktype;
- *uptr++ = idxblk->cellicnt;
- #if 0
- printf("\nPUTBTREE: *uptr (cellicnt) = %x", *(uptr-1));
- #endif
- lptr = (long *)uptr; /* now add longs */
- *lptr++ = idxblk->fwdpage;
- *lptr++ = idxblk->bwdpage;
- #if NOALIGN
- cptr = (char *)(lptr + 1); /* pointer is with key */
- #else
- cptr = (char *)(lptr + idxblk->cellicnt); /* all ptrs are together */
- #endif
-
- for (u = 0; u < cellcnt; ++u)
- {
- *lptr++ = idxblk->btpage[u].btptr;
- #if NOALIGN
- lptr = (long *)((char *)lptr + strlen(idxblk->btpage[u].skeynme) + 1); /* skip over key */
- #endif
- cptr = keyadd(cptr, idxblk->btpage[u].skeynme); /* like strcpy() */
- #if NOALIGN
- cptr += sizeof(long); /* skip over ptr */
- #endif
- if ((cptr - buff) - sizeof(long) > reclen - 2)
- ckerror(- CK_INDX, "43");
- }
- buff[reclen - 2] = '\r';
- buff[reclen - 1] = '\n';
-
- if (btseek(fd, recnum, reclen) == -1L)
- ckerror(- CK_SEEK, "66");
- if (write(fd, buff, (int)reclen) == ERR)
- ckerror(- CK_WRIT, "67");
- FREE(buff);
- }
-
-
- char *keyadd(dst, src) /* like strcpy() but returns FOLLOWING s */
- char *dst;
- char *src;
- {
- register char *d;
- register char *s;
-
- for (d = dst, s = src; (*d++ = *s++) != NUL; )
- ;
- return (d); /* location of NEXT string to copy */
- }
-
-
- /* (C) Copyright 1984 Walter L. Peacock All Rights Reserved 11/05/84 */
-
- /* THIS PROGRAM BELONGS TO WALTER L. PEACOCK. IT IS CONSIDERED A TRADE */
- /* SECRET AND IS NOT TO BE DIVULGED OR USED BY PARTIES WHO HAVE NOT */
- /* RECEIVED WRITTEN AUTHORIZATION FROM THE OWNER. */
-