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