Piotr Caban : msvcrt: Make the first call to fwrite buffered.

Alexandre Julliard julliard at winehq.org
Mon Oct 21 14:58:26 CDT 2013


Module: wine
Branch: master
Commit: afec0b00bd6250fe21e8deccbc8116a4aca6a7a4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=afec0b00bd6250fe21e8deccbc8116a4aca6a7a4

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Oct 21 16:11:31 2013 +0200

msvcrt: Make the first call to fwrite buffered.

---

 dlls/msvcrt/file.c |  133 +++++++++++++++++++++++++--------------------------
 1 files changed, 65 insertions(+), 68 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 1594c33..89ac94c 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -3499,6 +3499,45 @@ MSVCRT_wchar_t * CDECL MSVCRT_fgetws(MSVCRT_wchar_t *s, int size, MSVCRT_FILE* f
 }
 
 /*********************************************************************
+ *		_flsbuf (MSVCRT.@)
+ */
+int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
+{
+    /* Flush output buffer */
+    if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF)) {
+        msvcrt_alloc_buffer(file);
+    }
+    if(!(file->_flag & MSVCRT__IOWRT)) {
+        if(file->_flag & MSVCRT__IORW)
+            file->_flag |= MSVCRT__IOWRT;
+        else
+            return MSVCRT_EOF;
+    }
+    if(file->_bufsiz) {
+        int res = 0;
+
+        if(file->_cnt <= 0)
+            res = msvcrt_flush_buffer(file);
+        if(!res) {
+            *file->_ptr++ = c;
+            file->_cnt--;
+        }
+
+        return res ? res : c&0xff;
+    } else {
+        unsigned char cc=c;
+        int len;
+        /* set _cnt to 0 for unbuffered FILEs */
+        file->_cnt = 0;
+        len = MSVCRT__write(file->_file, &cc, 1);
+        if (len == 1)
+            return c & 0xff;
+        file->_flag |= MSVCRT__IOERR;
+        return MSVCRT_EOF;
+    }
+}
+
+/*********************************************************************
  *		fwrite (MSVCRT.@)
  */
 MSVCRT_size_t CDECL MSVCRT_fwrite(const void *ptr, MSVCRT_size_t size, MSVCRT_size_t nmemb, MSVCRT_FILE* file)
@@ -3509,38 +3548,36 @@ MSVCRT_size_t CDECL MSVCRT_fwrite(const void *ptr, MSVCRT_size_t size, MSVCRT_si
         return 0;
 
     MSVCRT__lock_file(file);
-    if(file->_cnt) {
-        int pcnt=(file->_cnt>wrcnt)? wrcnt: file->_cnt;
-        memcpy(file->_ptr, ptr, pcnt);
-        file->_cnt -= pcnt;
-        file->_ptr += pcnt;
-        written = pcnt;
-        wrcnt -= pcnt;
-        ptr = (const char*)ptr + pcnt;
-    } else if(!(file->_flag & MSVCRT__IOWRT)) {
-        if(file->_flag & MSVCRT__IORW) {
-            file->_flag |= MSVCRT__IOWRT;
-        } else {
-            MSVCRT__unlock_file(file);
-            return 0;
-        }
-    }
-    if(wrcnt) {
-        int res;
 
-        if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF))
-            msvcrt_alloc_buffer(file);
+    while(wrcnt) {
+        if(file->_cnt) {
+            int pcnt=(file->_cnt>wrcnt)? wrcnt: file->_cnt;
+            memcpy(file->_ptr, ptr, pcnt);
+            file->_cnt -= pcnt;
+            file->_ptr += pcnt;
+            written += pcnt;
+            wrcnt -= pcnt;
+            ptr = (const char*)ptr + pcnt;
+        } else if(!file->_bufsiz && (file->_flag & MSVCRT__IONBF)) {
+            if(!(file->_flag & MSVCRT__IOWRT)) {
+                if(file->_flag & MSVCRT__IORW)
+                    file->_flag |= MSVCRT__IOWRT;
+                else
+                    break;
+            }
 
-        /* Flush buffer */
-        res=msvcrt_flush_buffer(file);
-        if(!res) {
-            int pwritten = MSVCRT__write(file->_file, ptr, wrcnt);
-            if (pwritten <= 0)
-            {
+            if(MSVCRT__write(file->_file, ptr, wrcnt) <= 0) {
                 file->_flag |= MSVCRT__IOERR;
-                pwritten=0;
+                break;
             }
-            written += pwritten;
+            written += wrcnt;
+            wrcnt = 0;
+        } else {
+            if(MSVCRT__flsbuf(*(const char*)ptr, file) == MSVCRT_EOF)
+                break;
+            written++;
+            wrcnt--;
+            ptr = (const char*)ptr + 1;
         }
     }
 
@@ -3700,46 +3737,6 @@ int CDECL MSVCRT__wfopen_s(MSVCRT_FILE** pFile, const MSVCRT_wchar_t *filename,
 }
 
 /*********************************************************************
- *		_flsbuf (MSVCRT.@)
- */
-int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
-{
-    /* Flush output buffer */
-    if(file->_bufsiz == 0 && !(file->_flag & MSVCRT__IONBF)) {
-        msvcrt_alloc_buffer(file);
-    }
-    if(!(file->_flag & MSVCRT__IOWRT)) {
-        if(file->_flag & MSVCRT__IORW)
-            file->_flag |= MSVCRT__IOWRT;
-        else
-            return MSVCRT_EOF;
-    }
-    if(file->_bufsiz) {
-        int res = 0;
-
-        if(file->_cnt <= 0)
-            res = msvcrt_flush_buffer(file);
-        if(!res) {
-            *file->_ptr++ = c;
-            file->_cnt--;
-            res = msvcrt_flush_buffer(file);
-        }
-
-        return res ? res : c&0xff;
-    } else {
-        unsigned char cc=c;
-        int len;
-        /* set _cnt to 0 for unbuffered FILEs */
-        file->_cnt = 0;
-        len = MSVCRT__write(file->_file, &cc, 1);
-        if (len == 1)
-            return c & 0xff;
-        file->_flag |= MSVCRT__IOERR;
-        return MSVCRT_EOF;
-    }
-}
-
-/*********************************************************************
  *		fputc (MSVCRT.@)
  */
 int CDECL MSVCRT_fputc(int c, MSVCRT_FILE* file)




More information about the wine-cvs mailing list