+ newblock = 0;
+ pp->next = 0;
+
+ /* Four possibilities: */
+ if (prevpp!=0)
+ { /* 1: we have a prevpp that can go on the disk */
+ /* reduce pp, set next ptr, and store block */
+ /* set pp up as new last block, and remember the just */
+ /* filled as (pp) the new prev */
+ assert(pp!=firstpp);
+ isamh_reduceblock(is,pp,firstpp->numKeys);
+ prevpp->next=isamh_addr(pp->pos,pp->cat);
+ isamh_buildlaterblock(prevpp);
+ isamh_write_block(is,prevpp->cat,prevpp->pos,prevpp->buf);
+ if (pp->is->method->debug > 2)
+ logf(LOG_LOG,"isamh_append N1: Wrote prevpp (%d:%d) -> %d:%d",
+ prevpp->pos, prevpp->cat, pp->pos, pp->cat);
+ isamh_pp_close(prevpp); /* it's done its job */
+ prevpp = pp;
+ pp=isamh_pp_open(is,isamh_addr(0,maxcat)); /* start a large one */
+ pp->size=pp->offset=ISAMH_BLOCK_OFFSET_N ;
+ pp->next=0;
+ pp->lastblock=0;
+ }
+ else if ( (firstpp!=pp) && (firstpp->next != 0))
+ { /* 2: we are working at end of list, but have no prevpp */
+ /* some block (already on disk) points to pp */
+ /* set the newly filled block as prev, don't save yet */
+ /* allocate new pp */
+ if (pp->is->method->debug > 2)
+ logf(LOG_LOG,"isamh_append N2: set up a new prevpp (%d:%d)",
+ pp->pos, pp->cat);
+ prevpp = pp;
+ pp=isamh_pp_open(is,isamh_addr(0,maxcat)); /* start a large one */
+ pp->size=pp->offset=ISAMH_BLOCK_OFFSET_N ;
+ pp->next=0;
+ pp->lastblock=0;
+ }
+ else if ( (firstpp!=pp) && (firstpp->next==0))
+ { /* 3: we have earlier allocated pp as the second block */
+ /* reduce it to get its address. Set first->next to it */
+ /* move it to prevpp, and create a new pp */
+ isamh_reduceblock(is,pp,firstpp->numKeys);
+ firstpp->next=isamh_addr(pp->pos,pp->cat);
+ if (pp->is->method->debug > 2)
+ logf(LOG_LOG,"isamh_append N3: set up a new firstpp->next (%d:%d)",
+ pp->pos, pp->cat);
+ prevpp=pp;
+ pp=isamh_pp_open(is,isamh_addr(0,maxcat)); /* start a large one */
+ pp->size=pp->offset=ISAMH_BLOCK_OFFSET_N ;
+ pp->next=0;
+ pp->lastblock=0;