1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Copyright (C) 1998-2013, 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 218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/* 228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * fileno is not declared when building with GCC in strict mode. 238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if defined(__GNUC__) && defined(__STRICT_ANSI__) 258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#undef __STRICT_ANSI__ 268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "locmap.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustdio.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ufile.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API && !defined(fileno) 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Windows likes to rename Unix-like functions */ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define fileno _fileno 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UFILE* 4350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehofinit_owner(FILE *f, 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage, 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool takeOwnership 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(f == NULL) { 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = (UFILE*) uprv_malloc(sizeof(UFILE)); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result == NULL) { 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(result, 0, sizeof(UFILE)); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFileno = fileno(f); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 <= result->fFileno && result->fFileno <= 2) { 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* stdin, stdout and stderr need to be special cased for Windows 98 */ 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if _MSC_VER >= 1400 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = &__iob_func()[_fileno(f)]; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = &_iob[_fileno(f)]; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fFile = f; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fBuffer = result->fUCBuffer; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fPos = result->fUCBuffer; 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fLimit = result->fUCBuffer; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if locale is 0, use the default */ 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_locbund_init(&result->str.fBundle, locale) == 0) { 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT FCLOSE HERE! */ 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If the codepage is not "" use the ucnv_open default behavior */ 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(codepage == NULL || *codepage != '\0') { 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->fConverter = ucnv_open(codepage, &status); 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* else result->fConverter is already memset'd to NULL. */ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result->fOwnFile = takeOwnership; 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_locbund_close(&result->str.fBundle); 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT fclose here!!!!!! */ 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = NULL; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehou_finit(FILE *f, 11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage) 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return finit_owner(f, locale, codepage, FALSE); 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UFILE* U_EXPORT2 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehou_fadopt(FILE *f, 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *locale, 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *codepage) 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return finit_owner(f, locale, codepage, TRUE); 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UFILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fopen(const char *filename, 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *perm, 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale, 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *codepage) 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FILE *systemFile = fopen(filename, perm); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(systemFile == 0) { 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = finit_owner(systemFile, locale, codepage, TRUE); 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!result) { 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Something bad happened. 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Maybe the converter couldn't be opened. */ 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(systemFile); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return result; /* not a file leak */ 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UFILE* U_EXPORT2 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fstropen(UChar *stringBuf, 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t capacity, 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale) 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *result; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (capacity < 0) { 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = (UFILE*) uprv_malloc(sizeof(UFILE)); 162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Null pointer test */ 163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (result == NULL) { 164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; /* Just get out. */ 165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(result, 0, sizeof(UFILE)); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fBuffer = stringBuf; 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fPos = stringBuf; 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result->str.fLimit = stringBuf+capacity; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* if locale is 0, use the default */ 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_locbund_init(&result->str.fBundle, locale) == 0) { 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* DO NOT FCLOSE HERE! */ 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(result); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_feof(UFILE *f) 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool endOfBuffer; 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f == NULL) { 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru endOfBuffer = (UBool)(f->str.fPos >= f->str.fLimit); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f->fFile != NULL) { 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return endOfBuffer && feof(f->fFile); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return endOfBuffer; 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fflush(UFILE *file) 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ufile_flush_translit(file); 20127f654740f2a26ad62a5c155af9199af9e69b889claireho ufile_flush_io(file); 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fFile) { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fflush(file->fFile); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (file->str.fPos < file->str.fLimit) { 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *(file->str.fPos++) = 0; 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: flush input */ 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_frewind(UFILE *file) 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_fflush(file); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_reset(file->fConverter); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fFile) { 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rewind(file->fFile); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fLimit = file->fUCBuffer; 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fPos = file->fUCBuffer; 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->str.fPos = file->str.fBuffer; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fclose(UFILE *file) 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (file) { 23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_fflush(file); 23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ufile_close_translit(file); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(file->fOwnFile) 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fclose(file->fFile); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_locbund_close(&file->str.fBundle); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucnv_close(file->fConverter); 24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free(file); 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI FILE* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetfile( UFILE *f) 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return f->fFile; 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetlocale( UFILE *file) 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return file->str.fBundle.fLocale; 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fsetlocale(UFILE *file, 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale) 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_locbund_close(&file->str.fBundle); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_locbund_init(&file->str.fBundle, locale) == 0 ? -1 : 0; 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetcodepage(UFILE *file) 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *codepage = NULL; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file->fConverter) { 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru codepage = ucnv_getName(file->fConverter, &status); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return codepage; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fsetcodepage( const char *codepage, 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UFILE *file) 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t retVal = -1; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We use the normal default codepage for this system, and not the one for the locale. */ 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((file->str.fPos == file->str.fBuffer) && (file->str.fLimit == file->str.fBuffer)) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(file->fConverter); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file->fConverter = ucnv_open(codepage, &status); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru retVal = 0; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return retVal; 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UConverter * U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_fgetConverter(UFILE *file) 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return file->fConverter; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if !UCONFIG_NO_FORMATTING 3098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_CAPI const UNumberFormat* U_EXPORT2 u_fgetNumberFormat(UFILE *file) 3108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{ 3118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return u_locbund_getNumberFormat(&file->str.fBundle, UNUM_DECIMAL); 3128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 3138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 315