]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/io/ustdio.c
ICU-491.11.3.tar.gz
[apple/icu.git] / icuSources / io / ustdio.c
index 3958f1393ab2c327b01f730ba3324cdea1a85e5e..df4c4f1c37c4441f49d09e8f81eac7843c35db24 100644 (file)
@@ -1,7 +1,7 @@
 /*
  ******************************************************************************
  *
- *   Copyright (C) 1998-2008, International Business Machines
+ *   Copyright (C) 1998-2011, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  *
  ******************************************************************************
@@ -37,7 +37,7 @@
 #define DELIM_PS 0x2029
 
 /* TODO: is this correct for all codepages? Should we just use \n and let the converter handle it? */
-#ifdef U_WINDOWS
+#if U_PLATFORM_USES_ONLY_WIN32_API
 static const UChar DELIMITERS [] = { DELIM_CR, DELIM_LF, 0x0000 };
 static const uint32_t DELIMITERS_LEN = 2;
 /* TODO: Default newline writing should be detected based upon the converter being used. */
@@ -238,6 +238,17 @@ ufile_flush_translit(UFILE *f)
 }
 
 
+void
+ufile_flush_io(UFILE *f)
+{
+  if((!f) || (!f->fFile)) {
+    return; /* skip if no file */
+  }
+
+  u_file_write_flush(NULL, 0, f, TRUE, FALSE);
+}
+
+
 void
 ufile_close_translit(UFILE *f)
 {
@@ -300,6 +311,7 @@ u_file_write_flush(const UChar *chars,
     /* 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;
@@ -334,6 +346,7 @@ u_file_write_flush(const UChar *chars,
 
     /* 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,
@@ -345,8 +358,14 @@ u_file_write_flush(const UChar *chars,
                 flushIO,
                 &status);
         } else { /*weiv: do the invariant conversion */
-            u_UCharsToChars(mySource, myTarget, count);
-            myTarget += count;
+            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);
 
@@ -357,7 +376,7 @@ u_file_write_flush(const UChar *chars,
                 numConverted,
                 f->fFile);
 
-            written     += numConverted;
+            written     += (int32_t) (mySource - mySourceBegin);
         }
         myTarget     = charBuffer;
     }
@@ -406,7 +425,7 @@ ufile_fill_uchar_buffer(UFILE *f)
 
     /* shift the buffer if it isn't empty */
     if(dataSize != 0) {
-        uprv_memmove(f->fUCBuffer, str->fPos, dataSize * sizeof(UChar));
+        uprv_memmove(f->fUCBuffer, str->fPos, dataSize * sizeof(UChar)); /* not accessing beyond memory */
     }