=?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcrt: Added _ungetc_nolock implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 5 08:59:37 CST 2014


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

Author: Iván Matellanes <matellanesivan at gmail.com>
Date:   Tue Nov  4 22:52:03 2014 +0100

msvcrt: Added _ungetc_nolock implementation.

---

 dlls/msvcr100/msvcr100.spec |  2 +-
 dlls/msvcr110/msvcr110.spec |  2 +-
 dlls/msvcr120/msvcr120.spec |  2 +-
 dlls/msvcr80/msvcr80.spec   |  2 +-
 dlls/msvcr90/msvcr90.spec   |  2 +-
 dlls/msvcrt/file.c          | 22 +++++++++++++++++-----
 dlls/msvcrt/msvcrt.h        |  1 +
 include/msvcrt/stdio.h      |  1 +
 8 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 3f6a920..21d380e 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1405,7 +1405,7 @@
 @ cdecl _ultow_s(long ptr long long) MSVCRT__ultow_s
 @ cdecl _umask(long) MSVCRT__umask
 @ stub _umask_s
-@ stub _ungetc_nolock
+@ cdecl _ungetc_nolock(long ptr) MSVCRT__ungetc_nolock
 @ cdecl _ungetch(long)
 @ stub _ungetch_nolock
 @ stub _ungetwc_nolock
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index a61f7eb..c33ce06 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1763,7 +1763,7 @@
 @ cdecl _ultow_s(long ptr long long) MSVCRT__ultow_s
 @ cdecl _umask(long) MSVCRT__umask
 @ stub _umask_s
-@ stub _ungetc_nolock
+@ cdecl _ungetc_nolock(long ptr) MSVCRT__ungetc_nolock
 @ cdecl _ungetch(long)
 @ stub _ungetch_nolock
 @ stub _ungetwc_nolock
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index c9853ca..49d47e6 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -1777,7 +1777,7 @@
 @ cdecl _ultow_s(long ptr long long) MSVCRT__ultow_s
 @ cdecl _umask(long) MSVCRT__umask
 @ stub _umask_s
-@ stub _ungetc_nolock
+@ cdecl _ungetc_nolock(long ptr) MSVCRT__ungetc_nolock
 @ cdecl _ungetch(long)
 @ stub _ungetch_nolock
 @ stub _ungetwc_nolock
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 700ce57..b9fa3cd 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1084,7 +1084,7 @@
 @ cdecl _ultow_s(long ptr long long) MSVCRT__ultow_s
 @ cdecl _umask(long) MSVCRT__umask
 @ stub _umask_s
-@ stub _ungetc_nolock
+@ cdecl _ungetc_nolock(long ptr) MSVCRT__ungetc_nolock
 @ cdecl _ungetch(long)
 @ stub _ungetch_nolock
 @ stub _ungetwc_nolock
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 94ffa30..24302c3 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1060,7 +1060,7 @@
 @ cdecl _ultow_s(long ptr long long) MSVCRT__ultow_s
 @ cdecl _umask(long) MSVCRT__umask
 @ stub _umask_s
-@ stub _ungetc_nolock
+@ cdecl _ungetc_nolock(long ptr) MSVCRT__ungetc_nolock
 @ cdecl _ungetch(long)
 @ stub _ungetch_nolock
 @ stub _ungetwc_nolock
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 4fcd74f..9fc2652 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -5002,13 +5002,28 @@ int CDECL MSVCRT_printf_s(const char *format, ...)
  */
 int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file)
 {
+    int ret;
+
+    if(!MSVCRT_CHECK_PMT(file != NULL)) return MSVCRT_EOF;
+
+    MSVCRT__lock_file(file);
+    ret = MSVCRT__ungetc_nolock(c, file);
+    MSVCRT__unlock_file(file);
+
+    return ret;
+}
+
+/*********************************************************************
+ *		_ungetc_nolock (MSVCRT.@)
+ */
+int CDECL MSVCRT__ungetc_nolock(int c, MSVCRT_FILE * file)
+{
     if(!MSVCRT_CHECK_PMT(file != NULL)) return MSVCRT_EOF;
 
     if (c == MSVCRT_EOF || !(file->_flag&MSVCRT__IOREAD ||
                 (file->_flag&MSVCRT__IORW && !(file->_flag&MSVCRT__IOWRT))))
         return MSVCRT_EOF;
 
-    MSVCRT__lock_file(file);
     if((!(file->_flag & (MSVCRT__IONBF | MSVCRT__IOMYBUF | MSVCRT__USERBUF))
                 && msvcrt_alloc_buffer(file))
             || (!file->_cnt && file->_ptr==file->_base))
@@ -5019,20 +5034,17 @@ int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file)
         if(file->_flag & MSVCRT__IOSTRG) {
             if(*file->_ptr != c) {
                 file->_ptr++;
-                MSVCRT__unlock_file(file);
                 return MSVCRT_EOF;
             }
         }else {
             *file->_ptr = c;
         }
         file->_cnt++;
-        MSVCRT_clearerr(file);
+        file->_flag &= ~(MSVCRT__IOERR | MSVCRT__IOEOF);
         file->_flag |= MSVCRT__IOREAD;
-        MSVCRT__unlock_file(file);
         return c;
     }
 
-    MSVCRT__unlock_file(file);
     return MSVCRT_EOF;
 }
 
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index d780f1b..e19928b 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -919,6 +919,7 @@ int __cdecl      MSVCRT_fgetc(MSVCRT_FILE*);
 int __cdecl      MSVCRT__fgetc_nolock(MSVCRT_FILE*);
 int __cdecl      MSVCRT__fputc_nolock(int,MSVCRT_FILE*);
 int __cdecl      MSVCRT_ungetc(int,MSVCRT_FILE*);
+int __cdecl      MSVCRT__ungetc_nolock(int,MSVCRT_FILE*);
 MSVCRT_wint_t __cdecl MSVCRT_fgetwc(MSVCRT_FILE*);
 MSVCRT_wint_t __cdecl MSVCRT__fgetwc_nolock(MSVCRT_FILE*);
 MSVCRT_wint_t __cdecl MSVCRT__fputwc_nolock(MSVCRT_wint_t,MSVCRT_FILE*);
diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h
index d4839cd..19fda94 100644
--- a/include/msvcrt/stdio.h
+++ b/include/msvcrt/stdio.h
@@ -137,6 +137,7 @@ int    __cdecl _fseek_nolock(FILE*,__msvcrt_long,int);
 int    __cdecl _fseeki64_nolock(FILE*,__int64,int);
 __msvcrt_long __cdecl _ftell_nolock(FILE*);
 __int64 __cdecl _ftelli64_nolock(FILE*);
+int    __cdecl _ungetc_nolock(int,FILE*);
 
 void   __cdecl clearerr(FILE*);
 int    __cdecl fclose(FILE*);




More information about the wine-cvs mailing list