Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

filestrm.c

00001 /*
00002 *******************************************************************************
00003 *
00004 *   Copyright (C) 1997-1999, International Business Machines
00005 *   Corporation and others.  All Rights Reserved.
00006 *
00007 *******************************************************************************
00008 *
00009 * File FILESTRM.C
00010 *
00011 * @author       Glenn Marcy
00012 *
00013 * Modification History:
00014 *
00015 *   Date        Name        Description
00016 *   5/8/98      gm          Created
00017 *  03/02/99     stephen     Reordered params in ungetc to match stdio
00018 *                           Added wopen
00019 *   3/29/99     helena      Merged Stephen and Bertrand's changes.
00020 *
00021 *******************************************************************************
00022 */
00023 
00024 #include "filestrm.h"
00025 #include "cmemory.h"
00026 
00027 #include <stdio.h>
00028 
00029 U_CAPI FileStream*
00030 T_FileStream_open(const char* filename, const char* mode)
00031 {
00032   if(filename != NULL && *filename != 0 && mode != NULL && *mode != 0) {
00033     FILE *file = fopen(filename, mode);
00034     return (FileStream*)file;
00035   } else {
00036     return NULL;
00037   }
00038 }
00039 
00040 
00041 U_CAPI FileStream*
00042 T_FileStream_wopen(const wchar_t* filename, const wchar_t* mode)
00043 {
00044   /* TBD: _wfopen is believed to be MS-specific? */
00045 #if defined(WIN32) && !defined(__WINDOWS__)
00046     FILE* result = _wfopen(filename, mode);
00047     return (FileStream*)result;
00048 #else
00049     size_t fnMbsSize, mdMbsSize;
00050     char *fn, *md;
00051     FILE *result;
00052 
00053     /* convert from wchar_t to char */
00054     fnMbsSize = wcstombs(NULL, filename, ((size_t)-1) >> 1);
00055     fn = (char*)uprv_malloc(fnMbsSize+2);
00056     wcstombs(fn, filename, fnMbsSize);
00057     fn[fnMbsSize] = 0;
00058 
00059     mdMbsSize = wcstombs(NULL, mode, ((size_t)-1) >> 1);
00060     md = (char*)uprv_malloc(mdMbsSize+2);
00061     wcstombs(md, mode, mdMbsSize);
00062     md[mdMbsSize] = 0;
00063 
00064     result = fopen(fn, md);
00065     uprv_free(fn);
00066     uprv_free(md);
00067     return (FileStream*)result;
00068 #endif
00069 }
00070 
00071 U_CAPI void
00072 T_FileStream_close(FileStream* fileStream)
00073 {
00074     if (fileStream != 0) fclose((FILE*)fileStream);
00075 }
00076 
00077 U_CAPI UBool
00078 T_FileStream_file_exists(const char* filename)
00079 {
00080     FILE* temp = fopen(filename, "r");
00081     if (temp) {
00082         fclose(temp);
00083         return TRUE;
00084     } else
00085         return FALSE;
00086 }
00087 
00088 /*static const int32_t kEOF;
00089 const int32_t FileStream::kEOF = EOF;*/
00090 
00091 U_CAPI FileStream*
00092 T_FileStream_tmpfile()
00093 {
00094     FILE* file = tmpfile();
00095     return (FileStream*)file;
00096 }
00097 
00098 U_CAPI int32_t
00099 T_FileStream_read(FileStream* fileStream, void* addr, int32_t len)
00100 {
00101     return fread(addr, 1, len, (FILE*)fileStream);
00102 }
00103 
00104 U_CAPI int32_t
00105 T_FileStream_write(FileStream* fileStream, const void* addr, int32_t len)
00106 {
00107 
00108     return fwrite(addr, 1, len, (FILE*)fileStream);
00109 }
00110 
00111 U_CAPI void
00112 T_FileStream_rewind(FileStream* fileStream)
00113 {
00114     rewind((FILE*)fileStream);
00115 }
00116 
00117 U_CAPI int32_t
00118 T_FileStream_putc(FileStream* fileStream, int32_t ch)
00119 {
00120     int32_t c = fputc(ch, (FILE*)fileStream);
00121     return c;
00122 }
00123 
00124 U_CAPI int
00125 T_FileStream_getc(FileStream* fileStream)
00126 {
00127     int c = fgetc((FILE*)fileStream);
00128     return c;
00129 }
00130 
00131 U_CAPI int32_t
00132 T_FileStream_ungetc(int32_t ch, FileStream* fileStream)
00133 {
00134 
00135     int32_t c = ungetc(ch, (FILE*)fileStream);
00136     return c;
00137 }
00138 
00139 U_CAPI int32_t
00140 T_FileStream_peek(FileStream* fileStream)
00141 {
00142     int32_t c = fgetc((FILE*)fileStream);
00143     return ungetc(c, (FILE*)fileStream);
00144 }
00145 
00146 /*Added by Bertrand A. D. */
00147 U_CAPI char *
00148 T_FileStream_readLine(FileStream* fileStream, char* buffer, int32_t length)
00149 {
00150     return fgets(buffer, length, (FILE*)fileStream);
00151 }
00152 
00153 U_CAPI int32_t
00154 T_FileStream_writeLine(FileStream* fileStream, const char* buffer)
00155 {
00156     return fputs(buffer, (FILE*)fileStream);
00157 }
00158 
00159 U_CAPI int32_t
00160 T_FileStream_size(FileStream* fileStream)
00161 {
00162     int32_t savedPos = ftell((FILE*)fileStream);
00163     int32_t size = 0;
00164 
00165     /*Changes by Bertrand A. D. doesn't affect the current position
00166     goes to the end of the file before ftell*/
00167     fseek((FILE*)fileStream, 0, SEEK_END);
00168     size = ftell((FILE*)fileStream);
00169     fseek((FILE*)fileStream, savedPos, SEEK_SET);
00170     return size;
00171 }
00172 
00173 U_CAPI int
00174 T_FileStream_eof(FileStream* fileStream)
00175 {
00176     return feof((FILE*)fileStream);
00177 }
00178 
00179 U_CAPI int
00180 T_FileStream_error(FileStream* fileStream)
00181 {
00182     return (fileStream == 0 || ferror((FILE*)fileStream));
00183 }
00184 
00185 U_CAPI void
00186 T_FileStream_setError(FileStream* fileStream)
00187 {
00188     /* force the stream to set its error flag*/
00189     fseek((FILE*)fileStream, 99999, SEEK_SET);
00190 }
00191 
00192 
00193 U_CAPI FileStream*
00194 T_FileStream_stdin(void)
00195 {
00196     return (FileStream*)stdin;
00197 }
00198 
00199 U_CAPI FileStream*
00200 T_FileStream_stdout(void)
00201 {
00202     return (FileStream*)stdout;
00203 }
00204 
00205 
00206 U_CAPI FileStream*
00207 T_FileStream_stderr(void)
00208 {
00209     return (FileStream*)stderr;
00210 }
00211 
00212 
00213 

Generated at Tue Dec 5 10:47:45 2000 for ICU by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000