Module: wine Branch: master Commit: 6b268e77bbe4f4d77748d028ea090b6afc2dd062 URL: https://source.winehq.org/git/wine.git/?a=commit;h=6b268e77bbe4f4d77748d028e...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Jul 16 19:29:04 2018 +0200
msvcr80: Add gets_s implementation.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45393 Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
.../api-ms-win-crt-stdio-l1-1-0.spec | 2 +- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/file.c | 62 +++++++++++++++------- dlls/ucrtbase/ucrtbase.spec | 2 +- 9 files changed, 50 insertions(+), 28 deletions(-)
diff --git a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec index 4921883..853a43f 100644 --- a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec +++ b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec @@ -140,7 +140,7 @@ @ cdecl getc(ptr) ucrtbase.getc @ cdecl getchar() ucrtbase.getchar @ cdecl gets(str) ucrtbase.gets -@ stub gets_s +@ cdecl gets_s(ptr long) ucrtbase.gets_s @ cdecl getwc(ptr) ucrtbase.getwc @ cdecl getwchar() ucrtbase.getwchar @ cdecl putc(long ptr) ucrtbase.putc diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 4426987..88698ca 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1700,7 +1700,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ cdecl is_wctype(long long) ntdll.iswctype diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 3572664..3d116c4 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -2058,7 +2058,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ cdecl is_wctype(long long) ntdll.iswctype diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index b7d644a..f317d1f 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2204,7 +2204,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ stub ilogb diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 2d096fc..0f5d143 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1868,7 +1868,7 @@ @ cdecl getc(ptr) msvcr120.getc @ cdecl getchar() msvcr120.getchar @ cdecl gets(str) msvcr120.gets -@ stub gets_s +@ cdecl gets_s(ptr long) msvcr120.gets_s @ cdecl getwc(ptr) msvcr120.getwc @ cdecl getwchar() msvcr120.getwchar @ stub ilogb diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 0df1f0a..b563427 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1382,7 +1382,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ cdecl is_wctype(long long) ntdll.iswctype diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 7238163..a735005 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1355,7 +1355,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ cdecl is_wctype(long long) ntdll.iswctype diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 1c7b5a4..2c05f25 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4719,31 +4719,53 @@ int CDECL MSVCRT_getc(MSVCRT_FILE* file) }
/********************************************************************* - * gets (MSVCRT.@) + * gets_s (MSVCR80.@) */ -char * CDECL MSVCRT_gets(char *buf) +char * CDECL MSVCRT_gets_s(char *buf, MSVCRT_size_t len) { - int cc; - char * buf_start = buf; + char *buf_start = buf; + int cc;
- MSVCRT__lock_file(MSVCRT_stdin); - for(cc = MSVCRT__fgetc_nolock(MSVCRT_stdin); cc != MSVCRT_EOF && cc != '\n'; - cc = MSVCRT__fgetc_nolock(MSVCRT_stdin)) - { - if(cc != '\r') - *buf++ = (char)cc; - } - MSVCRT__unlock_file(MSVCRT_stdin); + if (!MSVCRT_CHECK_PMT(buf != NULL)) return NULL; + if (!MSVCRT_CHECK_PMT(len != 0)) return NULL;
- if ((cc == MSVCRT_EOF) && (buf_start == buf)) - { - TRACE(":nothing read\n"); - return NULL; - } - *buf = '\0'; + MSVCRT__lock_file(MSVCRT_stdin); + for(cc = MSVCRT__fgetc_nolock(MSVCRT_stdin); + len != 0 && cc != MSVCRT_EOF && cc != '\n'; + cc = MSVCRT__fgetc_nolock(MSVCRT_stdin)) + { + if (cc != '\r') + { + *buf++ = (char)cc; + len--; + } + } + MSVCRT__unlock_file(MSVCRT_stdin);
- TRACE("got '%s'\n", buf_start); - return buf_start; + if (!len) + { + *buf_start = 0; + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + return NULL; + } + + if ((cc == MSVCRT_EOF) && (buf_start == buf)) + { + TRACE(":nothing read\n"); + return NULL; + } + *buf = '\0'; + + TRACE("got '%s'\n", buf_start); + return buf_start; +} + +/********************************************************************* + * gets (MSVCRT.@) + */ +char * CDECL MSVCRT_gets(char *buf) +{ + return MSVCRT_gets_s(buf, -1); }
/********************************************************************* diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 6304663..1ced9ca 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2337,7 +2337,7 @@ @ cdecl getenv(str) MSVCRT_getenv @ cdecl getenv_s(ptr ptr long str) @ cdecl gets(str) MSVCRT_gets -@ stub gets_s +@ cdecl gets_s(ptr long) MSVCRT_gets_s @ cdecl getwc(ptr) MSVCRT_getwc @ cdecl getwchar() MSVCRT_getwchar @ cdecl hypot(double double) _hypot