home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CBASE09.ZIP / LSEQ.ZIP / LSCREATE.C < prev    next >
Text File  |  1989-08-30  |  3KB  |  121 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "lscreate.c    1.1 - 89/07/03" */
  5.  
  6. #include <blkio.h>
  7. #include <errno.h>
  8. /* #include <string.h> */
  9. #include "lseq_.h"
  10.  
  11. /*man---------------------------------------------------------------------------
  12. NAME
  13.      lscreate - create an lseq
  14.  
  15. SYNOPSIS
  16.      int lscreate(filename, recsize)
  17.      char *filename;
  18.      size_t recsize;
  19.  
  20. DESCRIPTION
  21.      The lscreate function creates the file named by filename as an lseq.
  22.  
  23.      filename points to a character string that contains the name of the
  24.      file to be created.
  25.  
  26.      lscreate will fail if one or more of the following is true:
  27.  
  28.      [EINVAL]       filename is the NULL pointer.
  29.      [EINVAL]       recsize is less than 1.
  30.      [LSEMFILE]     Too many open lseqs.  The maximum
  31.                     is defined as LSOPEN_MAX in lseq.h.
  32.  
  33. SEE ALSO
  34.      lsopen.
  35.  
  36. DIAGNOSTICS
  37.      Upon successful completion, a value of 0 is returned.  Otherwise, a
  38.      value of -1 is returned, and errno set to indicate the error.
  39.  
  40. ------------------------------------------------------------------------------*/
  41. int lscreate(filename, recsize)
  42. char * filename;
  43. size_t recsize;
  44. {
  45.     int        rs    = 0;
  46.     int        terrno    = 0;
  47.     lseq_t *    lsp    = NULL;
  48.  
  49.     errno = 0;
  50.  
  51.     /* validate input parameters */
  52.     if ((filename == NULL) || (recsize < 1)) {
  53.         errno = EINVAL;
  54.         return -1;
  55.     }
  56.  
  57.     /* find free slot in lsb table */
  58.     for (lsp = lsb; lsp < (lsb + LSOPEN_MAX); lsp++) {
  59.         if (!(lsp->flags & LSOPEN)) {
  60.             break;        /* found */
  61.         }
  62.     }
  63.     if (lsp >= lsb + LSOPEN_MAX) {
  64.         errno = LSEMFILE;
  65.         return -1;        /* no free slots */
  66.     }
  67.  
  68.     /* load lseq_t structure */
  69.     lsp->lshdr.flh = 0;
  70.     lsp->lshdr.recsize = recsize;
  71.     lsp->lshdr.flags = 0;
  72.     lsp->lshdr.first = 0;
  73.     lsp->lshdr.last = 0;
  74.     lsp->lshdr.reccnt = 0;
  75.     lsp->bp = NULL;
  76.     lsp->flags = LSREAD | LSWRITE;
  77.     lsp->clspos = 0;
  78.     lsp->clsrp = NULL;
  79.     rs = ls_alloc(lsp);
  80.     if (rs == -1) {
  81.         LSEPRINT;
  82.         memset((void *)lsp, 0, sizeof(lsb[0]));
  83.         lsp->flags = 0;
  84.         return -1;
  85.     }
  86.  
  87.     /* create file */
  88.     lsp->bp = bopen(filename, "c", sizeof(lshdr_t), (size_t)1,(size_t)0);
  89.     if (lsp->bp == NULL) {
  90.         if (errno != EEXIST) LSEPRINT;
  91.         ls_free(lsp);
  92.         memset((void *)lsp, 0, sizeof(lsb[0]));
  93.         lsp->flags = 0;
  94.         return -1;
  95.     }
  96.  
  97.     /* write header to file */
  98.     rs = bputh(lsp->bp, (void *)&lsp->lshdr);    /* header */
  99.     if (rs == -1) {
  100.         LSEPRINT;
  101.         terrno = errno;
  102.         bclose(lsp->bp);
  103.         ls_free(lsp);
  104.         memset((void *)lsp, 0, sizeof(lsb[0]));
  105.         lsp->flags = 0;
  106.         errno = terrno;
  107.         return -1;
  108.     }
  109.  
  110.     /* close lsp */
  111.     rs = lsclose(lsp);
  112.     if (rs == -1) {
  113.         LSEPRINT;
  114.         ls_free(lsp);
  115.         return -1;
  116.     }
  117.  
  118.     errno = 0;
  119.     return 0;
  120. }
  121.