|
1 /* |
|
2 ****************************************************************************** |
|
3 * |
|
4 * Copyright (C) 1997-2011, International Business Machines |
|
5 * Corporation and others. All Rights Reserved. |
|
6 * |
|
7 ****************************************************************************** |
|
8 * |
|
9 * File FILESTRM.C |
|
10 * |
|
11 * @author Glenn Marcy |
|
12 * |
|
13 * Modification History: |
|
14 * |
|
15 * Date Name Description |
|
16 * 5/8/98 gm Created |
|
17 * 03/02/99 stephen Reordered params in ungetc to match stdio |
|
18 * Added wopen |
|
19 * 3/29/99 helena Merged Stephen and Bertrand's changes. |
|
20 * |
|
21 ****************************************************************************** |
|
22 */ |
|
23 |
|
24 #include "filestrm.h" |
|
25 |
|
26 #include "cmemory.h" |
|
27 |
|
28 #include <stdio.h> |
|
29 |
|
30 U_CAPI FileStream* U_EXPORT2 |
|
31 T_FileStream_open(const char* filename, const char* mode) |
|
32 { |
|
33 if(filename != NULL && *filename != 0 && mode != NULL && *mode != 0) { |
|
34 FILE *file = fopen(filename, mode); |
|
35 return (FileStream*)file; |
|
36 } else { |
|
37 return NULL; |
|
38 } |
|
39 } |
|
40 |
|
41 /* |
|
42 U_CAPI FileStream* U_EXPORT2 |
|
43 T_FileStream_wopen(const wchar_t* filename, const wchar_t* mode) |
|
44 { |
|
45 // TBD: _wfopen is believed to be MS-specific? |
|
46 #if U_PLATFORM_USES_ONLY_WIN32_API |
|
47 FILE* result = _wfopen(filename, mode); |
|
48 return (FileStream*)result; |
|
49 #else |
|
50 size_t fnMbsSize, mdMbsSize; |
|
51 char *fn, *md; |
|
52 FILE *result; |
|
53 |
|
54 // convert from wchar_t to char |
|
55 fnMbsSize = wcstombs(NULL, filename, ((size_t)-1) >> 1); |
|
56 fn = (char*)uprv_malloc(fnMbsSize+2); |
|
57 wcstombs(fn, filename, fnMbsSize); |
|
58 fn[fnMbsSize] = 0; |
|
59 |
|
60 mdMbsSize = wcstombs(NULL, mode, ((size_t)-1) >> 1); |
|
61 md = (char*)uprv_malloc(mdMbsSize+2); |
|
62 wcstombs(md, mode, mdMbsSize); |
|
63 md[mdMbsSize] = 0; |
|
64 |
|
65 result = fopen(fn, md); |
|
66 uprv_free(fn); |
|
67 uprv_free(md); |
|
68 return (FileStream*)result; |
|
69 #endif |
|
70 } |
|
71 */ |
|
72 U_CAPI void U_EXPORT2 |
|
73 T_FileStream_close(FileStream* fileStream) |
|
74 { |
|
75 if (fileStream != 0) |
|
76 fclose((FILE*)fileStream); |
|
77 } |
|
78 |
|
79 U_CAPI UBool U_EXPORT2 |
|
80 T_FileStream_file_exists(const char* filename) |
|
81 { |
|
82 FILE* temp = fopen(filename, "r"); |
|
83 if (temp) { |
|
84 fclose(temp); |
|
85 return TRUE; |
|
86 } else |
|
87 return FALSE; |
|
88 } |
|
89 |
|
90 /*static const int32_t kEOF; |
|
91 const int32_t FileStream::kEOF = EOF;*/ |
|
92 |
|
93 /* |
|
94 U_CAPI FileStream* |
|
95 T_FileStream_tmpfile() |
|
96 { |
|
97 FILE* file = tmpfile(); |
|
98 return (FileStream*)file; |
|
99 } |
|
100 */ |
|
101 |
|
102 U_CAPI int32_t U_EXPORT2 |
|
103 T_FileStream_read(FileStream* fileStream, void* addr, int32_t len) |
|
104 { |
|
105 return fread(addr, 1, len, (FILE*)fileStream); |
|
106 } |
|
107 |
|
108 U_CAPI int32_t U_EXPORT2 |
|
109 T_FileStream_write(FileStream* fileStream, const void* addr, int32_t len) |
|
110 { |
|
111 |
|
112 return fwrite(addr, 1, len, (FILE*)fileStream); |
|
113 } |
|
114 |
|
115 U_CAPI void U_EXPORT2 |
|
116 T_FileStream_rewind(FileStream* fileStream) |
|
117 { |
|
118 rewind((FILE*)fileStream); |
|
119 } |
|
120 |
|
121 U_CAPI int32_t U_EXPORT2 |
|
122 T_FileStream_putc(FileStream* fileStream, int32_t ch) |
|
123 { |
|
124 int32_t c = fputc(ch, (FILE*)fileStream); |
|
125 return c; |
|
126 } |
|
127 |
|
128 U_CAPI int U_EXPORT2 |
|
129 T_FileStream_getc(FileStream* fileStream) |
|
130 { |
|
131 int c = fgetc((FILE*)fileStream); |
|
132 return c; |
|
133 } |
|
134 |
|
135 U_CAPI int32_t U_EXPORT2 |
|
136 T_FileStream_ungetc(int32_t ch, FileStream* fileStream) |
|
137 { |
|
138 |
|
139 int32_t c = ungetc(ch, (FILE*)fileStream); |
|
140 return c; |
|
141 } |
|
142 |
|
143 U_CAPI int32_t U_EXPORT2 |
|
144 T_FileStream_peek(FileStream* fileStream) |
|
145 { |
|
146 int32_t c = fgetc((FILE*)fileStream); |
|
147 return ungetc(c, (FILE*)fileStream); |
|
148 } |
|
149 |
|
150 U_CAPI char* U_EXPORT2 |
|
151 T_FileStream_readLine(FileStream* fileStream, char* buffer, int32_t length) |
|
152 { |
|
153 return fgets(buffer, length, (FILE*)fileStream); |
|
154 } |
|
155 |
|
156 U_CAPI int32_t U_EXPORT2 |
|
157 T_FileStream_writeLine(FileStream* fileStream, const char* buffer) |
|
158 { |
|
159 return fputs(buffer, (FILE*)fileStream); |
|
160 } |
|
161 |
|
162 U_CAPI int32_t U_EXPORT2 |
|
163 T_FileStream_size(FileStream* fileStream) |
|
164 { |
|
165 int32_t savedPos = ftell((FILE*)fileStream); |
|
166 int32_t size = 0; |
|
167 |
|
168 /*Changes by Bertrand A. D. doesn't affect the current position |
|
169 goes to the end of the file before ftell*/ |
|
170 fseek((FILE*)fileStream, 0, SEEK_END); |
|
171 size = (int32_t)ftell((FILE*)fileStream); |
|
172 fseek((FILE*)fileStream, savedPos, SEEK_SET); |
|
173 return size; |
|
174 } |
|
175 |
|
176 U_CAPI int U_EXPORT2 |
|
177 T_FileStream_eof(FileStream* fileStream) |
|
178 { |
|
179 return feof((FILE*)fileStream); |
|
180 } |
|
181 |
|
182 /* |
|
183 Warning |
|
184 This function may not work consistently on all platforms |
|
185 (e.g. HP-UX, FreeBSD and MacOSX don't return an error when |
|
186 putc is used on a file opened as readonly) |
|
187 */ |
|
188 U_CAPI int U_EXPORT2 |
|
189 T_FileStream_error(FileStream* fileStream) |
|
190 { |
|
191 return (fileStream == 0 || ferror((FILE*)fileStream)); |
|
192 } |
|
193 |
|
194 /* This function doesn't work. */ |
|
195 /* force the stream to set its error flag*/ |
|
196 /*U_CAPI void U_EXPORT2 |
|
197 T_FileStream_setError(FileStream* fileStream) |
|
198 { |
|
199 fseek((FILE*)fileStream, 99999, SEEK_SET); |
|
200 } |
|
201 */ |
|
202 |
|
203 U_CAPI FileStream* U_EXPORT2 |
|
204 T_FileStream_stdin(void) |
|
205 { |
|
206 return (FileStream*)stdin; |
|
207 } |
|
208 |
|
209 U_CAPI FileStream* U_EXPORT2 |
|
210 T_FileStream_stdout(void) |
|
211 { |
|
212 return (FileStream*)stdout; |
|
213 } |
|
214 |
|
215 |
|
216 U_CAPI FileStream* U_EXPORT2 |
|
217 T_FileStream_stderr(void) |
|
218 { |
|
219 return (FileStream*)stderr; |
|
220 } |
|
221 |
|
222 U_CAPI UBool U_EXPORT2 |
|
223 T_FileStream_remove(const char* fileName){ |
|
224 return (remove(fileName) == 0); |
|
225 } |