1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 1998-2012, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File ufile.c 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11/19/98 stephen Creation. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 03/12/99 stephen Modified for new C API. 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 06/16/99 stephen Changed T_LocaleBundle to u_locbund 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 07/19/99 stephen Fixed to use ucnv's default codepage. 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "locmap.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustdio.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ufile.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API && !defined(fileno) 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Windows likes to rename Unix-like functions */ 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define fileno _fileno 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UFILE* 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehofinit_owner(FILE *f, 3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage, 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool takeOwnership 4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(f == NULL) { 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = (UFILE*) uprv_malloc(sizeof(UFILE)); 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result == NULL) { 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(result, 0, sizeof(UFILE)); 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFileno = fileno(f); 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 <= result->fFileno && result->fFileno <= 2) { 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* stdin, stdout and stderr need to be special cased for Windows 98 */ 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if _MSC_VER >= 1400 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = &__iob_func()[_fileno(f)]; 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = &_iob[_fileno(f)]; 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = f; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fBuffer = result->fUCBuffer; 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fPos = result->fUCBuffer; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fLimit = result->fUCBuffer; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if locale is 0, use the default */ 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_locbund_init(&result->str.fBundle, locale) == 0) { 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT FCLOSE HERE! */ 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If the codepage is not "" use the ucnv_open default behavior */ 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(codepage == NULL || *codepage != '\0') { 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fConverter = ucnv_open(codepage, &status); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* else result->fConverter is already memset'd to NULL. */ 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result->fOwnFile = takeOwnership; 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else { 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_locbund_close(&result->str.fBundle); 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT fclose here!!!!!! */ 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = NULL; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehou_finit(FILE *f, 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage) 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return finit_owner(f, locale, codepage, FALSE); 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UFILE* U_EXPORT2 11350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehou_fadopt(FILE *f, 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage) 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return finit_owner(f, locale, codepage, TRUE); 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fopen(const char *filename, 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *perm, 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale, 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *codepage) 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FILE *systemFile = fopen(filename, perm); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(systemFile == 0) { 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = finit_owner(systemFile, locale, codepage, TRUE); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!result) { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Something bad happened. 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Maybe the converter couldn't be opened. */ 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(systemFile); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; /* not a file leak */ 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UFILE* U_EXPORT2 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fstropen(UChar *stringBuf, 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t capacity, 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale) 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (capacity < 0) { 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = (UFILE*) uprv_malloc(sizeof(UFILE)); 155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Null pointer test */ 156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (result == NULL) { 157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; /* Just get out. */ 158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(result, 0, sizeof(UFILE)); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fBuffer = stringBuf; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fPos = stringBuf; 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fLimit = stringBuf+capacity; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if locale is 0, use the default */ 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_locbund_init(&result->str.fBundle, locale) == 0) { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT FCLOSE HERE! */ 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_feof(UFILE *f) 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool endOfBuffer; 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f == NULL) { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru endOfBuffer = (UBool)(f->str.fPos >= f->str.fLimit); 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f->fFile != NULL) { 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return endOfBuffer && feof(f->fFile); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return endOfBuffer; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fflush(UFILE *file) 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ufile_flush_translit(file); 19427f654740f2a26ad62a5c155af9199af9e69b889claireho ufile_flush_io(file); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fFile) { 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fflush(file->fFile); 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (file->str.fPos < file->str.fLimit) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *(file->str.fPos++) = 0; 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: flush input */ 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_frewind(UFILE *file) 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_fflush(file); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_reset(file->fConverter); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fFile) { 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rewind(file->fFile); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fLimit = file->fUCBuffer; 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fPos = file->fUCBuffer; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fPos = file->str.fBuffer; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fclose(UFILE *file) 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (file) { 22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_fflush(file); 22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ufile_close_translit(file); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(file->fOwnFile) 22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fclose(file->fFile); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_locbund_close(&file->str.fBundle); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucnv_close(file->fConverter); 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free(file); 23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI FILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetfile( UFILE *f) 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return f->fFile; 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetlocale( UFILE *file) 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return file->str.fBundle.fLocale; 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fsetlocale(UFILE *file, 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale) 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_locbund_close(&file->str.fBundle); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_locbund_init(&file->str.fBundle, locale) == 0 ? -1 : 0; 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetcodepage(UFILE *file) 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *codepage = NULL; 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fConverter) { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru codepage = ucnv_getName(file->fConverter, &status); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codepage; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fsetcodepage( const char *codepage, 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *file) 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t retVal = -1; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We use the normal default codepage for this system, and not the one for the locale. */ 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((file->str.fPos == file->str.fBuffer) && (file->str.fLimit == file->str.fBuffer)) { 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(file->fConverter); 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->fConverter = ucnv_open(codepage, &status); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru retVal = 0; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return retVal; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UConverter * U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetConverter(UFILE *file) 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return file->fConverter; 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302