Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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 * fopen(const char *file, const char *mode)
  12. {
  13.   FILE *f;
  14.   int fd, rw, oflags = 0;
  15.   char tbchar;
  16.  
  17.   if (file == 0)
  18.     return 0;
  19.   if (mode == 0)
  20.     return 0;
  21.  
  22.   f = __alloc_file();
  23.   if (f == NULL)
  24.     return NULL;
  25.  
  26.   rw = (mode[1] == '+') || (mode[1] && (mode[2] == '+'));
  27.  
  28.   switch (*mode)
  29.   {
  30.   case 'a':
  31.     oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
  32.     break;
  33.   case 'r':
  34.     oflags = rw ? O_RDWR : O_RDONLY;
  35.     break;
  36.   case 'w':
  37.     oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
  38.     break;
  39.   default:
  40.     return (NULL);
  41.   }
  42.   if (mode[1] == '+')
  43.     tbchar = mode[2];
  44.   else
  45.     tbchar = mode[1];
  46.   if (tbchar == 't')
  47.     oflags |= O_TEXT;
  48.   else if (tbchar == 'b')
  49.     oflags |= O_BINARY;
  50.   else
  51.     oflags |= (_fmode & (O_TEXT|O_BINARY));
  52.  
  53.   fd = open(file, oflags, 0666);
  54.   if (fd < 0)
  55.     return NULL;
  56.  
  57.   if (*mode == 'a')
  58.     lseek(fd, 0, SEEK_END);
  59.  
  60.   f->_cnt = 0;
  61.   f->_file = fd;
  62.   f->_bufsiz = 0;
  63.   if (rw)
  64.     f->_flag = _IORW;
  65.   else if (*mode == 'r')
  66.     f->_flag = _IOREAD;
  67.   else
  68.     f->_flag = _IOWRT;
  69.  
  70.   f->_base = f->_ptr = NULL;
  71.   f->std_ops=NULL;
  72. //  __libclog_printf("fopen: return=%x\n",f);
  73.   return f;
  74. }
  75.