home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c004 / 2.ddi / CTVRC2.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-18  |  7.1 KB  |  321 lines

  1. /*
  2.  *    variable record length low level routines
  3.  *
  4.  *    This program is the CONFIDENTIAL and PROPRIETARY property 
  5.  *    of FairCom(R) Corporation. Any unauthorized use, reproduction or
  6.  *    transfer of this program is strictly prohibited.
  7.  *
  8.  *      Copyright (c) 1985, 1986, 1987, 1988, 1989 FairCom Corporation
  9.  *    (Subject to limited distribution and
  10.  *     restricted disclosure only.)
  11.  *    *** ALL RIGHTS RESERVED ***
  12.  *
  13.  *    4006 West Broadway
  14.  *    Columbia, MO 65203
  15.  *
  16.  *
  17.  *    c-tree(R)    Version 4.3
  18.  *            Release C
  19.  *            February 7, 1989 17:30
  20.  *
  21.  */
  22.  
  23. #include "ctstdr.h"        /* standard i/o header         */
  24. #include "ctoptn.h"        /* c-tree configuration options */
  25. #include "cterrc.h"        /* c-tree error codes        */
  26. #include "ctstrc.h"        /* c-tree data structures    */
  27. #include "ctgvar.h"        /* c-tree global variables    */
  28. #include "ctvrec.h"        /* var length header        */
  29.  
  30. COUNT          tstupd(),ctio(),uerr(),ADDKEY(),DELCHK();
  31. COUNT          getvhdr(),putvhdr(),frmlkey(),chkvhdr();
  32. CTFILE          *tstfnm();
  33. POINTER        GTKEY(),GTEKEY(),EQLKEY();
  34. #ifdef FPUTFGET
  35. COUNT           DLOCK(),UDLOCK(),redhdr();
  36. #endif
  37. #ifdef MUSTFRCE
  38. COUNT           DLOCK(),UDLOCK();
  39. #endif
  40. #ifndef NOTFORCE
  41. COUNT           wrthdr();
  42. #endif    
  43.  
  44. LOCAL TEXT     lenkey[VARI_LEN],idxkey[VARI_LEN];
  45.  
  46. VRLEN GTVLEN(datno,recbyt)
  47. COUNT        datno;
  48. POINTER           recbyt;
  49. {
  50.     VHDR          vrhdr;
  51.     FAST VATFILE *vnum;
  52.  
  53.     uerr_cod = 0;
  54.     if ((vnum = tstfnm(datno)) == NULL)
  55.         /* no action */;
  56.     else if (vnum->clstyp != VAT_CLOSE)
  57.         uerr_cod = FMOD_ERR;
  58.     else if (recbyt == DRNZERO)
  59.         uerr_cod = ZREC_ERR;
  60.     else if (getvhdr(vnum,recbyt,&vrhdr))
  61.         /* no action */;
  62.     else if (vrhdr.recmrk != VACT_FLAG)
  63.         uerr_cod = VFLG_ERR;
  64.  
  65.     if (uerr_cod)
  66.         return(0);
  67.     else
  68.         return(vrhdr.urclen);
  69. }    
  70.  
  71. LONG NEWVREC(datno,varlen)
  72. COUNT        datno;
  73. VRLEN              varlen;
  74. {
  75.     LONG     pntr,rpntr;
  76.     VATFILE *vnum;
  77.     VHDR     vrhdr;
  78.  
  79.     POINTER extfil();
  80.  
  81.     uerr_cod = 0;
  82.     if ((vnum = tstfnm(datno)) == NULL || chkredf(vnum))
  83.         return(DRNZERO);
  84.     if (vnum->clstyp != VAT_CLOSE) {
  85.         uerr(FMOD_ERR);
  86.         return(DRNZERO);
  87.     }
  88.     frmlkey(lenkey,&varlen,DRNZERO);
  89.     rpntr    = DRNZERO;
  90.  
  91. #ifndef MUSTFRCE
  92.     if (pntr = GTEKEY(datno,lenkey,idxkey)) {
  93. #else
  94.     pntr = GTEKEY(datno,lenkey,idxkey);
  95.     while (pntr)
  96.         if (DLOCK(pntr,vnum)) {
  97.             cpybuf(lenkey,idxkey,VARI_LEN);
  98.             pntr = GTKEY(datno,lenkey,idxkey);
  99.         } else {
  100.             if (EQLKEY(datno,idxkey) != DRNZERO)
  101.                 break; /* ok to reuse this space */
  102.             else { /* already used by someone else */
  103.                 UDLOCK(pntr,vnum);
  104.                 cpybuf(lenkey,idxkey,VARI_LEN);
  105.                 pntr = GTKEY(datno,lenkey,idxkey);
  106.             }
  107.         }
  108.     if (pntr) {
  109. #endif
  110.         if (getvhdr(vnum,pntr,&vrhdr))
  111.             /* no action */ ;
  112.         else if (vrhdr.recmrk != VDEL_FLAG)
  113.             uerr(VDLFLG_ERR);
  114.         else if (DELCHK(datno,idxkey,pntr))
  115.             uerr(VDLK_ERR);
  116.         else
  117.             rpntr = pntr;
  118.  
  119.         if (tstupd(vnum))
  120.             goto err_newvrec;
  121. #ifdef FPUTFGET
  122.         if (DLOCK(DRNZERO,vnum) || redhdr(vnum))
  123.             goto err_newvrec;
  124. #endif
  125.         if ((ct_gsrl = ++vnum->sernum) == DRNZERO) {
  126.             uerr_cod = OSRL_ERR;
  127. #ifdef FPUTFGET
  128.             UDLOCK(DRNZERO,vnum);
  129. #endif
  130.             goto err_newvrec;
  131.         }
  132. #ifndef NOTFORCE
  133.         if (wrthdr(vnum)) {
  134. #ifdef FPUTFGET
  135.             UDLOCK(DRNZERO,vnum);
  136. #endif
  137.             goto err_newvrec;
  138.         }
  139.  
  140. #ifdef FPUTFGET
  141.         if (UDLOCK(DRNZERO,vnum))
  142.             goto err_newvrec;
  143. #endif
  144. #endif
  145.         return(rpntr);
  146.     }
  147.  
  148.  
  149.     if ((varlen + SIZVHDR) < varlen) {
  150.         uerr(VMAX_ERR);
  151.         goto err_newvrec;
  152.     }
  153.  
  154. #ifdef FPUTFGET
  155.     if (DLOCK(DRNZERO,vnum) || redhdr(vnum))
  156.         goto err_newvrec;
  157. #endif
  158.     if ((ct_gsrl = ++vnum->sernum) == DRNZERO) {
  159.         uerr_cod = OSRL_ERR;
  160. #ifdef FPUTFGET
  161.         UDLOCK(DRNZERO,vnum);
  162. #endif
  163.         goto err_newvrec;
  164.     }
  165.     pntr = extfil(vnum,varlen + SIZVHDR);
  166.  
  167. #ifdef FPUTFGET
  168.     if (DLOCK(pntr + SIZVHDR,vnum)) {
  169.         UDLOCK(DRNZERO,vnum);
  170.         goto err_newvrec;
  171.     }
  172. #endif
  173. #ifdef CTSERVER
  174.     if (DLOCK(pntr + SIZVHDR,vnum)) {
  175.         goto err_newvrec;
  176.     }
  177. #endif
  178.  
  179. #ifdef NOTFORCE
  180.     if (tstupd(vnum))
  181.         goto err_newvrec;
  182. #else
  183.     if (wrthdr(vnum)) {
  184. #ifdef FPUTFGET
  185.         UDLOCK(DRNZERO,vnum);
  186. #endif
  187.         goto err_newvrec;
  188.     }
  189.  
  190. #ifdef FPUTFGET
  191.     if (UDLOCK(DRNZERO,vnum))
  192.         goto err_newvrec;
  193. #endif
  194. #endif
  195.  
  196.     if (!pntr)
  197.         goto err_newvrec;
  198.  
  199.     pntr += SIZVHDR;
  200.     vrhdr.recmrk = VACT_FLAG;
  201.     vrhdr.trclen = varlen;
  202.     vrhdr.urclen = 0;
  203.     if (putvhdr(vnum,pntr,&vrhdr))
  204.         goto err_newvrec;
  205.  
  206.     return(pntr);
  207.  
  208. err_newvrec:
  209.     return(ct_gsrl = DRNZERO);
  210. }
  211.  
  212.  
  213. COUNT RETVREC(datno,recbyt)
  214. COUNT         datno;
  215. LONG                recbyt;
  216. {
  217.     VATFILE *vnum;
  218.     VHDR     vrhdr,nrhdr;
  219.     LONG     nrecbyt;
  220.     VRLEN     test;
  221.  
  222.     uerr_cod = 0;
  223.     if ((vnum = tstfnm(datno)) == NULL || chkredf(vnum) || getvhdr(vnum,
  224.         recbyt,&vrhdr) || chkvhdr(&vrhdr))
  225.         return(uerr_cod);
  226.  
  227.     if ((nrecbyt = recbyt + vrhdr.trclen + SIZVHDR) > recbyt &&
  228.         getvhdr(vnum,nrecbyt,&nrhdr) == NO_ERROR &&
  229. #ifndef MUSTFRCE
  230.         nrhdr.recmrk == VDEL_FLAG)
  231. #else
  232.         nrhdr.recmrk == VDEL_FLAG && DLOCK(nrecbyt,vnum) == NO_ERROR) {
  233.         frmlkey(lenkey,&nrhdr.trclen,nrecbyt); /* see if really avail */
  234.         if (EQLKEY(datno,lenkey) != DRNZERO) /* then next if */
  235. #endif
  236.           if ((test = vrhdr.trclen + SIZVHDR + nrhdr.trclen) >
  237.             vrhdr.trclen) { /* combine consecutive deleted areas */
  238.             vrhdr.trclen = test;
  239.             frmlkey(lenkey,&nrhdr.trclen,DRNZERO);
  240.             if (DELCHK(datno,lenkey,nrecbyt))
  241.                 return(uerr(VDLK_ERR));
  242.         }
  243. #ifdef MUSTFRCE
  244.         UDLOCK(nrecbyt,vnum);
  245.     }
  246. #endif
  247.  
  248.     frmlkey(lenkey,&vrhdr.trclen,DRNZERO);
  249.     vrhdr.recmrk = VDEL_FLAG;
  250.     vrhdr.urclen = 0;
  251.     if (putvhdr(vnum,recbyt,&vrhdr))
  252.         return(uerr_cod);
  253.  
  254. #ifdef MUSTFRCE
  255.     UDLOCK(recbyt,vnum);    /* assumes no error if record not locked */
  256. #endif
  257.  
  258.     return(ADDKEY(datno,lenkey,recbyt,REGADD));
  259. }
  260.  
  261. COUNT WRTVREC(datno,recbyt,recptr,varlen)
  262. COUNT         datno;
  263. LONG                recbyt;
  264. VRLEN                    varlen;
  265. TEXT                           *recptr;
  266. {
  267.     VATFILE *vnum;
  268.     VHDR     vrhdr;
  269.     VRLEN    unused;
  270.  
  271.     uerr_cod = 0;
  272.     if ((vnum = tstfnm(datno)) == NULL || chkredf(vnum))
  273.         return(uerr_cod);
  274.     if (!recbyt)
  275.         return(uerr(VPNT_ERR));
  276.     if (recptr == NULL)
  277.         return(uerr(DNUL_ERR));
  278.     if (getvhdr(vnum,recbyt,&vrhdr) || chkvhdr(&vrhdr))
  279.         return(uerr_cod);
  280.     if (vrhdr.trclen < varlen)
  281.         return(uerr(VLEN_ERR));
  282.     vrhdr.urclen = varlen;
  283.     vrhdr.recmrk = VACT_FLAG;
  284.     unused       = vrhdr.trclen - varlen;
  285.     if (unused > (vnum->reclen + SIZVHDR) && unused > 64)
  286.         vrhdr.trclen = varlen;
  287.     else
  288.         unused = 0;
  289.     if (putvhdr(vnum,recbyt,&vrhdr))
  290.         return(uerr_cod);
  291.     if (ctio(CTWRITE,vnum,recbyt,recptr,varlen))
  292.         return(uerr_cod);
  293.     if (unused) {     /* reclaim space */
  294.         recbyt       += (varlen + SIZVHDR);
  295.         vrhdr.recmrk  = VDEL_FLAG;
  296.         vrhdr.trclen  = unused - SIZVHDR;
  297.         vrhdr.urclen  = 0;
  298.         if (putvhdr(vnum,recbyt,&vrhdr))
  299.             return(uerr_cod);
  300.         return(RETVREC(datno,recbyt));
  301.     }
  302.     return(tstupd(vnum));
  303. }
  304.  
  305.  
  306. COUNT RDVREC(datno,recbyt,recptr,bufsiz)
  307. PFAST COUNT  datno;
  308. POINTER           recbyt;
  309. TEXT             *recptr;
  310. VRLEN                 bufsiz;
  311. {
  312.     VRLEN         vrclen;
  313.     VRLEN         prprdv();
  314.  
  315.     if ((vrclen = prprdv(datno,recbyt,recptr,bufsiz)) == 0)
  316.         return(uerr_cod);
  317.     return(ctio(CTREAD,ct_key + datno,recbyt,recptr,vrclen));
  318. }
  319.  
  320. /* end of ctvrc2.c */
  321.