home *** CD-ROM | disk | FTP | other *** search
- /*
- * rebuild support routines
- *
- * This program is the CONFIDENTIAL and PROPRIETARY property
- * of FairCom(R) Corporation. Any unauthorized use, reproduction or
- * transfer of this program is strictly prohibited.
- *
- * Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989 FairCom Corporation
- * (Subject to limited distribution and
- * restricted disclosure only.)
- * *** ALL RIGHTS RESERVED ***
- *
- * 4006 West Broadway
- * Columbia, MO 65203
- *
- *
- * c-tree(R) Version 4.3
- * Release C
- * February 7, 1989 17:30
- *
- */
-
- /*
- * To disable interactive rebuild prompts and/or to suppress normal
- * rebuild output, "comment out" one or both of the following
- * defines:
- */
-
- #define RB_INTERACTIVE
- #define RB_OUTPUT
-
- /*
- * To disable the index entry count as described in Section 6.2,
- * add the following #define to the CTOPTN.H module before compiling:
- *
- * #define NO_IDXENT
- *
- */
-
-
- #include "ctstdr.h" /* standard i/o header */
- #include "ctoptn.h" /* c-tree configuration options */
- #include "cterrc.h" /* c-tree error codes */
- #include "ctstrc.h" /* c-tree data structures */
- #include "ctgvar.h" /* c-tree global variables */
- #include "ctisam.h" /* c-tree isam header */
- #include "ctvrec.h" /* variable length header */
-
- TEXT *ct_rbuf;
- POINTER *ct_pbuf;
- COUNT rerr_cod,rerr_fil,ct_fp,ct_redom;
- VRLEN ct_bsz;
- LONG ct_spc;
-
- #ifdef FPUTFGET
-
- COUNT RBLDAT(datno,datnam,datlen,xtdsiz,filemd)
- COUNT datno; /* data number temporary assigned to file */
- TEXT *datnam; /* pointer to file name */
- COUNT datlen; /* data record length */
- UCOUNT xtdsiz; /* file chunk size */
- COUNT filemd; /* file mode parameter */
- {
- printf(
- "\nCTRBL2 should not be compiled with the FPUTFGET option!\n");
- exit(2);
- }
-
- COUNT RBLIDX(datno,datname,idxname,keyno,klen,ktyp,dflg,nomemb,xtdsiz,filemd)
- COUNT datno;
- TEXT *datname,*idxname;
- COUNT keyno,klen,ktyp,dflg,nomemb;
- UCOUNT xtdsiz;
- COUNT filemd;
- {
- exit(2);
- }
- COUNT RBLMEM(datno,datname,idxname,keyno,klen,ktyp,dflg,membno)
- COUNT datno;
- TEXT *datname,*idxname;
- COUNT keyno,klen,ktyp,dflg,membno;
- {
- exit(2);
- }
-
- #else
-
- LOCAL COUNT redo_dat,redo_idx,slen;
- LOCAL COUNT fhdr,all_idx,duprej;
- LOCAL COUNT *lbuf;
- LOCAL TEXT lenkey[VARI_LEN],lastky[MAXLEN];
- LOCAL TEXT *kbuf;
- LOCAL KEYFILE *snum;
- LOCAL COUNT srtlev,maxsrt;
-
- TEXT *mballc();
- RNDFILE mbopen();
- COUNT compar(),ctio(),redhdr(),wrthdr(),mbclos(),frmkey();
- COUNT getintr(),getdatr(),getidxr(),getambr(),uerr();
- COUNT ADDKEY(),CREIDX(),OPNFIL(),CLSFIL(),CREMEM(),REDREC();
-
- #ifndef NO_IDXENT
- POINTER IDXENT();
- #endif
-
- #ifdef VARLDATA
- COUNT frmlkey(),getvhdr(),putvhdr();
- #else
- #define VS1 "\n\nAttempt to rebuild variable record length data file."
- #define VS2 "\nCTRBLD.C compiled with variable length data disabled."
- #define VS3 "\nRecompile with VARLDATA defined in CTOPTN.H\n"
- #endif
-
- COUNT rerr(err_cod,file_no)
-
- COUNT err_cod;
- COUNT file_no;
-
- {
- rerr_fil = file_no;
- return(rerr_cod = err_cod);
- }
-
- COUNT yesno()
- {
- #ifdef RB_INTERACTIVE
- for (;;) {
- gets(ct_buf);
- switch (ct_buf[0]) {
- case 'y':
- case 'Y':
- return(YES);
- case 'n':
- case 'N':
- return(NO);
- default:
- ct_buf[0] = '\0';
- }
- printf("Improper choice. Try again (y or n)>> ");
- }
- #else
- return(YES);
- #endif
- }
-
- COUNT vcparm(pp,rv,txt)
- UCOUNT *pp;
- UCOUNT rv;
- TEXT *txt;
- {
- COUNT prnprm();
-
- if (rv != *pp && prnprm(*pp,rv,txt)) {
- *pp = rv;
- return(NO);
- }
- return(YES);
- }
-
- COUNT vtparm(pp,rv,txt)
- TEXT *pp,*txt;
- UCOUNT rv;
- {
- COUNT prnprm();
-
- if (rv != *pp && prnprm((UCOUNT) *pp,rv,txt)) {
- *pp = rv;
- return(NO);
- }
- return(YES);
- }
-
- COUNT prnprm(hv,rv,txt)
- UCOUNT hv,rv;
- TEXT *txt;
- {
- COUNT yesno();
-
- #ifdef RB_INTERACTIVE
- printf("\n\nWARNING: %s discrepancy.",txt);
- printf("\nParameter file %s = %d",txt,rv);
- printf("\n Header %s = %d",txt,hv);
- printf("\n\nUse parameter file value? (y or n)>> ");
- #endif
- return(yesno());
- }
-
- COUNT RBLDAT(datno,datnam,datlen,xtdsiz,filemd)
- COUNT datno; /* data number temporary assigned to file */
- TEXT *datnam; /* pointer to file name */
- COUNT datlen; /* data record length */
- UCOUNT xtdsiz; /* file chunk size */
- COUNT filemd; /* file mode parameter */
- {
- FAST DATFILE *dnum;
-
- COUNT scndat();
-
- #ifdef RB_OUTPUT
- printf("\n\nExamining data file %s.",datnam);
- #endif
- uerr_cod = 0;
- dnum = ct_key + datno;
- if (dnum->chnacs != 'n')
- return(rerr(FUSE_ERR,datno));
-
- cpybuf(dnum->flname,datnam,MAX_NAME);
- #ifdef CT_ANSI
- if ((dnum->fd = mbopen(dnum,(EXCLUSIVE | PERMANENT))) == (RNDFILE) NULL)
- #else
- if ((dnum->fd = mbopen(dnum,(EXCLUSIVE | PERMANENT))) < 0)
- #endif
- /* file does not exist */
- return(rerr(FNOP_ERR,datno));
-
- if (redhdr(dnum)) {
- mbclos(dnum,COMPLETE);
- return(rerr(uerr_cod,datno));
- }
-
- dnum->chnacs = 'y';
- dnum->filnum = datno;
- fhdr = NO;
- all_idx = NO;
- ct_redom = NO;
-
- if (dnum->verson < CT_V4) /* V3.3 data file */
- dnum->length = dnum->recsiz = dnum->nmem = dnum->kmem = dnum->flmode = 0;
- if (dnum->verson < CT_V4E && (dnum->flmode & VLENGTH)) {
- /* V4.1D or earlier var length data file */
- dnum->maxkbn = dnum->recsiz - STATUS;
- dnum->maxkbl = (dnum->maxkvl - 1) * VARI_LEN;
- }
-
- if (!ct_fp && dnum->verson != ct_ver) {
- #ifdef RB_INTERACTIVE
- printf("\nData file version incompatibility detected:");
- printf("\n\tDo you wish to continue? If so, data file and ");
- printf("\n\tindex files must be rebuilt. (y or n) >> ");
- #endif
- if (yesno())
- ct_fp = YES;
- else
- return(rerr(FVER_ERR,datno));
- }
-
- if (dnum->nmem != 0 || dnum->kmem != 0) {
- dnum->nmem = dnum->kmem = 0;
- fhdr = YES;
- }
-
- if (dnum->updflg == COMPACT) {
- #ifdef RB_OUTPUT
- printf(
- "\nData File has been compacted. Associated indices must be rebuilt.");
- #endif
- dnum->updflg = NO;
- fhdr = YES;
- all_idx = YES;
- ct_redom = YES;
- }
- #ifdef RB_OUTPUT
- else if (dnum->updflg)
- printf("\nData File is corrupt (flag = %d).",dnum->updflg);
- #endif
-
- if (!vcparm(&dnum->reclen,datlen,"data record length"))
- ct_fp = YES;
- if (!vcparm(&dnum->extsiz,xtdsiz,"file extension size"))
- fhdr = YES;
- if ((dnum->flmode & VLENGTH) != (filemd & VLENGTH))
- return(rerr(RMOD_ERR,datno));
- if (dnum->flmode & VLENGTH) {
- #ifdef VARLDATA
- if (dnum->clstyp != VAT_CLOSE) {
- dnum->clstyp = VAT_CLOSE;
- fhdr = YES;
- }
- #else
- printf("%s%s%s",VS1,VS2,VS3);
- return(rerr(RMOD_ERR,datno));
- #endif
- } else
- if (dnum->clstyp != DAT_CLOSE) {
- dnum->clstyp = DAT_CLOSE;
- fhdr = YES;
- }
-
- if (fhdr && wrthdr(dnum))
- return(uerr_cod);
- if (dnum->updflg || ct_fp) {
- #ifdef RB_OUTPUT
- printf("\n\nRebuilding data file.\n");
- #endif
- dnum->verson = ct_ver;
- redo_dat = YES;
- dnum->updflg = UPDATED;
- dnum->nument = 0L;
- if (wrthdr(dnum))
- return(uerr_cod);
- if (scndat(dnum))
- return(rerr(uerr_cod,datno));
- #ifdef RB_OUTPUT
- printf("\nData file rebuild complete (%ld bytes",
- dnum->numrec + 1L);
- if (dnum->clstyp == DAT_CLOSE)
- printf(" / %ld active records).",dnum->nument);
- else
- printf(").");
- #endif
- } else {
- #ifdef RB_OUTPUT
- printf("\n\nNo data file rebuild necessary.");
- #endif
- redo_dat = NO;
- }
-
- return(rerr(CLSFIL(datno,COMPLETE),datno));
- }
-
- COUNT RBLIDX(datno,datname,idxname,keyno,klen,ktyp,dflg,nomemb,xtdsiz,filemd)
- COUNT datno;
- TEXT *datname,*idxname;
- COUNT keyno,klen,ktyp,dflg,nomemb;
- UCOUNT xtdsiz;
- COUNT filemd;
- {
- KEYFILE *knum;
-
- COUNT chkpar(),getdt();
-
- #ifdef RB_OUTPUT
- printf("\n\nExamining index file %s.",idxname);
- #endif
-
- fhdr = NO;
- if (!all_idx && !redo_dat) {
- if (OPNFIL(keyno,idxname,filemd) == NO_ERROR){
- knum = ct_key + keyno;
- if (chkpar(knum,klen,ktyp,dflg,nomemb,xtdsiz,filemd))
- redo_idx = NO;
- else {
- redo_idx = YES;
- CLSFIL(keyno,COMPLETE);
- }
- } else
- redo_idx = YES;
- } else
- redo_idx = YES;
-
-
- if (!redo_idx && fhdr && wrthdr(knum))
- return(rerr(uerr_cod,keyno));
-
- if (redo_idx) {
- #ifdef RB_OUTPUT
- printf("\n\nRebuilding index file ");
- #endif
- remove(idxname);
- if (CREIDX(keyno,idxname,klen,ktyp,dflg,nomemb,xtdsiz,filemd) ||
- CLSFIL(keyno,filemd) || OPNFIL(keyno,idxname,filemd))
- return(rerr(uerr_cod,keyno));
- ct_redom = YES;
- if (getdt(keyno,datno,datname))
- return(rerr_cod);
-
- #ifdef RB_OUTPUT
- #ifndef NO_IDXENT
- printf("\nIndex file rebuild complete (%ld entries).",
- IDXENT(keyno));
- #else
- printf("\nIndex file rebuild complete.");
- #endif
- #endif
-
- } else {
- ct_redom = NO;
- printf("\nNo index file rebuild necessary.");
- }
- return(rerr(CLSFIL(keyno,COMPLETE),keyno));
- }
-
- COUNT RBLMEM(datno,datname,idxname,keyno,klen,ktyp,dflg,membno)
- COUNT datno;
- TEXT *datname,*idxname;
- COUNT keyno,klen,ktyp,dflg,membno;
- {
- COUNT getdt();
-
- CTFILE *knum;
-
- #ifdef RB_OUTPUT
- printf("\n\nRebuilding additional index #%d ",membno);
- #endif
- if (OPNFIL(keyno,idxname,(EXCLUSIVE | PERMANENT)))
- return(rerr(uerr_cod,keyno));
- knum = ct_key + keyno;
- if (membno < 1 || membno > knum->nmem)
- return(rerr(KMEM_ERR,knum->nmem));
- (knum += membno)->chnacs = 'm';
- if (CREMEM(keyno,klen,ktyp,dflg,membno))
- return(rerr(uerr_cod,membno));
- if (getdt(keyno + membno,datno,datname))
- return(rerr_cod);
- #ifdef RB_OUTPUT
- #ifndef NO_IDXENT
- printf("\nAdditional index member rebuild complete (%ld entries).",
- IDXENT(keyno + membno));
- #else
- printf("\nAdditional index member rebuild complete.");
- #endif
- #endif
-
- return(rerr(CLSFIL(keyno,COMPLETE),keyno));
- }
-
-
- COUNT chkpar(knum,kl,kt,df,nm,xt,fm)
-
- KEYFILE *knum;
- COUNT kl,kt,df,nm;
- UCOUNT xt;
- COUNT fm;
-
- {
- COUNT result;
-
- result = vcparm(&knum->recsiz,ct_ndsec * SECSIZ,"node size");
- result = (vcparm((UCOUNT *) &knum->length,kl,"key length") && result);
- result = (vtparm(&knum->ktype,kt,"key type") && result);
- result = (vtparm(&knum->autodup,df,"duplicate flag") && result);
- result = (vcparm((UCOUNT *) &knum->nmem,nm,"# of additional indices")
- && result);
- if (!vcparm(&knum->extsiz,xt,"file size extension"))
- fhdr = YES;
- /*
- if (!vcparm((UCOUNT *) &knum->flmode,fm,"file mode"))
- fhdr = YES;
- */
- if (knum->verson != ct_ver) {
- knum->verson = ct_ver;
- result = NO;
- }
- return(result);
- }
-
- VOID updkey(knum)
-
- PFAST KEYFILE *knum;
-
- {
- knum->maxkbn = knum->recsiz - STATUS;
- knum->maxkvn = knum->maxkbn / (knum->length + sizeof(POINTER));
- if (knum->maxkvn < 3) {
- printf(
- "\n\nKey length too long for node size. (KMIN_ERR)");
- exit(0);
- }
- knum->maxkvl = knum->maxkbn / knum->length;
- knum->maxkbl = (knum->maxkvl - 1) * knum->length;
- }
-
-
- COUNT getdt(keyno,datno,datname)
- COUNT keyno,datno;
- TEXT *datname;
-
- {
- #ifdef VARLDATA
- COUNT RDVREC();
- #endif
- COUNT addbat();
-
- DATFILE *dnum;
- KEYFILE *knum;
- POINTER newbyt,curbyt;
- POINTER *pp;
- COUNT batch,kl,delrec,serflg;
- UCOUNT batsiz,bp;
- COUNT *lp;
- TEXT *kp;
- #ifdef VARLDATA
- VHDR vrhdr;
- #endif
-
- dnum = ct_key + datno;
- knum = ct_key + keyno;
-
- bp = dnum->srlpos;
- if (OPNFIL(datno,datname,(EXCLUSIVE | PERMANENT)))
- return(rerr(uerr_cod,datno));
- dnum->srlpos = bp;
- serflg = NO;
-
- kl = knum->length;
- duprej = 0;
- batsiz = ct_spc / (kl + sizeof(POINTER) + sizeof(COUNT)) - 1;
-
- if (dnum->clstyp == DAT_CLOSE)
- curbyt = ((SECSIZ + dnum->reclen - 1) / dnum->reclen) *
- dnum->reclen;
- else
- curbyt = (dnum->recsiz + SIZVHDR);
-
- lbuf = (COUNT *) (ct_pbuf + batsiz);
- kbuf = (TEXT *) (lbuf + batsiz);
-
- #ifdef RB_OUTPUT
- printf("with Batch Size = %u.\n",batsiz);
- #endif
-
- batch = 0;
- bp = batsiz - 1;
- while (curbyt < dnum->numrec) {
- delrec = NO;
- if (dnum->clstyp == DAT_CLOSE) {
- if (REDREC(datno,curbyt,ct_rbuf))
- return(rerr(uerr_cod,datno));
- newbyt = curbyt + dnum->reclen;
- if (ct_rbuf[0] == DELFLG)
- delrec = YES;
- } else {
- #ifdef VARLDATA
- if (getvhdr(dnum,curbyt,&vrhdr))
- return(rerr(uerr_cod,datno));
- if (vrhdr.recmrk == VDEL_FLAG || vrhdr.recmrk == VNOD_FLAG)
- delrec = YES;
- else if (vrhdr.recmrk != VACT_FLAG)
- return(rerr(RVHD_ERR,datno));
- else {
- if (vrhdr.urclen > ct_bsz) {
- mbfree(ct_rbuf);
- if ((ct_rbuf = mballc(1,ct_bsz = vrhdr.urclen)) ==
- NULL)
- return(rerr(RRLN_ERR,datno));
- }
- if (RDVREC(datno,curbyt,ct_rbuf,ct_bsz))
- return(rerr(isam_err,datno));
- }
- newbyt = curbyt + vrhdr.trclen + SIZVHDR;
- #else
- return(rerr(RMOD_ERR,datno));
- #endif
- }
- if (!delrec && dnum->srlpos) {
- cpybuf(&ct_gsrl,ct_rbuf + dnum->srlpos - 1,sizeof(POINTER));
- #ifndef NATURAL_SERIAL
- #ifdef LOW_HIGH
- revobj(&ct_gsrl,sizeof(POINTER));
- #endif
- #endif
- if ((unsigned long) dnum->sernum < (unsigned long) ct_gsrl) {
- dnum->sernum = ct_gsrl;
- serflg = YES;
- }
- }
- if (!delrec && frmkey(keyno,ct_rbuf,ct_kyval,curbyt)) {
- if (++bp == batsiz) {
- if (batch)
- if (addbat(keyno,kl,batch,bp - 1))
- return(rerr_cod);
- bp = 0;
- batch++;
- pp = ct_pbuf;
- kp = kbuf;
- lp = lbuf;
- }
- cpybuf(kp,ct_kyval,kl);
- kp += kl;
- *pp++ = curbyt;
- *lp++ = bp;
- }
- curbyt = newbyt;
- }
- if (batch)
- if (addbat(keyno,kl,batch,bp))
- return(rerr_cod);
- if (duprej) {
- printf(
- "\nWARNING: %d record(s) contained rejected duplicate key values.\n",duprej);
- printf("\nPress RETURN to continue ...");
- gets(ct_buf);
- }
-
- if (serflg && wrthdr(dnum))
- return(rerr(uerr_cod,datno));
- return(rerr(CLSFIL(datno,COMPLETE),datno));
- }
-
- COUNT addbat(keyno,klen,batno,bs)
-
- COUNT keyno,klen,batno,bs;
-
- {
- LOCAL UCOUNT t;
- COUNT i,j,k,add_mode;
- FAST COUNT *lp;
- TEXT *kp;
- POINTER *pp;
-
- VOID srtbat();
-
-
- snum = ct_key + keyno;
- slen = klen;
- srtlev = maxsrt = 0;
- srtbat(0,bs);
-
- if (batno == 1) {
- add_mode = INCADD;
- t = 0;
- } else if (compar(lastky,kbuf + (lbuf[0] * slen),snum) <= 0)
- add_mode = INCADD;
- else
- add_mode = REGADD;
- if (batno == 1 || compar(lastky,kbuf + (lbuf[bs] * slen),snum) < 0)
- cpybuf(lastky,kbuf + (lbuf[bs] * klen),snum->length);
-
- lp = lbuf;
- for (i = 0; i <= bs; i++) {
- j = *lp++;
- pp = ct_pbuf + j;
- kp = kbuf + (j * klen);
- switch (ADDKEY(keyno,kp,*pp,add_mode)) {
-
- case NO_ERROR:
- break;
- case KDUP_ERR:
- printf(
- "\nDuplicate key rejected for record at offset %lxx [",*pp);
- for (k = 0; k < klen; k++)
- printf("%02x",*(kp + k) & 0x00ff);
- printf("]\n");
- duprej++;
- break;
- default:
- printf("\nADDKEY terminating with code %d",uerr_cod);
- return(rerr(uerr_cod,keyno));
- }
- #ifdef RB_OUTPUT
- if (!(++t % 128))
- printf("i");
- #endif
- }
- #ifdef RB_OUTPUT
- printf(" B%d ",batno);
- #endif
- return(NO_ERROR);
- }
-
- VOID exchg(i,j)
-
- COUNT i,j;
-
- {
- FAST COUNT temp;
-
- temp = lbuf[i];
- lbuf[i] = lbuf[j];
- lbuf[j] = temp;
- }
-
- COUNT comsrt(k,tp)
-
- COUNT k;
- TEXT *tp;
-
- {
- TEXT *temp;
-
- temp = kbuf + (lbuf[k] * slen);
- return(compar(temp,tp,snum));
- }
-
- COUNT comadj(k)
- COUNT k;
- {
- TEXT *t1,*t2;
-
- t1 = kbuf + (lbuf[k] * slen);
- t2 = kbuf + (lbuf[k + 1] * slen);
- return(compar(t1,t2,snum));
- }
-
- VOID srtbat(lo,hi) /* recursive quicksort with bubble-like exchanges */
-
- COUNT lo,hi;
-
- {
- FAST COUNT i,j;
- COUNT size,f,lf,rf;
- TEXT *piv;
-
- if (++srtlev > maxsrt)
- maxsrt = srtlev;
- if ((i = lo) < (j = hi)) {
- lf = rf = NO;
- f = YES;
- piv = kbuf + (lbuf[(i + j) / 2] * slen);
-
- while (f) {
- while (comsrt(i,piv) < 0 && i != j) {
- if (i > lo && comadj(i - 1) > 0) {
- exchg(i - 1,i);
- lf = YES;
- }
- i++;
- }
-
- while (comsrt(j,piv) >= 0 && i != j) {
- if (j < hi && comadj(j) > 0) {
- exchg(j,j + 1);
- rf = YES;
- }
- j--;
- }
-
- if (i != j)
- exchg(i,j);
- else {
- if (comsrt(j,piv) >= 0) {
- if (j < hi && comadj(j) > 0) {
- exchg(j,j + 1);
- rf = YES;
- }
- } else {
- if (i > lo && comadj(i - 1) > 0) {
- exchg(i - 1,i);
- lf = YES;
- }
- if ((i - 1) > lo && comadj(i - 2) > 0)
- exchg(i - 2,i - 1);
- }
- f = NO;
- } /* i = j */
- } /* while (f) */
-
- if ((size = i - lo) > 2)
- if (lf)
- if (size == 3) {
- if (comadj(lo) > 0)
- exchg(lo,lo + 1);
- } else
- srtbat(lo,i - 2);
-
- if ((size = hi - j + 1) > 2)
- if (rf)
- if (size == 3) {
- if (comadj(j + 1) > 0)
- exchg(j + 1,j + 2);
- } else
- srtbat(j + 1,hi);
- }
- --srtlev;
- }
-
- COUNT scndat(dnum)
-
- DATFILE *dnum;
-
- {
- POINTER curbyt;
- UCOUNT t;
- #ifdef VARLDATA
- POINTER lstbyt;
- UCOUNT lstmrk;
- VRLEN savlen;
- VHDR vrhdr;
- #endif
-
-
- if (dnum->clstyp == DAT_CLOSE) {
- curbyt = ((SECSIZ + dnum->reclen - 1) /
- dnum->reclen) * dnum->reclen;
- dnum->delstk = DRNZERO;
- t = 0;
- while (!ctio(CTREAD,dnum,curbyt,ct_rbuf,0)) {
- if (ct_rbuf[0] == DELFLG) {
- cpybuf(ct_rbuf+1,&dnum->delstk,sizeof(POINTER));
- #ifdef UNIFRMAT
- revobj(ct_rbuf + 1,sizeof(POINTER));
- #endif
- dnum->delstk = curbyt;
- if (ctio(CTWRITE,dnum,curbyt,ct_rbuf,0))
- return(uerr_cod);
- } else
- dnum->nument++;
- #ifdef RB_OUTPUT
- if (!(++t % 128))
- printf("d");
- #endif
- curbyt += dnum->reclen;
- }
- dnum->numrec = dnum->phyrec = curbyt - (POINTER) 1;
- return(NO_ERROR);
- } else if (dnum->clstyp == VAT_CLOSE) {
- #ifdef VARLDATA
- curbyt = dnum->recsiz + SIZVHDR;
- t = lstmrk = 0;
-
- dnum->root = dnum->nodstk = NODEZERO;
- dnum->length = VARI_LEN;
- dnum->autodup = 1;
- dnum->ktype = 0;
- dnum->nument = DRNZERO;
-
- if (dnum->recsiz > (ct_ndsec * SECSIZ))
- return(uerr(KSIZ_ERR));
- else if (dnum->length < 0 || dnum->length > MAXLEN)
- return(uerr(KLEN_ERR));
- updkey(dnum);
-
- /* all existing tree nodes are marked deleted */
-
- while (!getvhdr(dnum,curbyt,&vrhdr)) {
- if (vrhdr.recmrk == VNOD_FLAG) {
- if (vrhdr.trclen != dnum->recsiz)
- return(uerr(KSIZ_ERR));
- vrhdr.urclen = 0;
- vrhdr.recmrk = VDEL_FLAG;
- if (putvhdr(dnum,curbyt,&vrhdr))
- return(uerr_cod);
- } else if (vrhdr.recmrk == VACT_FLAG) {
- if (vrhdr.urclen == 0) {
- vrhdr.recmrk = VDEL_FLAG;
- if (putvhdr(dnum,curbyt,&vrhdr))
- return(uerr_cod);
- }
- } else if (vrhdr.recmrk == VDEL_FLAG)
- /* no action necessary */ ;
- else /* no recognizable header. truncate file */
- break;
-
- if (vrhdr.recmrk == VDEL_FLAG && lstmrk == VDEL_FLAG) {
- /* collapse consecutive deleted areas */
- savlen = vrhdr.trclen;
- if (getvhdr(dnum,lstbyt,&vrhdr))
- return(uerr_cod);
- if (vrhdr.recmrk != VDEL_FLAG)
- terr(228);
- savlen += vrhdr.trclen + SIZVHDR;
- if (savlen < vrhdr.trclen)
- /* overflow: don't collapse space */
- vrhdr.recmrk = (VRLEN) 0; /* reset lstmrk */
- else {
- vrhdr.trclen = savlen;
- if (putvhdr(dnum,lstbyt,&vrhdr))
- return(uerr_cod);
- }
- } else
- /* no consecutive deleted areas */
- lstbyt = curbyt;
-
- lstmrk = vrhdr.recmrk;
- curbyt = lstbyt + (vrhdr.trclen + SIZVHDR);
- #ifdef RB_OUTPUT
- if (!(++t % 256))
- printf("d");
- #endif
- }
- dnum->numrec = dnum->phyrec = curbyt - (SIZVHDR + 1);
- curbyt = dnum->recsiz + SIZVHDR;
-
- /* create all new delete space nodes in variable length files */
-
- while (curbyt < dnum->numrec) {
- if (getvhdr(dnum,curbyt,&vrhdr))
- return(uerr_cod);
- else if (vrhdr.recmrk == VDEL_FLAG) {
- frmlkey(lenkey,&vrhdr.trclen,DRNZERO);
- if (ADDKEY(dnum->filnum,lenkey,curbyt,REGADD))
- return(uerr_cod);
- }
- #ifdef RB_OUTPUT
- if (!(++t % 256))
- printf("d");
- #endif
- curbyt += (vrhdr.trclen + SIZVHDR);
- }
- return(NO_ERROR);
- #else
- printf("%s%s%s",VS1,VS2,VS3);
- return(RMOD_ERR);
- #endif
- } else
- return(RMOD_ERR);
- }
-
- #endif
-
- /* end of ctrbl2.c */
-