U_CAPI int32_t U_EXPORT2 u_file_write_flush( const UChar *chars, int32_t count, UFILE *f, UBool flush) { /* Set up conversion parameters */ UErrorCode status = U_ZERO_ERROR; const UChar *mySource = chars; const UChar *sourceAlias = chars; const UChar *mySourceEnd = chars + count; char *myTarget = f->fCharBuffer; int32_t bufferSize = UFILE_CHARBUFFER_SIZE; int32_t written = 0; int32_t numConverted = 0; #if !UCONFIG_NO_TRANSLITERATION if((f->fTranslit) && (f->fTranslit->translit)) { /* Do the transliteration */ mySource = u_file_translit(f, chars, &count, flush); sourceAlias = mySource; mySourceEnd = mySource + count; } #endif /* Perform the conversion in a loop */ do { status = U_ZERO_ERROR; sourceAlias = mySource; if(f->fConverter != NULL) { /* We have a valid converter */ ucnv_fromUnicode(f->fConverter, &myTarget, f->fCharBuffer + bufferSize, &mySource, mySourceEnd, NULL, flush, &status); } else { /*weiv: do the invariant conversion */ u_UCharsToChars(mySource, myTarget, count); myTarget += count; } numConverted = (int32_t)(myTarget - f->fCharBuffer); if (numConverted > 0) { /* write the converted bytes */ fwrite(f->fCharBuffer, sizeof(char), numConverted, f->fFile); written += numConverted; } myTarget = f->fCharBuffer; } while(status == U_BUFFER_OVERFLOW_ERROR); /* return # of chars written */ return written; }
U_CFUNC int32_t U_EXPORT2 u_file_write_flush(const UChar *chars, int32_t count, UFILE *f, UBool flushIO, UBool flushTranslit) { /* Set up conversion parameters */ UErrorCode status = U_ZERO_ERROR; const UChar *mySource = chars; const UChar *mySourceBegin; const UChar *mySourceEnd; char charBuffer[UFILE_CHARBUFFER_SIZE]; char *myTarget = charBuffer; int32_t written = 0; int32_t numConverted = 0; if (count < 0) { count = u_strlen(chars); } #if !UCONFIG_NO_TRANSLITERATION if((f->fTranslit) && (f->fTranslit->translit)) { /* Do the transliteration */ mySource = u_file_translit(f, chars, &count, flushTranslit); } #endif /* Write to a string. */ if (!f->fFile) { int32_t charsLeft = (int32_t)(f->str.fLimit - f->str.fPos); if (flushIO && charsLeft > count) { count++; } written = ufmt_min(count, charsLeft); u_strncpy(f->str.fPos, mySource, written); f->str.fPos += written; return written; } mySourceEnd = mySource + count; /* Perform the conversion in a loop */ do { mySourceBegin = mySource; /* beginning location for this loop */ status = U_ZERO_ERROR; if(f->fConverter != NULL) { /* We have a valid converter */ ucnv_fromUnicode(f->fConverter, &myTarget, charBuffer + UFILE_CHARBUFFER_SIZE, &mySource, mySourceEnd, NULL, flushIO, &status); } else { /*weiv: do the invariant conversion */ int32_t convertChars = (int32_t) (mySourceEnd - mySource); if (convertChars > UFILE_CHARBUFFER_SIZE) { convertChars = UFILE_CHARBUFFER_SIZE; status = U_BUFFER_OVERFLOW_ERROR; } u_UCharsToChars(mySource, myTarget, convertChars); mySource += convertChars; myTarget += convertChars; } numConverted = (int32_t)(myTarget - charBuffer); if (numConverted > 0) { /* write the converted bytes */ fwrite(charBuffer, sizeof(char), numConverted, f->fFile); written += (int32_t) (mySource - mySourceBegin); } myTarget = charBuffer; } while(status == U_BUFFER_OVERFLOW_ERROR); /* return # of chars written */ return written; }