Module: wine Branch: master Commit: 6f24dd9677563ccb0a0b033c0ba2597951221a80 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6f24dd9677563ccb0a0b033c0b...
Author: Iván Matellanes matellanesivan@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*);