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