xref: /aosp_15_r20/external/icu/icu4c/source/tools/toolutil/filestrm.cpp (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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