home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / ansi / stdio / fopen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-23  |  1.4 KB  |  74 lines

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <libc/stubs.h>
  3. #include <sys/types.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <libc/file.h>
  8. #include <libc/local.h>
  9. #include <libc/dosio.h>
  10.  
  11. FILE *
  12. fopen(const char *file, const char *mode)
  13. {
  14.   FILE *f;
  15.   int fd, rw, oflags = 0;
  16.   char tbchar;
  17.  
  18.   if (file == 0)
  19.     return 0;
  20.   if (mode == 0)
  21.     return 0;
  22.  
  23.   f = __alloc_file();
  24.   if (f == NULL)
  25.     return NULL;
  26.  
  27.   rw = (mode[1] == '+') || (mode[1] && (mode[2] == '+'));
  28.  
  29.   switch (*mode)
  30.   {
  31.   case 'a':
  32.     oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
  33.     break;
  34.   case 'r':
  35.     oflags = rw ? O_RDWR : O_RDONLY;
  36.     break;
  37.   case 'w':
  38.     oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
  39.     break;
  40.   default:
  41.     return (NULL);
  42.   }
  43.   if (mode[1] == '+')
  44.     tbchar = mode[2];
  45.   else
  46.     tbchar = mode[1];
  47.   if (tbchar == 't')
  48.     oflags |= O_TEXT;
  49.   else if (tbchar == 'b')
  50.     oflags |= O_BINARY;
  51.   else
  52.     oflags |= (_fmode & (O_TEXT|O_BINARY));
  53.  
  54.   fd = open(file, oflags, 0666);
  55.   if (fd < 0)
  56.     return NULL;
  57.  
  58.   if (*mode == 'a')
  59.     lseek(fd, 0, SEEK_END);
  60.  
  61.   f->_cnt = 0;
  62.   f->_file = fd;
  63.   f->_bufsiz = 0;
  64.   if (rw)
  65.     f->_flag = _IORW;
  66.   else if (*mode == 'r')
  67.     f->_flag = _IOREAD;
  68.   else
  69.     f->_flag = _IOWRT;
  70.  
  71.   f->_base = f->_ptr = NULL;
  72.   return f;
  73. }
  74.