:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / msvcrt / stdio / freopen.c
1 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
2
3 #include <msvcrt/sys/types.h>
4 #include <msvcrt/stdio.h>
5 #include <msvcrt/fcntl.h>
6 #include <msvcrt/io.h>
7 #include <msvcrt/internal/file.h>
8
9
10 FILE *freopen(const char *file, const char *mode, FILE *f)
11 {
12   int fd, rw, oflags=0;
13   char tbchar;
14
15   if (file == 0 || mode == 0 || f == 0)
16     return 0;
17
18   rw = (mode[1] == '+');
19
20   fclose(f);
21
22   switch (*mode) {
23   case 'a':
24     oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
25     break;
26   case 'r':
27     oflags = rw ? O_RDWR : O_RDONLY;
28     break;
29   case 'w':
30     oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
31     break;
32   default:
33     return NULL;
34   }
35   if (mode[1] == '+')
36     tbchar = mode[2];
37   else
38     tbchar = mode[1];
39   if (tbchar == 't')
40     oflags |= O_TEXT;
41   else if (tbchar == 'b')
42     oflags |= O_BINARY;
43   else
44     oflags |= (_fmode & (O_TEXT|O_BINARY));
45
46   fd = _open(file, oflags, 0666);
47   if (fd < 0)
48     return NULL;
49
50   if (*mode == 'a')
51     lseek(fd, 0, SEEK_END);
52
53   f->_cnt = 0;
54   f->_file = fd;
55   f->_bufsiz = 0;
56   if (rw)
57     f->_flag = _IOREAD | _IOWRT;
58   else if (*mode == 'r')
59     f->_flag = _IOREAD;
60   else
61     f->_flag = _IOWRT;
62
63   f->_base = f->_ptr = NULL;
64   return f;
65 }
66
67 FILE *_wfreopen(const wchar_t *file, const wchar_t *mode, FILE *f)
68 {
69   int fd, rw, oflags=0;
70   wchar_t tbchar;
71
72   if (file == 0 || mode == 0 || f == 0)
73     return 0;
74
75   rw = (mode[1] == L'+');
76
77   fclose(f);
78
79   switch (*mode) {
80   case L'a':
81     oflags = O_CREAT | (rw ? O_RDWR : O_WRONLY);
82     break;
83   case L'r':
84     oflags = rw ? O_RDWR : O_RDONLY;
85     break;
86   case L'w':
87     oflags = O_TRUNC | O_CREAT | (rw ? O_RDWR : O_WRONLY);
88     break;
89   default:
90     return NULL;
91   }
92   if (mode[1] == L'+')
93     tbchar = mode[2];
94   else
95     tbchar = mode[1];
96   if (tbchar == L't')
97     oflags |= O_TEXT;
98   else if (tbchar == L'b')
99     oflags |= O_BINARY;
100   else
101     oflags |= (_fmode & (O_TEXT|O_BINARY));
102
103   fd = _wopen(file, oflags, 0666);
104   if (fd < 0)
105     return NULL;
106
107   if (*mode == L'a')
108     lseek(fd, 0, SEEK_END);
109
110   f->_cnt = 0;
111   f->_file = fd;
112   f->_bufsiz = 0;
113   if (rw)
114     f->_flag = _IOREAD | _IOWRT;
115   else if (*mode == L'r')
116     f->_flag = _IOREAD;
117   else
118     f->_flag = _IOWRT;
119
120   f->_base = f->_ptr = NULL;
121   return f;
122 }