intl/icu/source/tools/toolutil/filestrm.c

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     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 */
    24 #include "filestrm.h"
    26 #include "cmemory.h"
    28 #include <stdio.h>
    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 }
    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;
    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;
    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;
    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 }
    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 }
    90 /*static const int32_t kEOF;
    91 const int32_t FileStream::kEOF = EOF;*/
    93 /*
    94 U_CAPI FileStream*
    95 T_FileStream_tmpfile()
    96 {
    97     FILE* file = tmpfile();
    98     return (FileStream*)file;
    99 }
   100 */
   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 }
   108 U_CAPI int32_t U_EXPORT2
   109 T_FileStream_write(FileStream* fileStream, const void* addr, int32_t len)
   110 {
   112     return fwrite(addr, 1, len, (FILE*)fileStream);
   113 }
   115 U_CAPI void U_EXPORT2
   116 T_FileStream_rewind(FileStream* fileStream)
   117 {
   118     rewind((FILE*)fileStream);
   119 }
   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 }
   128 U_CAPI int U_EXPORT2
   129 T_FileStream_getc(FileStream* fileStream)
   130 {
   131     int c = fgetc((FILE*)fileStream);
   132     return c;
   133 }
   135 U_CAPI int32_t U_EXPORT2
   136 T_FileStream_ungetc(int32_t ch, FileStream* fileStream)
   137 {
   139     int32_t c = ungetc(ch, (FILE*)fileStream);
   140     return c;
   141 }
   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 }
   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 }
   156 U_CAPI int32_t U_EXPORT2
   157 T_FileStream_writeLine(FileStream* fileStream, const char* buffer)
   158 {
   159     return fputs(buffer, (FILE*)fileStream);
   160 }
   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;
   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 }
   176 U_CAPI int U_EXPORT2
   177 T_FileStream_eof(FileStream* fileStream)
   178 {
   179     return feof((FILE*)fileStream);
   180 }
   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 }
   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 */
   203 U_CAPI FileStream* U_EXPORT2
   204 T_FileStream_stdin(void)
   205 {
   206     return (FileStream*)stdin;
   207 }
   209 U_CAPI FileStream* U_EXPORT2
   210 T_FileStream_stdout(void)
   211 {
   212     return (FileStream*)stdout;
   213 }
   216 U_CAPI FileStream* U_EXPORT2
   217 T_FileStream_stderr(void)
   218 {
   219     return (FileStream*)stderr;
   220 }
   222 U_CAPI UBool U_EXPORT2
   223 T_FileStream_remove(const char* fileName){
   224     return (remove(fileName) == 0);
   225 }

mercurial