16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Copyright (C) 1998-2011, 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 ustdio.c
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History:
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Date        Name        Description
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   11/18/98    stephen     Creation.
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   03/12/99    stephen     Modified for new C API.
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   07/19/99    stephen     Fixed read() and gets()
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustdio.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ufile.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ufmt_cmn.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_LF 0x000A
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_VT 0x000B
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_FF 0x000C
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_CR 0x000D
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_NEL 0x0085
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_LS 0x2028
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELIM_PS 0x2029
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TODO: is this correct for all codepages? Should we just use \n and let the converter handle it? */
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar DELIMITERS [] = { DELIM_CR, DELIM_LF, 0x0000 };
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint32_t DELIMITERS_LEN = 2;
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TODO: Default newline writing should be detected based upon the converter being used. */
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar DELIMITERS [] = { DELIM_LF, 0x0000 };
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const uint32_t DELIMITERS_LEN = 1;
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IS_FIRST_STRING_DELIMITER(c1) \
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (UBool)((DELIM_LF <= (c1) && (c1) <= DELIM_CR) \
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        || (c1) == DELIM_NEL \
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        || (c1) == DELIM_LS \
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        || (c1) == DELIM_PS)
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CAN_HAVE_COMBINED_STRING_DELIMITER(c1) (UBool)((c1) == DELIM_CR)
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IS_COMBINED_STRING_DELIMITER(c1, c2) \
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (UBool)((c1) == DELIM_CR && (c2) == DELIM_LF)
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UTransliterator* U_EXPORT2
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fsettransliterator(UFILE *file, UFileDirection direction,
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UTransliterator *adopt, UErrorCode *status)
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UTransliterator *old = NULL;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status))
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return adopt;
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!file)
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_ILLEGAL_ARGUMENT_ERROR;
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return adopt;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(direction & U_READ)
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /** TODO: implement */
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_UNSUPPORTED_ERROR;
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return adopt;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(adopt == NULL) /* they are clearing it */
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(file->fTranslit != NULL)
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* TODO: Check side */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            old = file->fTranslit->translit;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_free(file->fTranslit->buffer);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit->buffer=NULL;
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_free(file->fTranslit);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit=NULL;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(file->fTranslit == NULL)
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit = (UFILETranslitBuffer*) uprv_malloc(sizeof(UFILETranslitBuffer));
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!file->fTranslit)
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *status = U_MEMORY_ALLOCATION_ERROR;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return adopt;
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit->capacity = 0;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit->length = 0;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit->pos = 0;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            file->fTranslit->buffer = NULL;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            old = file->fTranslit->translit;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ufile_flush_translit(file);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        file->fTranslit->translit = adopt;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return old;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar * u_file_translit(UFILE *f, const UChar *src, int32_t *count, UBool flush)
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t newlen;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t junkCount = 0;
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t textLength;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t textLimit;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UTransPosition pos;
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count == NULL)
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count = &junkCount;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((!f)||(!f->fTranslit)||(!f->fTranslit->translit))
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* fast path */
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return src;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* First: slide over everything */
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f->fTranslit->length > f->fTranslit->pos)
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memmove(f->fTranslit->buffer, f->fTranslit->buffer + f->fTranslit->pos,
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (f->fTranslit->length - f->fTranslit->pos)*sizeof(UChar));
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    f->fTranslit->length -= f->fTranslit->pos; /* always */
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    f->fTranslit->pos = 0;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Calculate new buffer size needed */
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newlen = (*count + f->fTranslit->length) * 4;
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(newlen > f->fTranslit->capacity)
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(f->fTranslit->buffer == NULL)
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->buffer = (UChar*)uprv_malloc(newlen * sizeof(UChar));
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->buffer = (UChar*)uprv_realloc(f->fTranslit->buffer, newlen * sizeof(UChar));
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Check for malloc/realloc failure. */
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (f->fTranslit->buffer == NULL) {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        	return NULL;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->fTranslit->capacity = newlen;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Now, copy any data over */
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strncpy(f->fTranslit->buffer + f->fTranslit->length,
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        src,
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *count);
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    f->fTranslit->length += *count;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Now, translit in place as much as we can  */
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(flush == FALSE)
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        textLength = f->fTranslit->length;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos.contextStart = 0;
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos.contextLimit = textLength;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos.start        = 0;
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos.limit        = textLength;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrans_transIncrementalUChars(f->fTranslit->translit,
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->buffer, /* because we shifted */
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &textLength,
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->capacity,
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &pos,
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &status);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* now: start/limit point to the transliterated text */
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Transliterated is [buffer..pos.start) */
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *count            = pos.start;
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->fTranslit->pos = pos.start;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->fTranslit->length = pos.limit;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return f->fTranslit->buffer;
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        textLength = f->fTranslit->length;
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        textLimit = f->fTranslit->length;
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrans_transUChars(f->fTranslit->translit,
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->buffer,
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &textLength,
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fTranslit->capacity,
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0,
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &textLimit,
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &status);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* out: converted len */
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *count = textLimit;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Set pointers to 0 */
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->fTranslit->pos = 0;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->fTranslit->length = 0;
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return f->fTranslit->buffer;
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_flush_translit(UFILE *f)
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((!f)||(!f->fTranslit))
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_file_write_flush(NULL, 0, f, FALSE, TRUE);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_flush_io(UFILE *f)
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if((!f) || (!f->fFile)) {
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return; /* skip if no file */
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_file_write_flush(NULL, 0, f, TRUE, FALSE);
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_close_translit(UFILE *f)
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((!f)||(!f->fTranslit))
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ufile_flush_translit(f);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f->fTranslit->translit)
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrans_close(f->fTranslit->translit);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f->fTranslit->buffer)
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_free(f->fTranslit->buffer);
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_free(f->fTranslit);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    f->fTranslit = NULL;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Input/output */
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fputs(const UChar    *s,
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UFILE        *f)
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count = u_file_write(s, u_strlen(s), f);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count += u_file_write(DELIMITERS, DELIMITERS_LEN, f);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return count;
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fputc(UChar32      uc,
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UFILE        *f)
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar buf[2];
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idx = 0;
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isError = FALSE;
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U16_APPEND(buf, idx, sizeof(buf)/sizeof(*buf), uc, isError);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (isError) {
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return U_EOF;
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return u_file_write(buf, idx, f) == idx ? uc : U_EOF;
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC int32_t U_EXPORT2
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_file_write_flush(const UChar *chars,
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   int32_t     count,
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   UFILE       *f,
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   UBool       flushIO,
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   UBool       flushTranslit)
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Set up conversion parameters */
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode  status       = U_ZERO_ERROR;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *mySource    = chars;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *mySourceBegin;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *mySourceEnd;
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char        charBuffer[UFILE_CHARBUFFER_SIZE];
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char        *myTarget   = charBuffer;
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     written      = 0;
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     numConverted = 0;
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (count < 0) {
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count = u_strlen(chars);
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((f->fTranslit) && (f->fTranslit->translit))
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Do the transliteration */
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        mySource = u_file_translit(f, chars, &count, flushTranslit);
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Write to a string. */
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!f->fFile) {
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t charsLeft = (int32_t)(f->str.fLimit - f->str.fPos);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (flushIO && charsLeft > count) {
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            count++;
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        written = ufmt_min(count, charsLeft);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strncpy(f->str.fPos, mySource, written);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f->str.fPos += written;
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return written;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mySourceEnd = mySource + count;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Perform the conversion in a loop */
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        mySourceBegin = mySource; /* beginning location for this loop */
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status     = U_ZERO_ERROR;
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(f->fConverter != NULL) { /* We have a valid converter */
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucnv_fromUnicode(f->fConverter,
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                &myTarget,
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                charBuffer + UFILE_CHARBUFFER_SIZE,
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                &mySource,
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mySourceEnd,
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                NULL,
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                flushIO,
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                &status);
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else { /*weiv: do the invariant conversion */
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t convertChars = (int32_t) (mySourceEnd - mySource);
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (convertChars > UFILE_CHARBUFFER_SIZE) {
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                convertChars = UFILE_CHARBUFFER_SIZE;
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_BUFFER_OVERFLOW_ERROR;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_UCharsToChars(mySource, myTarget, convertChars);
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            mySource += convertChars;
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            myTarget += convertChars;
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numConverted = (int32_t)(myTarget - charBuffer);
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (numConverted > 0) {
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* write the converted bytes */
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fwrite(charBuffer,
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sizeof(char),
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                numConverted,
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                f->fFile);
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            written     += (int32_t) (mySource - mySourceBegin);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        myTarget     = charBuffer;
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while(status == U_BUFFER_OVERFLOW_ERROR);
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* return # of chars written */
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return written;
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_file_write(    const UChar     *chars,
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t        count,
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UFILE         *f)
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return u_file_write_flush(chars,count,f,FALSE,FALSE);
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* private function used for buffering input */
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_fill_uchar_buffer(UFILE *f)
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode  status;
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char  *mySource;
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char  *mySourceEnd;
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar       *myTarget;
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     bufferSize;
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     maxCPBytes;
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     bytesRead;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     availLength;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     dataSize;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char        charBuffer[UFILE_CHARBUFFER_SIZE];
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_localized_string *str;
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (f->fFile == NULL) {
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* There is nothing to do. It's a string. */
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str = &f->str;
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dataSize = (int32_t)(str->fLimit - str->fPos);
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (f->fFileno == 0 && dataSize > 0) {
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Don't read from stdin too many times. There is still some data. */
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* shift the buffer if it isn't empty */
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dataSize != 0) {
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_memmove(f->fUCBuffer, str->fPos, dataSize * sizeof(UChar)); /* not accessing beyond memory */
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* record how much buffer space is available */
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    availLength = UFILE_UCHARBUFFER_SIZE - dataSize;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Determine the # of codepage bytes needed to fill our UChar buffer */
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* weiv: if converter is NULL, we use invariant converter with charwidth = 1)*/
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    maxCPBytes = availLength / (f->fConverter!=NULL?(2*ucnv_getMinCharSize(f->fConverter)):1);
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Read in the data to convert */
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (f->fFileno == 0) {
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Special case. Read from stdin one line at a time. */
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char *retStr = fgets(charBuffer, ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE), f->fFile);
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bytesRead = (int32_t)(retStr ? uprv_strlen(charBuffer) : 0);
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* A normal file */
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bytesRead = (int32_t)fread(charBuffer,
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sizeof(char),
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ufmt_min(maxCPBytes, UFILE_CHARBUFFER_SIZE),
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fFile);
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Set up conversion parameters */
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status      = U_ZERO_ERROR;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mySource    = charBuffer;
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mySourceEnd = charBuffer + bytesRead;
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    myTarget    = f->fUCBuffer + dataSize;
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bufferSize  = UFILE_UCHARBUFFER_SIZE;
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f->fConverter != NULL) { /* We have a valid converter */
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Perform the conversion */
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucnv_toUnicode(f->fConverter,
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &myTarget,
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            f->fUCBuffer + bufferSize,
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &mySource,
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            mySourceEnd,
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            NULL,
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (UBool)(feof(f->fFile) != 0),
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            &status);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else { /*weiv: do the invariant conversion */
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_charsToUChars(mySource, myTarget, bytesRead);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        myTarget += bytesRead;
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* update the pointers into our array */
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str->fPos    = str->fBuffer;
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str->fLimit  = myTarget;
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar* U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgets(UChar        *s,
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t       n,
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UFILE        *f)
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dataSize;
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count;
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *alias;
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *limit;
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *sItr;
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar currDelim = 0;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_localized_string *str;
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (n <= 0) {
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Caller screwed up. We need to write the null terminatior. */
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* fill the buffer if needed */
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str = &f->str;
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (str->fPos >= str->fLimit) {
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ufile_fill_uchar_buffer(f);
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* subtract 1 from n to compensate for the terminator */
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    --n;
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* determine the amount of data in the buffer */
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dataSize = (int32_t)(str->fLimit - str->fPos);
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* if 0 characters were left, return 0 */
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dataSize == 0)
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* otherwise, iteratively fill the buffer and copy */
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sItr = s;
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    currDelim = 0;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (dataSize > 0 && count < n) {
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        alias = str->fPos;
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Find how much to copy */
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dataSize < (n - count)) {
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            limit = str->fLimit;
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            limit = alias + (n - count);
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!currDelim) {
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Copy UChars until we find the first occurrence of a delimiter character */
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            while (alias < limit && !IS_FIRST_STRING_DELIMITER(*alias)) {
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count++;
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *(sItr++) = *(alias++);
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Preserve the newline */
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (alias < limit && IS_FIRST_STRING_DELIMITER(*alias)) {
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (CAN_HAVE_COMBINED_STRING_DELIMITER(*alias)) {
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    currDelim = *alias;
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else {
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    currDelim = 1;  /* This isn't a newline, but it's used to say
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    that we should break later. We've checked all
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    possible newline combinations even across buffer
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    boundaries. */
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count++;
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *(sItr++) = *(alias++);
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* If we have a CRLF combination, preserve that too. */
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (alias < limit) {
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (currDelim && IS_COMBINED_STRING_DELIMITER(currDelim, *alias)) {
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count++;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *(sItr++) = *(alias++);
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            currDelim = 1;  /* This isn't a newline, but it's used to say
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            that we should break later. We've checked all
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            possible newline combinations even across buffer
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            boundaries. */
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* update the current buffer position */
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str->fPos = alias;
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* if we found a delimiter */
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (currDelim == 1) {
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* break out */
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* refill the buffer */
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ufile_fill_uchar_buffer(f);
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* determine the amount of data in the buffer */
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataSize = (int32_t)(str->fLimit - str->fPos);
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* add the terminator and return s */
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *sItr = 0x0000;
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return s;
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool U_EXPORT2
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_getch(UFILE *f, UChar *ch)
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isValidChar = FALSE;
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *ch = U_EOF;
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* if we have an available character in the buffer, return it */
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f->str.fPos < f->str.fLimit){
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *ch = *(f->str.fPos)++;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        isValidChar = TRUE;
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* otherwise, fill the buffer and return the next character */
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(f->str.fPos >= f->str.fLimit) {
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ufile_fill_uchar_buffer(f);
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(f->str.fPos < f->str.fLimit) {
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *ch = *(f->str.fPos)++;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            isValidChar = TRUE;
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return isValidChar;
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetc(UFILE        *f)
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar ch;
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ufile_getch(f, &ch);
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ch;
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC UBool U_EXPORT2
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgufile_getch32(UFILE *f, UChar32 *c32)
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isValidChar = FALSE;
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_localized_string *str;
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *c32 = U_EOF;
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Fill the buffer if it is empty */
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str = &f->str;
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (f && str->fPos + 1 >= str->fLimit) {
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ufile_fill_uchar_buffer(f);
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Get the next character in the buffer */
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (str->fPos < str->fLimit) {
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *c32 = *(str->fPos)++;
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_IS_LEAD(*c32)) {
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (str->fPos < str->fLimit) {
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UChar c16 = *(str->fPos)++;
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *c32 = U16_GET_SUPPLEMENTARY(*c32, c16);
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                isValidChar = TRUE;
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else {
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *c32 = U_EOF;
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            isValidChar = TRUE;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return isValidChar;
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fgetcx(UFILE        *f)
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 ch;
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ufile_getch32(f, &ch);
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ch;
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UChar32 U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_fungetc(UChar32        ch,
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UFILE        *f)
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_localized_string *str;
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str = &f->str;
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* if we're at the beginning of the buffer, sorry! */
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (str->fPos == str->fBuffer
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        || (U_IS_LEAD(ch) && (str->fPos - 1) == str->fBuffer))
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ch = U_EOF;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* otherwise, put the character back */
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Remember, read them back on in the reverse order. */
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_IS_LEAD(ch)) {
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (*--(str->fPos) != U16_TRAIL(ch)
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                || *--(str->fPos) != U16_LEAD(ch))
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ch = U_EOF;
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (*--(str->fPos) != ch) {
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ch = U_EOF;
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ch;
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_file_read(    UChar        *chars,
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t        count,
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UFILE         *f)
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dataSize;
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t read = 0;
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_localized_string *str = &f->str;
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* determine the amount of data in the buffer */
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataSize = (int32_t)(str->fLimit - str->fPos);
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dataSize <= 0) {
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* fill the buffer */
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ufile_fill_uchar_buffer(f);
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataSize = (int32_t)(str->fLimit - str->fPos);
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Make sure that we don't read too much */
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dataSize > (count - read)) {
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataSize = count - read;
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* copy the current data in the buffer */
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memcpy(chars + read, str->fPos, dataSize * sizeof(UChar));
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* update number of items read */
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        read += dataSize;
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* update the current buffer position */
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str->fPos += dataSize;
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (dataSize != 0 && read < count);
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return read;
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
727