X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/73c04bcfe1096173b00431f0cdc742894b15eef0..b331163bffd790ced0e88b73f44f86d49ccc48a5:/icuSources/io/ufile.c?ds=sidebyside diff --git a/icuSources/io/ufile.c b/icuSources/io/ufile.c index 4afabf5b..a8d8f0a3 100644 --- a/icuSources/io/ufile.c +++ b/icuSources/io/ufile.c @@ -1,7 +1,7 @@ /* ****************************************************************************** * -* Copyright (C) 1998-2006, International Business Machines +* Copyright (C) 1998-2014, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -18,34 +18,37 @@ ****************************************************************************** */ -/* define for fileno. */ -#ifndef _XOPEN_SOURCE -#if __STDC_VERSION__ >= 199901L -/* It is invalid to compile an XPG3, XPG4, XPG4v2 or XPG5 application using c99 */ -#define _XOPEN_SOURCE 600 -#else -#define _XOPEN_SOURCE 4 -#endif +/* + * fileno is not declared when building with GCC in strict mode. + */ +#if defined(__GNUC__) && defined(__STRICT_ANSI__) +#undef __STRICT_ANSI__ #endif #include "locmap.h" #include "unicode/ustdio.h" + +#if !UCONFIG_NO_CONVERSION + #include "ufile.h" #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/ucnv.h" +#include "unicode/ustring.h" #include "cstring.h" #include "cmemory.h" -#if defined(U_WINDOWS) && !defined(fileno) +#if U_PLATFORM_USES_ONLY_WIN32_API && !defined(fileno) /* Windows likes to rename Unix-like functions */ #define fileno _fileno #endif -U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ -u_finit(FILE *f, - const char *locale, - const char *codepage) +static UFILE* +finit_owner(FILE *f, + const char *locale, + const char *codepage, + UBool takeOwnership + ) { UErrorCode status = U_ZERO_ERROR; UFILE *result; @@ -60,7 +63,7 @@ u_finit(FILE *f, uprv_memset(result, 0, sizeof(UFILE)); result->fFileno = fileno(f); -#ifdef U_WINDOWS +#if U_PLATFORM_USES_ONLY_WIN32_API if (0 <= result->fFileno && result->fFileno <= 2) { /* stdin, stdout and stderr need to be special cased for Windows 98 */ #if _MSC_VER >= 1400 @@ -94,7 +97,10 @@ u_finit(FILE *f, } /* else result->fConverter is already memset'd to NULL. */ - if(U_FAILURE(status)) { + if(U_SUCCESS(status)) { + result->fOwnFile = takeOwnership; + } + else { #if !UCONFIG_NO_FORMATTING u_locbund_close(&result->str.fBundle); #endif @@ -106,6 +112,22 @@ u_finit(FILE *f, return result; } +U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ +u_finit(FILE *f, + const char *locale, + const char *codepage) +{ + return finit_owner(f, locale, codepage, FALSE); +} + +U_CAPI UFILE* U_EXPORT2 +u_fadopt(FILE *f, + const char *locale, + const char *codepage) +{ + return finit_owner(f, locale, codepage, TRUE); +} + U_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ u_fopen(const char *filename, const char *perm, @@ -118,18 +140,44 @@ u_fopen(const char *filename, return 0; } - result = u_finit(systemFile, locale, codepage); + result = finit_owner(systemFile, locale, codepage, TRUE); - if (result) { - result->fOwnFile = TRUE; - } - else { + if (!result) { /* Something bad happened. Maybe the converter couldn't be opened. */ fclose(systemFile); } - return result; + return result; /* not a file leak */ +} + +U_CAPI UFILE* U_EXPORT2 +u_fopen_u(const UChar *filename, + const char *perm, + const char *locale, + const char *codepage) +{ + UFILE *result; + char buffer[256]; + + u_austrcpy(buffer, filename); + + result = u_fopen(buffer, perm, locale, codepage); +#if U_PLATFORM_USES_ONLY_WIN32_API + /* Try Windows API _wfopen if the above fails. */ + if (!result) { + FILE *systemFile = _wfopen(filename, (UChar*)perm); + if (systemFile) { + result = finit_owner(systemFile, locale, codepage, TRUE); + } + if (!result) { + /* Something bad happened. + Maybe the converter couldn't be opened. */ + fclose(systemFile); + } + } +#endif + return result; /* not a file leak */ } U_CAPI UFILE* U_EXPORT2 @@ -144,6 +192,10 @@ u_fstropen(UChar *stringBuf, } result = (UFILE*) uprv_malloc(sizeof(UFILE)); + /* Null pointer test */ + if (result == NULL) { + return NULL; /* Just get out. */ + } uprv_memset(result, 0, sizeof(UFILE)); result->str.fBuffer = stringBuf; result->str.fPos = stringBuf; @@ -179,6 +231,7 @@ U_CAPI void U_EXPORT2 u_fflush(UFILE *file) { ufile_flush_translit(file); + ufile_flush_io(file); if (file->fFile) { fflush(file->fFile); } @@ -206,18 +259,20 @@ u_frewind(UFILE *file) U_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ u_fclose(UFILE *file) { - u_fflush(file); - ufile_close_translit(file); + if (file) { + u_fflush(file); + ufile_close_translit(file); - if(file->fOwnFile) - fclose(file->fFile); + if(file->fOwnFile) + fclose(file->fFile); #if !UCONFIG_NO_FORMATTING - u_locbund_close(&file->str.fBundle); + u_locbund_close(&file->str.fBundle); #endif - ucnv_close(file->fConverter); - uprv_free(file); + ucnv_close(file->fConverter); + uprv_free(file); + } } U_CAPI FILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ @@ -283,4 +338,11 @@ u_fgetConverter(UFILE *file) { return file->fConverter; } +#if !UCONFIG_NO_FORMATTING +U_CAPI const UNumberFormat* U_EXPORT2 u_fgetNumberFormat(UFILE *file) +{ + return u_locbund_getNumberFormat(&file->str.fBundle, UNUM_DECIMAL); +} +#endif +#endif