Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4973 right-hear 1
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include 
8
#include 
9
#include 
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
}