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