From: Piotr Caban Subject: [PATCH 2/3] msvcrt: Added _snscanf implementation Message-Id: <4D9B3012.3010808@codeweavers.com> Date: Tue, 05 Apr 2011 17:06:58 +0200 --- dlls/msvcr100/msvcr100.spec | 8 ++-- dlls/msvcr70/msvcr70.spec | 2 +- dlls/msvcr71/msvcr71.spec | 2 +- dlls/msvcr80/msvcr80.spec | 8 ++-- dlls/msvcr90/msvcr90.spec | 8 ++-- dlls/msvcrt/msvcrt.spec | 8 ++-- dlls/msvcrt/scanf.c | 68 +++++++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/scanf.h | 18 +++++++++++ 8 files changed, 104 insertions(+), 18 deletions(-) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index d9845ee..8c91c63 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1093,10 +1093,10 @@ @ stub _snprintf_l @ varargs _snprintf_s(ptr long long str) msvcrt._snprintf_s @ stub _snprintf_s_l -@ stub _snscanf -@ stub _snscanf_l -@ stub _snscanf_s -@ stub _snscanf_s_l +@ varargs _snscanf(str long str) msvcrt._snscanf +@ varargs _snscanf_l(str long str ptr) msvcrt._snscanf_l +@ varargs _snscanf_s(str long str) msvcrt._snscanf_s +@ varargs _snscanf_s_l(str long str ptr) msvcrt._snscanf_s_l @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf @ stub _snwprintf_l @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec index d088390..a745124 100644 --- a/dlls/msvcr70/msvcr70.spec +++ b/dlls/msvcr70/msvcr70.spec @@ -526,7 +526,7 @@ @ stub _setsystime @ cdecl _sleep(long) msvcrt._sleep @ varargs _snprintf(ptr long str) msvcrt._snprintf -@ stub _snscanf +@ varargs _snscanf(str long str) msvcrt._snscanf @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf @ stub _snwscanf @ varargs _sopen(str long long) msvcrt._sopen diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec index abbe966..03b3781 100644 --- a/dlls/msvcr71/msvcr71.spec +++ b/dlls/msvcr71/msvcr71.spec @@ -522,7 +522,7 @@ @ cdecl _setsystime(ptr long) msvcrt._setsystime @ cdecl _sleep(long) msvcrt._sleep @ varargs _snprintf(str long str) msvcrt._snprintf -@ stub _snscanf +@ varargs _snscanf(str long str) msvcrt._snscanf @ varargs _snwprintf(wstr long wstr) msvcrt._snwprintf @ stub _snwscanf @ varargs _sopen(str long long) msvcrt._sopen diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 29c190e..b7b9253 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -947,10 +947,10 @@ @ stub _snprintf_l @ varargs _snprintf_s(ptr long long str) msvcrt._snprintf_s @ stub _snprintf_s_l -@ stub _snscanf -@ stub _snscanf_l -@ stub _snscanf_s -@ stub _snscanf_s_l +@ varargs _snscanf(str long str) msvcrt._snscanf +@ varargs _snscanf_l(str long str ptr) msvcrt._snscanf_l +@ varargs _snscanf_s(str long str) msvcrt._snscanf_s +@ varargs _snscanf_s_l(str long str ptr) msvcrt._snscanf_s_l @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf @ stub _snwprintf_l @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 31aae91..afa3dee 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -933,10 +933,10 @@ @ stub _snprintf_l @ varargs _snprintf_s(ptr long long str) msvcrt._snprintf_s @ stub _snprintf_s_l -@ stub _snscanf -@ stub _snscanf_l -@ stub _snscanf_s -@ stub _snscanf_s_l +@ varargs _snscanf(str long str) msvcrt._snscanf +@ varargs _snscanf_l(str long str ptr) msvcrt._snscanf_l +@ varargs _snscanf_s(str long str) msvcrt._snscanf_s +@ varargs _snscanf_s_l(str long str ptr) msvcrt._snscanf_s_l @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf @ stub _snwprintf_l @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 9b1937b..43bcec0 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -876,10 +876,10 @@ # stub _snprintf_l @ varargs _snprintf_s(ptr long long str) MSVCRT__snprintf_s # stub _snprintf_s_l -# stub _snscanf -# stub _snscanf_l -# stub _snscanf_s -# stub _snscanf_s_l +@ varargs _snscanf(str long str) MSVCRT__snscanf +@ varargs _snscanf_l(str long str ptr) MSVCRT__snscanf_l +@ varargs _snscanf_s(str long str) MSVCRT__snscanf_s +@ varargs _snscanf_s_l(str long str ptr) MSVCRT__snscanf_s_l @ varargs _snwprintf(ptr long wstr) MSVCRT__snwprintf # stub _snwprintf_l @ varargs _snwprintf_s(ptr long long wstr) MSVCRT__snwprintf_s diff --git a/dlls/msvcrt/scanf.c b/dlls/msvcrt/scanf.c index c795e15..d02892c 100644 --- a/dlls/msvcrt/scanf.c +++ b/dlls/msvcrt/scanf.c @@ -91,6 +91,16 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) { #define SECURE 1 #include "scanf.h" +/* vsnscanf_l */ +#undef SECURE +#define STRING_LEN 1 +#include "scanf.h" + +/* vsnscanf_s_l */ +#define SECURE +#include "scanf.h" +#undef STRING_LEN + /* vswscanf_l */ #define WIDE_SCANF 1 #undef CONSOLE @@ -582,3 +592,61 @@ int CDECL _cwscanf_s_l(const char *format, MSVCRT__locale_t locale, ...) __ms_va_end(valist); return res; } + +/********************************************************************* + * _snscanf (MSVCRT.@) + */ +int CDECL MSVCRT__snscanf(char *input, MSVCRT_size_t length, const char *format, ...) +{ + __ms_va_list valist; + int res; + + __ms_va_start(valist, format); + res = MSVCRT_vsnscanf_l(input, length, format, NULL, valist); + __ms_va_end(valist); + return res; +} + +/********************************************************************* + * _snscanf_l (MSVCRT.@) + */ +int CDECL MSVCRT__snscanf_l(char *input, MSVCRT_size_t length, + const char *format, MSVCRT__locale_t locale, ...) +{ + __ms_va_list valist; + int res; + + __ms_va_start(valist, locale); + res = MSVCRT_vsnscanf_l(input, length, format, locale, valist); + __ms_va_end(valist); + return res; +} + +/********************************************************************* + * _snscanf_s (MSVCRT.@) + */ +int CDECL MSVCRT__snscanf_s(char *input, MSVCRT_size_t length, const char *format, ...) +{ + __ms_va_list valist; + int res; + + __ms_va_start(valist, format); + res = MSVCRT_vsnscanf_s_l(input, length, format, NULL, valist); + __ms_va_end(valist); + return res; +} + +/********************************************************************* + * _snscanf_s_l (MSVCRT.@) + */ +int CDECL MSVCRT__snscanf_s_l(char *input, MSVCRT_size_t length, + const char *format, MSVCRT__locale_t locale, ...) +{ + __ms_va_list valist; + int res; + + __ms_va_start(valist, locale); + res = MSVCRT_vsnscanf_s_l(input, length, format, locale, valist); + __ms_va_end(valist); + return res; +} diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index b78d57c..8b796b1 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -65,6 +65,23 @@ #ifdef STRING #undef _EOF_ #define _EOF_ 0 +#ifdef STRING_LEN +#define _GETC_(file) (consumed==length ? '\0' : (consumed++, *file++)) +#define _UNGETC_(nch, file) do { file--; consumed--; } while(0) +#ifdef WIDE_SCANF +#ifdef SECURE +#define _FUNCTION_ static int MSVCRT_vsnwscanf_s_l(const MSVCRT_wchar_t *file, MSVCRT_size_t length, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap) +#else /* SECURE */ +#define _FUNCTION_ static int MSVCRT_vsnwscanf_l(const MSVCRT_wchar_t *file, MSVCRT_size_t length, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap) +#endif /* SECURE */ +#else /* WIDE_SCANF */ +#ifdef SECURE +#define _FUNCTION_ static int MSVCRT_vsnscanf_s_l(const char *file, MSVCRT_size_t length, const char *format, MSVCRT__locale_t locale, __ms_va_list ap) +#else /* SECURE */ +#define _FUNCTION_ static int MSVCRT_vsnscanf_l(const char *file, MSVCRT_size_t length, const char *format, MSVCRT__locale_t locale, __ms_va_list ap) +#endif /* SECURE */ +#endif /* WIDE_SCANF */ +#else /* STRING_LEN */ #define _GETC_(file) (consumed++, *file++) #define _UNGETC_(nch, file) do { file--; consumed--; } while(0) #ifdef WIDE_SCANF @@ -80,6 +97,7 @@ #define _FUNCTION_ static int MSVCRT_vsscanf_l(const char *file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap) #endif /* SECURE */ #endif /* WIDE_SCANF */ +#endif /* STRING_LEN */ #else /* STRING */ #ifdef WIDE_SCANF #define _GETC_(file) (consumed++, MSVCRT_fgetwc(file))