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

  1. /*
  2.  *    data file 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) 1984, 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.  
  29. COUNT  uerr(),ctio(),DLOCK(),UDLOCK(),RLOCK();
  30.  
  31. POINTER NEWREC(datno)
  32. COUNT datno;
  33. {
  34.     FAST DATFILE *dnum;
  35.     LOCAL POINTER pntr;
  36.  
  37.     DATFILE *tstfnm();
  38.     COUNT    tstupd(),wrthdr(),redhdr();
  39.     POINTER  extfil();
  40.  
  41.     uerr_cod = 0;
  42.     if ((dnum = tstfnm(datno)) == NULL || chkredf(dnum))
  43.         return(DRNZERO);
  44.     if (dnum->clstyp != DAT_CLOSE) {
  45.         uerr(FMOD_ERR);
  46.         return(DRNZERO);
  47.     }
  48.  
  49. #ifdef FPUTFGET
  50.     if (DLOCK(DRNZERO,dnum) || redhdr(dnum))
  51.         return(DRNZERO);
  52. #endif
  53.  
  54.     dnum->nument++;
  55.     if ((ct_gsrl = ++dnum->sernum) == DRNZERO) {
  56.         uerr_cod = OSRL_ERR;
  57. #ifdef FPUTFGET
  58.         UDLOCK(DRNZERO,dnum);
  59. #endif
  60.         goto err_newrec;
  61.     }
  62.  
  63.     if (!(pntr = dnum->delstk)) {
  64.         if (!(pntr = extfil(dnum,dnum->reclen))) {
  65.             /* could not extend file */
  66. #ifdef FPUTFGET
  67.             UDLOCK(DRNZERO,dnum);
  68. #endif
  69.             goto err_newrec;
  70.         }
  71.     } else {
  72.         if (ctio(CTREAD,dnum,pntr,ct_buf,sizeof(POINTER) + 1)) {
  73. #ifdef FPUTFGET
  74.             UDLOCK(DRNZERO,dnum);
  75. #endif
  76.             goto err_newrec;
  77.         }
  78.         if (ct_buf[0] != DELFLG) {
  79. #ifdef FPUTFGET
  80.             UDLOCK(DRNZERO,dnum);
  81. #endif
  82.             uerr(DELFLG_ERR);
  83.             goto err_newrec;
  84.         }
  85. #ifdef UNIFRMAT
  86.         revobj(ct_buf + 1,sizeof(POINTER));
  87. #endif
  88.         cpybuf(&dnum->delstk,ct_buf + 1,sizeof(POINTER));
  89.     }
  90.  
  91. #ifdef FPUTFGET
  92.     if (DLOCK(pntr,dnum)) {
  93.         UDLOCK(DRNZERO,dnum);
  94.         goto err_newrec;
  95.     }
  96. #endif
  97. #ifdef CTSERVER
  98.     if (DLOCK(pntr,dnum))
  99.         goto err_newrec;
  100. #endif
  101.  
  102. #ifdef NOTFORCE
  103.     if (tstupd(dnum))
  104.         goto err_newrec;
  105. #else
  106.     if (wrthdr(dnum)) {
  107. #ifdef FPUTFGET
  108.         UDLOCK(DRNZERO,dnum);
  109. #endif
  110.         goto err_newrec;
  111.     }
  112.  
  113. #ifdef FPUTFGET
  114.     if (UDLOCK(DRNZERO,dnum))
  115.         goto err_newrec;
  116. #endif
  117. #endif
  118.     return(pntr);
  119.  
  120. err_newrec:
  121.     dnum->nument--;
  122.     return(ct_gsrl = DRNZERO);
  123. }
  124.  
  125. COUNT RETREC(datno,recbyt)
  126. COUNT   datno;
  127. POINTER recbyt;
  128. {
  129.     FAST DATFILE *dnum;
  130.     LOCAL POINTER pntr;
  131.  
  132.     DATFILE *tstfnm();
  133.     COUNT    tstupd(),tstrec(),wrthdr(),redhdr();
  134.  
  135.     uerr_cod = 0;
  136.     if ((dnum = tstfnm(datno)) == NULL || chkredf(dnum) ||
  137.         tstrec(dnum,recbyt))
  138.         return(uerr_cod);
  139.     if (dnum->clstyp != DAT_CLOSE)
  140.         return(uerr(FMOD_ERR));
  141.     
  142.  
  143. #ifdef FPUTFGET
  144.     if (DLOCK(DRNZERO,dnum) || redhdr(dnum))
  145.         return(uerr_cod);
  146. #endif
  147.  
  148.     dnum->nument--; 
  149.     pntr = dnum->delstk;
  150.     if (pntr == recbyt) {
  151.  
  152. #ifdef FPUTFGET
  153.         UDLOCK(DRNZERO,dnum);
  154. #endif
  155.         uerr_cod = DDRN_ERR;
  156.         goto err_retrec;
  157.     }
  158.     dnum->delstk = recbyt;
  159.     ct_buf[0] = DELFLG;
  160.     cpybuf(ct_buf + 1,&pntr,sizeof(POINTER));
  161. #ifdef UNIFRMAT
  162.     revobj(ct_buf + 1,sizeof(POINTER));
  163. #endif
  164.  
  165.     if (ctio(CTWRITE,dnum,recbyt,ct_buf,sizeof(POINTER) + 1)) {
  166. #ifdef FPUTFGET
  167.         UDLOCK(DRNZERO,dnum);
  168. #endif
  169.         goto err_retrec;
  170.     }
  171.  
  172. #ifdef MUSTFRCE
  173.     UDLOCK(recbyt,dnum);    /* assumes no error if recbyt not locked */
  174.     uerr_cod = 0;
  175. #endif
  176.  
  177. #ifdef NOTFORCE
  178.     if (tstupd(dnum))
  179.         goto err_retrec;
  180. #else
  181.     if (wrthdr(dnum)) {
  182. #ifdef FPUTFGET
  183.         UDLOCK(DRNZERO,dnum);
  184. #endif
  185.         goto err_retrec;
  186.     }
  187. #ifdef FPUTFGET
  188.     if (UDLOCK(DRNZERO,dnum))
  189.         goto err_retrec;
  190. #endif
  191. #endif
  192.     return(NO_ERROR);
  193.  
  194. err_retrec:
  195.     dnum->nument++;
  196.     return(uerr_cod);
  197. }    
  198.  
  199.  
  200.  
  201. /* --------------------------------------------------------------------
  202.    read data record
  203. */
  204.  
  205. COUNT REDREC(datno,recbyt,recptr)
  206. COUNT    datno;
  207. POINTER    recbyt;
  208. TEXT   *recptr;
  209. {
  210.     FAST DATFILE *dnum;
  211.  
  212.     DATFILE *tstfnm();
  213.     COUNT    tstrec();
  214.  
  215.     uerr_cod = 0;
  216.     if ((dnum = tstfnm(datno)) == NULL || tstrec(dnum,recbyt))
  217.         return(uerr_cod);
  218.     if (recptr == NULL)
  219.         return(uerr(DNUL_ERR));
  220.     return(ctio(CTREAD,dnum,recbyt,recptr,0));
  221. }
  222.  
  223. COUNT WRTREC(datno,recbyt,recptr)
  224. COUNT    datno;
  225. POINTER    recbyt;
  226. TEXT   *recptr;
  227. {
  228.     FAST DATFILE *dnum;
  229.  
  230.     DATFILE *tstfnm();
  231.     COUNT    tstupd(),tstrec();
  232.  
  233.     uerr_cod = 0;
  234.     if ((dnum = tstfnm(datno)) == NULL || chkredf(dnum) ||
  235.         tstrec(dnum,recbyt) || tstupd(dnum))
  236.         return(uerr_cod);
  237.     if (recptr == NULL)
  238.         return(uerr(DNUL_ERR));
  239.     return(ctio(CTWRITE,dnum,recbyt,recptr,0));
  240. }
  241.  
  242. COUNT tstrec(dnum,recbyt)
  243. PFAST DATFILE  *dnum;
  244. POINTER        recbyt;
  245. {
  246.     if (!recbyt)
  247.         return(uerr(ZREC_ERR));
  248.     if (recbyt > dnum->numrec)
  249. #ifndef FPUTFGET
  250.         return(uerr(LEOF_ERR));
  251. #else
  252.         if (redhdr(dnum))
  253.             return(uerr_cod);
  254.         else if (recbyt > dnum->numrec)
  255.             return(uerr(LEOF_ERR));
  256. #endif
  257.     return(NO_ERROR);
  258. }
  259.  
  260.  
  261. /* --------------------------------------------------------------------
  262.    return the number of active records in the date file datno
  263.  */
  264.  
  265. POINTER DATENT(datno)
  266. PFAST COUNT    datno;
  267. {
  268.     CTFILE      *tstfnm();
  269.     FAST CTFILE *dnum;
  270.  
  271.     uerr_cod = 0;
  272.     if ((dnum = tstfnm(datno)) == NULL) /* then error condition */
  273.         return(DRNZERO);
  274.     else if (dnum->clstyp != DAT_CLOSE) {
  275.         uerr_cod = FMOD_ERR;
  276.         return(DRNZERO);
  277.     }
  278.  
  279. #ifdef FPUTFGET
  280.     if ((dnum->flmode & SHARED) && redhdr(dnum)) /* then error */
  281.         return(DRNZERO);
  282. #endif
  283.  
  284.     return(dnum->nument);
  285. }
  286.  
  287. /* -------------------------------------------------------------------
  288.    lock and unlock data records: lokmod: FREE(0) / ENABLE(2) / READREC
  289.  */
  290.  
  291. COUNT LOKREC(datno,lokmod,recbyt)
  292. COUNT         datno,lokmod;
  293. POINTER              recbyt;
  294. {
  295.     CTFILE      *tstfnm();
  296. #ifdef MUSTFRCE
  297.     FAST CTFILE *dnum;
  298. #endif
  299.     uerr_cod = 0;
  300.  
  301. #ifdef MUSTFRCE
  302.     if ((dnum = tstfnm(datno)) == NULL)
  303.         return(uerr_cod);
  304.     else if (dnum->clstyp == IDX_CLOSE)
  305.         return(uerr_cod = FMOD_ERR);
  306.  
  307.     if (lokmod == FREE)
  308.         return(uerr_cod = UDLOCK(recbyt,dnum));
  309.     else if (lokmod == READREC)
  310.         return(uerr_cod =  RLOCK(recbyt,dnum));
  311.     else
  312.         return(uerr_cod =  DLOCK(recbyt,dnum));
  313. #else
  314.     return(NO_ERROR);
  315. #endif
  316. }
  317.  
  318. /* end of ctdatf.c */
  319.