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