home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-4 / BDSLIB.ARK / FOPEN.C < prev    next >
Text File  |  1983-07-15  |  4KB  |  132 lines

  1. /*
  2.  * fopen
  3.  * This function is quite different from the function of the same
  4.  * name in the BDS C Standard Library. It is also different from
  5.  * the function used in almost every implementation of the U**X
  6.  * Standard C Library (they vary wildly in what `mode' means).
  7.  * This version of fopen accepts 4 types of modes as follows:
  8.  * "r", read mode, opens an existing file for read only. "w", write
  9.  * mode, opens a new file for writing clobbering any existing files
  10.  * of the same name. If the file is read only it returns NULL. "u",
  11.  * update mode, opens an existing file for read/write faccess. If
  12.  * the file is read only, it returns NULL. "a", append mode opens
  13.  * an existing file for read/write with the file pointer at the
  14.  * end of the file. It also returns NULL if the file is read only.
  15.  * Edit of 7/8/83
  16.  */
  17.  
  18. FILE *
  19. fopen(filename,mode)
  20. char *filename, *mode;
  21. {
  22.     FILE *stream;
  23.     int i, omode;
  24.  
  25.     if (filename == NULL || mode == NULL)
  26.         return NULL;
  27.     for (i = 0; i < _NFILE; i++) {    /* look for a buffer    */
  28.         if (filebuf[i]._base == NULL)
  29.             break;        /* got an io buffer    */
  30.         if (i == (_NFILE - 1))    /* no buffers available    */
  31.             return NULL;
  32.     }
  33.     stream = (&filebuf[i]);        /* assign the io buffer    */
  34.     if ((stream -> _base = malloc(BUFSIZ)) == NULL)
  35.         return NULL;
  36.     if (mode[0] == 'r')
  37.         omode = 0;
  38.     if (mode[0] == 'w') {
  39.         if (faccess(filename,2)<0)
  40.             if (faccess(filename,0) == 0) {
  41.                 free(stream -> _base);
  42.                 stream -> _base = NULL;
  43.                 return NULL;
  44.             }
  45.         if ((stream->_fd=creat(filename))<0) {
  46.             free(stream -> _base);
  47.             stream -> _base = NULL;
  48.             return NULL;
  49.         }
  50.         stream -> _nextp = stream -> _base;
  51.         stream -> _nleft = BUFSIZ;
  52.         stream -> _flag = _IOWRT;
  53.         return stream;
  54.     }
  55.     if (mode[0] == 'u' || mode[0] == 'a') {
  56.         omode = 2;
  57.         if (faccess(filename,2)<0)
  58.             if (faccess(filename,0) == 0) {
  59.                 free(stream -> _base);
  60.                 stream -> _base = NULL;
  61.                 return NULL;
  62.             }
  63.     }
  64.     if ((stream -> _fd = open(filename,omode))<0) {
  65.         free(stream -> _base);
  66.         stream -> _base = NULL;
  67.         return NULL;
  68.     }
  69.     if (mode[0] == 'a')
  70.         seek(stream->_fd,0,2);
  71.     stream -> _nleft = 0;
  72.     stream -> _flag = 0;
  73.     if (omode = 0)
  74.         stream -> _flag |= _IOREAD;
  75.     stream -> _flag |= _IOWRT;
  76.     return stream;
  77. }
  78.  
  79. /*
  80.  * fclose
  81.  * Conforms very closely to the function in the Version 7 U**X
  82.  * Standard C Library. It closes the specified stream, flushes
  83.  * the i/o buffer and frees the i/o buffer used bye the stream.
  84.  * Last Edit 7/1/83
  85.  */
  86.  
  87. int
  88. fclose(stream)
  89. FILE *stream;
  90. {
  91.     int i;
  92.     if (isatty(stream))        /* can't close a tty    */
  93.         return ERROR;
  94.     fflush(stream);            /* flush the io buffer    */
  95.     i = close(stream -> _fd);    /* close the file    */
  96.     free(stream -> _base);        /* free the io buffer    */
  97.     return 0;
  98. }
  99.  
  100. /*
  101.  * fflush
  102.  * This performs essentially the same task as the function
  103.  * of the same name in the BDS C 1.5 Standard library. It
  104.  * need not be invoked before calls to fclose to assure
  105.  * that the i/o buffer is flushed.
  106.  * Last Edit 7/1/83
  107.  */
  108.  
  109. int
  110. fflush(stream)
  111. FILE *stream;
  112. {
  113.     int i;
  114.     if (isatty(stream))
  115.         return 0;
  116.     if (stream -> _nleft == BUFSIZ)
  117.         return 0;
  118.     i = NSECTS - stream -> _nleft / SECSIZ;
  119.     if (write(stream -> _fd, stream -> _base, i) != i)
  120.             return ERROR;
  121.     i = (i-1) * SECSIZ;
  122.     if (stream -> _nleft) {
  123.         movmem(stream -> _base + i, stream -> _base, SECSIZ);
  124.         stream -> _nleft += i;
  125.         stream -> _nextp -= i;
  126.         return seek(stream->_fd, -1, 1);
  127.     }
  128.     stream -> _nleft = BUFSIZ;
  129.     stream -> _nextp = stream -> _base;
  130.     return 0;
  131. }
  132.