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