#include <sys/types.h> #include <stdio.h> #include "btconf.h" #include "btree.h" #include "btintern.h" /* (C) Copyright, 1988, 1989 Marcus J. Ranum All rights reserved This software, its documentation, and supporting files are copyrighted material and may only be distributed in accordance with the terms listed in the COPYRIGHT document. $Log: btgoto.c,v $ * Revision 1.1 90/06/08 16:11:45 mjr * * * Revision 1.1 90/06/06 15:03:43 mjr * * * Revision 1.1 90/06/03 16:23:09 mjr * * * Revision 1.1 90/05/18 23:20:36 mjr * * * Revision 1.1 90/05/15 13:18:29 mjr * Initial revision * * Revision 1.1 90/05/05 15:04:34 mjr * Initial revision * * Revision 1.1 90/03/23 15:03:42 mjr * Initial revision * */ #ifndef lint static char *rcsid = "$Header: /atreus/mjr/hacks/mud/btlib/RCS/btgoto.c,v 1.1 90/06/08 16:11:45 mjr Exp $"; #endif extern char *realloc(); bt_goto(b,d) BT_INDEX *b; int d; { int l = 0; struct bt_cache *p; b->stack[0].pg = b->sblk.root; while(1) { if((p = bt_rpage(b,b->stack[l].pg)) == NULL) return(BT_ERR); /* dynamically deal w/ stack overruns */ if(l == b->shih - 2) { b->shih += 3; b->stack = (struct bt_stack *)realloc((char *)b->stack,(unsigned)(b->shih * sizeof(struct bt_stack))); if(b->stack == NULL) return(BT_ERR); } /* set the key to be one AFTER or BEFORE the real */ /* end of the tree. we preincrement keys when doing */ /* next so this is OK to do, though a bit hokey */ if(HIPT(p->p) == BT_NULL) { b->cpag = p->num; if(d == BT_EOF) b->cky = KEYCNT(p->p); else b->cky = -1; /* mark all as well with tree */ bt_clearerr(b); return(BT_OK); } /* have not yet hit a leaf - go high or low, as approp. */ if(d == BT_EOF || KEYCNT(p->p) == 0) { b->stack[++l].pg = HIPT(p->p); } else { b->stack[++l].pg = *(off_t *)KEYCLD(p->p); } } }