16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1998-2013, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File ufile.c 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 11/19/98 stephen Creation. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 03/12/99 stephen Modified for new C API. 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 06/16/99 stephen Changed T_LocaleBundle to u_locbund 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/19/99 stephen Fixed to use ucnv's default codepage. 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * fileno is not declared when building with GCC in strict mode. 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(__GNUC__) && defined(__STRICT_ANSI__) 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#undef __STRICT_ANSI__ 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "locmap.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustdio.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ufile.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API && !defined(fileno) 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Windows likes to rename Unix-like functions */ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define fileno _fileno 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UFILE* 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfinit_owner(FILE *f, 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale, 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codepage, 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool takeOwnership 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UFILE *result; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(f == NULL) { 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = (UFILE*) uprv_malloc(sizeof(UFILE)); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result == NULL) { 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(result, 0, sizeof(UFILE)); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fFileno = fileno(f); 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 <= result->fFileno && result->fFileno <= 2) { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* stdin, stdout and stderr need to be special cased for Windows 98 */ 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if _MSC_VER >= 1400 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fFile = &__iob_func()[_fileno(f)]; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fFile = &_iob[_fileno(f)]; 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fFile = f; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fBuffer = result->fUCBuffer; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fPos = result->fUCBuffer; 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fLimit = result->fUCBuffer; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* if locale is 0, use the default */ 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_locbund_init(&result->str.fBundle, locale) == 0) { 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* DO NOT FCLOSE HERE! */ 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(result); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* If the codepage is not "" use the ucnv_open default behavior */ 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(codepage == NULL || *codepage != '\0') { 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fConverter = ucnv_open(codepage, &status); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* else result->fConverter is already memset'd to NULL. */ 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->fOwnFile = takeOwnership; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_locbund_close(&result->str.fBundle); 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* DO NOT fclose here!!!!!! */ 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(result); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = NULL; 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_finit(FILE *f, 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale, 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codepage) 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return finit_owner(f, locale, codepage, FALSE); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UFILE* U_EXPORT2 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fadopt(FILE *f, 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale, 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codepage) 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return finit_owner(f, locale, codepage, TRUE); 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fopen(const char *filename, 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *perm, 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale, 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codepage) 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UFILE *result; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *systemFile = fopen(filename, perm); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(systemFile == 0) { 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = finit_owner(systemFile, locale, codepage, TRUE); 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!result) { 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Something bad happened. 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Maybe the converter couldn't be opened. */ 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(systemFile); 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; /* not a file leak */ 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UFILE* U_EXPORT2 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fstropen(UChar *stringBuf, 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity, 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale) 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UFILE *result; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (capacity < 0) { 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = (UFILE*) uprv_malloc(sizeof(UFILE)); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Null pointer test */ 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == NULL) { 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; /* Just get out. */ 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(result, 0, sizeof(UFILE)); 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fBuffer = stringBuf; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fPos = stringBuf; 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result->str.fLimit = stringBuf+capacity; 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* if locale is 0, use the default */ 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_locbund_init(&result->str.fBundle, locale) == 0) { 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* DO NOT FCLOSE HERE! */ 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(result); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_feof(UFILE *f) 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool endOfBuffer; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (f == NULL) { 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org endOfBuffer = (UBool)(f->str.fPos >= f->str.fLimit); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (f->fFile != NULL) { 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return endOfBuffer && feof(f->fFile); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return endOfBuffer; 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fflush(UFILE *file) 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ufile_flush_translit(file); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ufile_flush_io(file); 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file->fFile) { 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(file->fFile); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (file->str.fPos < file->str.fLimit) { 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(file->str.fPos++) = 0; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* TODO: flush input */ 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_frewind(UFILE *file) 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_fflush(file); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_reset(file->fConverter); 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file->fFile) { 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rewind(file->fFile); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file->str.fLimit = file->fUCBuffer; 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file->str.fPos = file->fUCBuffer; 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file->str.fPos = file->str.fBuffer; 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fclose(UFILE *file) 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file) { 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_fflush(file); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ufile_close_translit(file); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(file->fOwnFile) 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(file->fFile); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_locbund_close(&file->str.fBundle); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_close(file->fConverter); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(file); 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI FILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetfile( UFILE *f) 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return f->fFile; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetlocale( UFILE *file) 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return file->str.fBundle.fLocale; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fsetlocale(UFILE *file, 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *locale) 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_locbund_close(&file->str.fBundle); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return u_locbund_init(&file->str.fBundle, locale) == 0 ? -1 : 0; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetcodepage(UFILE *file) 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *codepage = NULL; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (file->fConverter) { 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org codepage = ucnv_getName(file->fConverter, &status); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return codepage; 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fsetcodepage( const char *codepage, 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UFILE *file) 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t retVal = -1; 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We use the normal default codepage for this system, and not the one for the locale. */ 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((file->str.fPos == file->str.fBuffer) && (file->str.fLimit == file->str.fBuffer)) { 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_close(file->fConverter); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org file->fConverter = ucnv_open(codepage, &status); 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org retVal = 0; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return retVal; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UConverter * U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetConverter(UFILE *file) 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return file->fConverter; 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const UNumberFormat* U_EXPORT2 u_fgetNumberFormat(UFILE *file) 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return u_locbund_getNumberFormat(&file->str.fBundle, UNUM_DECIMAL); 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 315