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

  1. /*
  2.  *    file creation
  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();
  30. UCOUNT inrfil();
  31.  
  32.  
  33. /* CREDAT creates the data file with name pointed to by filnam, 
  34.    and assigns datno to the data file.
  35.  */
  36.  
  37. COUNT CREDAT(datno,filnam,datlen,xtdsiz,filmod)
  38.  
  39. COUNT  datno;      /* data number temporary assigned to file     */
  40. TEXT  *filnam;     /* pointer to data file name             */
  41. UCOUNT datlen;     /* minimum record length             */
  42. UCOUNT xtdsiz;    /* how many bytes to extend file        */
  43. COUNT  filmod;    /* file mode parameter (VIRTUAL, VLENG or PERMANENT)     */
  44.  
  45. {
  46.     FAST CTFILE *ctnum;
  47.     LONG         temp;
  48.     COUNT mbclos();
  49.     COUNT wrthdr();
  50.     RNDFILE mbopen(),mbcrat();
  51.  
  52.     uerr_cod = 0;
  53.     ctnum    = ct_key + datno;
  54.     filmod  &= ~NONEXCLUSIVE;
  55.     if (datno < 0 || ct_mxfil <= datno)
  56.         uerr_cod = FNUM_ERR;
  57. #ifdef CTSERVER
  58.     else if (ctnum->chnacs != 'c')
  59.         terr(993);
  60. #else
  61.     else if (ctnum->chnacs != 'n')
  62.         uerr_cod = FUSE_ERR;
  63. #endif
  64.     else if (filmod & VLENGTH) {
  65. #ifdef VARLDATA
  66.           ctnum->recsiz = (ct_ndsec < 2 ? 1 : 2) * SECSIZ;
  67.         ctnum->maxkbn = ctnum->recsiz - STATUS;
  68.           ctnum->maxkvn = ctnum->maxkbn / (VARI_LEN + sizeof(POINTER));
  69.           if (ctnum->maxkvn < 3)
  70.             uerr_cod = KMIN_ERR;
  71.           else if (VARI_LEN > MAXLEN)
  72.             uerr_cod = KLEN_ERR;
  73.             else {
  74.             ctnum->maxkvl = ctnum->maxkbn / VARI_LEN;
  75.             ctnum->maxkbl = (ctnum->maxkvl - 1) * VARI_LEN;
  76.         }
  77. #else
  78.         uerr_cod = FTYP_ERR;
  79. #endif
  80.     } else if (datlen < (sizeof(POINTER) + 1))
  81.         uerr_cod = DREC_ERR;
  82.  
  83.     if (!uerr_cod) {
  84.         ctnum->reclen = datlen;
  85.         ctnum->filnum = datno;
  86.         ctnum->flmode = filmod;
  87.         ctnum->usecnt = 0;
  88.         strcpy(ctnum->flname,filnam);
  89. #ifdef CT_ANSI
  90.         if ((ctnum->fd = mbopen(ctnum,filmod)) != (RNDFILE) NULL) {
  91. #else
  92.         if ((ctnum->fd = mbopen(ctnum,filmod)) >= 0) {/* file exists */
  93. #endif
  94.         mbclos(ctnum,filmod);
  95.         uerr_cod = DOPN_ERR;
  96. #ifdef CT_ANSI
  97.         } else if ((ctnum->fd = mbcrat(ctnum)) == (RNDFILE) NULL)
  98. #else
  99.         } else if ((ctnum->fd = mbcrat(ctnum)) < 0)
  100. #endif
  101.         uerr_cod = DCRAT_ERR;
  102.     }
  103.  
  104.     if (uerr_cod)
  105.         return(uerr_cod);
  106.     else {
  107.         ctnum->chnacs  = 'y';
  108.         ctnum->delstk  = DRNZERO;
  109.         ctnum->nmem    = ctnum->kmem = 0;
  110.         if (filmod & VLENGTH) {
  111.             ctnum->numrec = ctnum->recsiz - 1;
  112.             ctnum->clstyp = VAT_CLOSE;
  113.             ctnum->length = VARI_LEN;
  114.         } else {
  115.             ctnum->numrec = (((SECSIZ + datlen - 1) / datlen) *
  116.                 datlen) - 1;
  117.             ctnum->clstyp = DAT_CLOSE;
  118.             ctnum->recsiz = ctnum->length = 0;
  119.         }
  120.         ctnum->phyrec  = ctnum->numrec;
  121.         ctnum->extsiz  = xtdsiz;
  122.         ctnum->updflg  = NO;
  123.         ctnum->verson  = ct_ver;
  124.         ctnum->nodstk  = ctnum->root   = NODEZERO;
  125.         ctnum->ktype   = 0;
  126.         ctnum->nument  = ctnum->sernum = DRNZERO;
  127.         ctnum->autodup = 1;
  128.  
  129.         if ((temp = ct_mxbuf * (LONG) ct_ndsec * SECSIZ) > ctnum->numrec)
  130.             temp = ctnum->numrec + 1;
  131.         ctio(CTWRITE,ctnum,DRNZERO,ct_origin,(UCOUNT) temp);
  132.         if (wrthdr(ctnum))
  133.             return(uerr_cod);
  134.  
  135.         ctnum->retelm = ctnum->lokcnt = ctnum->srlpos = 0;
  136.         ctnum->retnod = NODEZERO;
  137.         ctnum->usecnt = inrfil(ctnum);
  138.         return(NO_ERROR);
  139.     }
  140. }
  141.  
  142.  
  143. /* CREIDX creates the index file with name pointed to by filnam,
  144.    assigns keyno to the index file
  145.  */
  146.  
  147. COUNT CREIDX(keyno,filnam,keylen,keytyp,keydup,nomemb,xtdsiz,filmod)
  148.  
  149. COUNT  keyno;      /* key number temporary assigned to index file         */
  150. COUNT  keylen;     /* key length                         */
  151. TEXT  *filnam;     /* pointer index file name                 */
  152. COUNT  keytyp;  /* key type indicator: 0 - ALPHAKEY   => alphanumeric    */
  153.         /*               1 - INTKEY     => right-to-left    */
  154.         /*               2 - SFLOATKEY  => float        */
  155.         /*               3 - DFLOATKEY  => double float    */
  156.         /*               4 - COL_PREFIX => compress beg    */
  157.         /*               8 - COL_SUFFIX => compress end    */
  158.         /*              12 - COL_BOTH   => 2 & 4        */
  159. COUNT  keydup;  /* auto duplicate indicator DUPKEY/NODUPKEY         */
  160. COUNT  nomemb;    /* number of additional indices in file            */
  161. UCOUNT xtdsiz;    /* file extension size                    */
  162. COUNT  filmod;    /* file mode (VIRTUAL or PERMANENT)            */
  163.  
  164. {
  165.     FAST KEYFILE *knum;
  166.     UCOUNT        i;
  167.  
  168.     COUNT mbclos();
  169.     COUNT wrthdr();
  170.     RNDFILE mbopen(),mbcrat();
  171.  
  172.     uerr_cod = 0;
  173.     if (nomemb < 0 || nomemb > MAXMEMB)
  174.         return(uerr(KMEM_ERR));
  175.     if (keyno < 0 || ct_mxfil <= (keyno + nomemb))
  176.         return(uerr(FNUM_ERR));
  177.  
  178. #ifdef CTSERVER
  179.     for (knum = ct_key + keyno, i = 0; i <= nomemb; i++,knum = knum->xmem)
  180.         if (knum->chnacs != 'c')
  181.             terr(992);
  182. #else
  183.     for (knum = ct_key + keyno, i = 0; i <= nomemb; i++,knum++)
  184.         if (knum->chnacs != 'n')
  185.             return(uerr(FUSE_ERR));
  186. #endif
  187.  
  188.     filmod        &= ~NONEXCLUSIVE;
  189.     knum         = ct_key + keyno;
  190.     knum->kmem   = 0;
  191.     knum->recsiz = ct_ndsec * SECSIZ;
  192.     knum->maxkbn = knum->recsiz - STATUS;
  193.     i            = keylen;
  194.  
  195. #ifdef VARLKEYS
  196.     if (keytyp & COL_PREFIX)
  197.         i++;
  198.     if (keytyp & COL_SUFFIX)
  199.         i++;
  200. #endif
  201.  
  202.     knum->maxkvn = knum->maxkbn / (i + sizeof(POINTER));
  203.     if (knum->maxkvn < 3)
  204.         uerr_cod = KMIN_ERR;
  205.     else if (keylen > MAXLEN)
  206.         uerr_cod = KLEN_ERR;
  207. #ifndef VARLKEYS
  208.     else if (keytyp & COL_BOTH)
  209.         uerr_cod = KTYP_ERR;
  210. #endif
  211. #ifndef FLOATKEY
  212.     else if (keytyp == SFLOATKEY || keytyp == DFLOATKEY)
  213.         uerr_cod = KTYP_ERR;
  214. #endif
  215.     else {
  216.         if (keydup == DUPKEY) {
  217.         knum->maxkvl = knum->maxkbn / i;
  218.         knum->maxkbl = (knum->maxkvl - 1) * i;
  219.         } else {
  220.         knum->maxkvl = knum->maxkvn;
  221.         knum->maxkbl = knum->maxkvl * (i + sizeof(POINTER)) - i;
  222.         }
  223.  
  224.         knum->flmode = filmod;
  225.         knum->usecnt = 0;
  226.         strcpy(knum->flname,filnam);
  227. #ifdef CT_ANSI
  228.         if ((knum->fd = mbopen(knum,filmod)) != (RNDFILE) NULL) {
  229. #else
  230.         if ((knum->fd = mbopen(knum,filmod)) >= 0) {/* file exists */
  231. #endif
  232.         mbclos(knum,filmod);
  233.         uerr_cod = KOPN_ERR;
  234. #ifdef CT_ANSI
  235.         } else if ((knum->fd = mbcrat(knum)) == (RNDFILE) NULL)
  236. #else
  237.         } else if ((knum->fd = mbcrat(knum)) < 0)
  238. #endif
  239.         uerr_cod = KCRAT_ERR;
  240.     }
  241.  
  242.     if (uerr_cod)
  243.         return(uerr_cod);
  244.     else {
  245.         knum->nmem    = nomemb;
  246.         knum->chnacs  = 'y';
  247.         knum->filnum  = keyno;
  248.         knum->nodstk  = knum->root   = NODEZERO;
  249.         knum->length  = keylen;
  250.         knum->ktype   = keytyp;
  251.         knum->nument  = knum->sernum = DRNZERO;
  252.         knum->extsiz  = xtdsiz;
  253.         i             = (HDRSIZ * (nomemb + 1)) + knum->recsiz - 1;
  254.         knum->numrec  = knum->phyrec = ((i / knum->recsiz) *
  255.                     knum->recsiz) - 1;
  256.         knum->autodup = keydup;
  257.         knum->updflg  = NO;
  258.         knum->verson  = ct_ver;
  259.         knum->clstyp  = IDX_CLOSE;
  260.  
  261.         ctio(CTWRITE,knum,DRNZERO,ct_origin,(UCOUNT) (knum->numrec + 1));
  262.         if (wrthdr(knum))
  263.             return(uerr_cod);
  264.  
  265.         knum->retelm = knum->lokcnt = 0;
  266.         knum->retnod = NODEZERO;
  267.         knum->usecnt = inrfil(knum);
  268. #ifdef CTSERVER
  269.         for (i = 1; i++ <= nomemb; ) {
  270.             knum         = knum->xmem;
  271.             knum->chnacs = 'm';
  272.         }
  273. #else
  274.         for (i = 1; i++ <= nomemb; )
  275.             (++knum)->chnacs = 'm';
  276. #endif
  277.         return(NO_ERROR);
  278.     }
  279. }
  280.  
  281. COUNT CREMEM(keyno,keylen,keytyp,keydup,membno)
  282.  
  283. COUNT  keyno;      /* key number temporary to master index file         */
  284. COUNT  keylen;     /* key length                         */
  285. COUNT  keytyp;  /* key type indicator ALPHAKEY => alphanumeric
  286.                       INTKEY   => n byte integer     */
  287. COUNT  keydup;  /* auto duplicate indicator DUPKEY/NODUPKEY         */
  288. COUNT  membno;    /* member number of index in master file        */
  289.  
  290. {
  291.     FAST KEYFILE *knum;
  292.     COUNT         i;
  293.  
  294.     COUNT   wrthdr();
  295.     CTFILE *tstfnm();
  296.  
  297.  
  298.     uerr_cod = 0;
  299.     if ((knum = tstfnm(keyno)) == NULL)
  300.         /* no action */ ;
  301.     else if (knum->clstyp != IDX_CLOSE)
  302.         uerr_cod = FMOD_ERR;
  303.     else if (membno <= 0 || membno > knum->nmem)
  304.         uerr_cod = KMEM_ERR;
  305. #ifdef CTSERVER
  306.     else {
  307.         for (i = 1; i <= membno; i++)
  308.             knum = knum->xmem;
  309.         if (knum->chnacs != 'm')
  310.             uerr_cod = FUSE_ERR;    
  311.     }
  312. #else
  313.     else if ((knum += membno)->chnacs != 'm')
  314.         uerr_cod = FUSE_ERR;
  315. #endif
  316.     if (uerr_cod)
  317.         return(uerr_cod);
  318.  
  319.     knum->nmem   = -1;
  320.     knum->kmem   = membno;
  321. #ifdef CT_ANSI
  322.     knum->fd     = (RNDFILE) NULL;
  323. #else
  324.     knum->fd     = -1;
  325. #endif
  326.     knum->recsiz = ct_ndsec * SECSIZ;
  327.     knum->maxkbn = knum->recsiz - STATUS;
  328.     i            = keylen;
  329.  
  330. #ifdef VARLKEYS
  331.     if (keytyp & COL_PREFIX)
  332.         i++;
  333.     if (keytyp & COL_SUFFIX)
  334.         i++;
  335. #endif
  336.  
  337.     knum->maxkvn = knum->maxkbn / (i + sizeof(POINTER));
  338.  
  339.     if (knum->maxkvn < 3)
  340.         return(uerr(KMIN_ERR));
  341.     else if (keylen > MAXLEN)
  342.         return(uerr(KLEN_ERR));
  343. #ifndef VARLKEYS
  344.     else if (keytyp & COL_BOTH)
  345.         return(uerr(KTYP_ERR));
  346. #endif
  347. #ifndef FLOATKEY
  348.     else if (keytyp == SFLOATKEY || keytyp == DFLOATKEY)
  349.         return(uerr(KTYP_ERR));
  350. #endif
  351.  
  352.     if (keydup == DUPKEY) {
  353.         knum->maxkvl = knum->maxkbn / i;
  354.         knum->maxkbl = (knum->maxkvl - 1) * i;
  355.     } else {
  356.         knum->maxkvl = knum->maxkvn;
  357.         knum->maxkbl = knum->maxkvl * (i + sizeof(POINTER)) - i;
  358.     }
  359.  
  360.     knum->flmode  = -1;
  361.     knum->usecnt  = 0;
  362.     knum->chnacs  = 'y';
  363. #ifdef CTSERVER
  364.     knum->filnum  = knum - ct_key;
  365. #else
  366.     knum->filnum  = keyno + membno;
  367. #endif
  368.     knum->nodstk  = knum->root   = NODEZERO;
  369.     knum->length  = keylen;
  370.     knum->ktype   = keytyp;
  371.     knum->nument  = knum->sernum = DRNZERO;
  372.     knum->extsiz  = -1;
  373.     knum->numrec  = knum->phyrec = - 1;
  374.     knum->autodup = keydup;
  375.     knum->updflg  = NO;
  376.     knum->verson  = ct_ver;
  377.     knum->clstyp  = IDX_CLOSE;
  378.  
  379.     if (wrthdr(knum))
  380.         return(uerr_cod);
  381.  
  382.     knum->retelm = knum->lokcnt = 0;
  383.     knum->retnod = NODEZERO;
  384.     return(NO_ERROR);
  385. }
  386.  
  387. /* end of ctkeyf.c */
  388.