msvcrt: Implement _snscanf/_s/_l and _snwscanf/_s/_l.

Eryk Wieliczko ewdevel at gmail.com
Tue Nov 9 15:38:15 CST 2010


---
 dlls/msvcr100/msvcr100.spec |   16 ++--
 dlls/msvcr71/msvcr71.spec   |    4 +-
 dlls/msvcr80/msvcr80.spec   |   16 ++--
 dlls/msvcr90/msvcr90.spec   |   16 ++--
 dlls/msvcrt/msvcrt.spec     |   16 ++--
 dlls/msvcrt/scanf.c         |  150 +++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/scanf.h         |   21 ++++++
 include/msvcrt/stdio.h      |    4 +
 include/msvcrt/wchar.h      |    2 +
 9 files changed, 211 insertions(+), 34 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 08942ae..7464726 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1093,18 +1093,18 @@
 @ 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) msvcrt._snscanf_l
+@ varargs _snscanf_s(str long str) msvcrt._snscanf_s
+@ varargs _snscanf_s_l(str long str) msvcrt._snscanf_s_l
 @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf
 @ stub _snwprintf_l
 @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s
 @ stub _snwprintf_s_l
-@ stub _snwscanf
-@ stub _snwscanf_l
-@ stub _snwscanf_s
-@ stub _snwscanf_s_l
+@ varargs _snwscanf(wstr long wstr) msvcrt._snwscanf
+@ varargs _snwscanf_l(wstr long wstr) msvcrt._snwscanf_l
+@ varargs _snwscanf_s(wstr long wstr) msvcrt._snwscanf_s
+@ varargs _snwscanf_s_l(wstr long wstr) msvcrt._snwscanf_s_l
 @ varargs _sopen(str long long) msvcrt._sopen
 @ stub _sopen_s
 @ varargs _spawnl(long str str) msvcrt._spawnl
diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec
index e4f1a20..4d555fa 100644
--- a/dlls/msvcr71/msvcr71.spec
+++ b/dlls/msvcr71/msvcr71.spec
@@ -522,9 +522,9 @@
 @ 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 _snwscanf(wstr long wstr) msvcrt._snwscanf
 @ varargs _sopen(str long long) msvcrt._sopen
 @ varargs _spawnl(long str str) msvcrt._spawnl
 @ varargs _spawnle(long str str) msvcrt._spawnle
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 2052fde..1e32e63 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -947,18 +947,18 @@
 @ 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) msvcrt._snscanf_l
+@ varargs _snscanf_s(str long str) msvcrt._snscanf_s
+@ varargs _snscanf_s_l(str long str) msvcrt._snscanf_s_l
 @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf
 @ stub _snwprintf_l
 @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s
 @ stub _snwprintf_s_l
-@ stub _snwscanf
-@ stub _snwscanf_l
-@ stub _snwscanf_s
-@ stub _snwscanf_s_l
+@ varargs _snwscanf(wstr long wstr) msvcrt._snwscanf
+@ varargs _snwscanf_l(wstr long wstr) msvcrt._snwscanf_l
+@ varargs _snwscanf_s(wstr long wstr) msvcrt._snwscanf_s
+@ varargs _snwscanf_s_l(wstr long wstr) msvcrt._snwscanf_s_l
 @ varargs _sopen(str long long) msvcrt._sopen
 @ stub _sopen_s
 @ varargs _spawnl(long str str) msvcrt._spawnl
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 89a3ce1..f68dc1b 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -933,18 +933,18 @@
 @ 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) msvcrt._snscanf_l
+@ varargs _snscanf_s(str long str) msvcrt._snscanf_s
+@ varargs _snscanf_s_l(str long str) msvcrt._snscanf_s_l
 @ varargs _snwprintf(ptr long wstr) msvcrt._snwprintf
 @ stub _snwprintf_l
 @ varargs _snwprintf_s(ptr long long wstr) msvcrt._snwprintf_s
 @ stub _snwprintf_s_l
-@ stub _snwscanf
-@ stub _snwscanf_l
-@ stub _snwscanf_s
-@ stub _snwscanf_s_l
+@ varargs _snwscanf(wstr long wstr) msvcrt._snwscanf
+@ varargs _snwscanf_l(wstr long wstr) msvcrt._snwscanf_l
+@ varargs _snwscanf_s(wstr long wstr) msvcrt._snwscanf_s
+@ varargs _snwscanf_s_l(wstr long wstr) msvcrt._snwscanf_s_l
 @ varargs _sopen(str long long) msvcrt._sopen
 @ stub _sopen_s
 @ varargs _spawnl(long str str) msvcrt._spawnl
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 9602f3d..4b625af 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -875,18 +875,18 @@
 # 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) MSVCRT__snscanf_l
+@ varargs _snscanf_s(str long str) MSVCRT__snscanf_s
+@ varargs _snscanf_s_l(str long str) MSVCRT__snscanf_s_l
 @ varargs _snwprintf(ptr long wstr) MSVCRT__snwprintf
 # stub _snwprintf_l
 @ varargs _snwprintf_s(ptr long long wstr) MSVCRT__snwprintf_s
 # stub _snwprintf_s_l
-# stub _snwscanf
-# stub _snwscanf_l
-# stub _snwscanf_s
-# stub _snwscanf_s_l
+@ varargs _snwscanf(wstr long wstr) MSVCRT__snwscanf
+@ varargs _snwscanf_l(wstr long wstr) MSVCRT__snwscanf_l
+@ varargs _snwscanf_s(wstr long wstr) MSVCRT__snwscanf_s
+@ varargs _snwscanf_s_l(wstr long wstr) MSVCRT__snwscanf_s_l
 @ varargs _sopen(str long long) MSVCRT__sopen
 # stub _sopen_s
 @ varargs _spawnl(long str str)
diff --git a/dlls/msvcrt/scanf.c b/dlls/msvcrt/scanf.c
index c795e15..2060734 100644
--- a/dlls/msvcrt/scanf.c
+++ b/dlls/msvcrt/scanf.c
@@ -62,6 +62,7 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #undef WIDE_SCANF
 #undef CONSOLE
 #undef STRING
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -73,6 +74,7 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #define WIDE_SCANF 1
 #undef CONSOLE
 #undef STRING
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -84,6 +86,7 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #undef WIDE_SCANF
 #undef CONSOLE
 #define STRING 1
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -91,10 +94,35 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #define SECURE 1
 #include "scanf.h"
 
+/* vsnscanf_l */
+#undef WIDE_SCANF
+#undef CONSOLE
+#define STRING 1
+#define STRING_LIMITED 1
+#undef SECURE
+#include "scanf.h"
+
+/* vsnscanf_s_l */
+#define SECURE 1
+#include "scanf.h"
+
+/* vsnwscanf_l */
+#define WIDE_SCANF 1
+#undef CONSOLE
+#define STRING 1
+#define STRING_LIMITED 1
+#undef SECURE
+#include "scanf.h"
+
+/* vsnwscanf_s_l */
+#define SECURE 1
+#include "scanf.h"
+
 /* vswscanf_l */
 #define WIDE_SCANF 1
 #undef CONSOLE
 #define STRING 1
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -106,6 +134,7 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #undef WIDE_SCANF
 #define CONSOLE 1
 #undef STRING
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -117,6 +146,7 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
 #define WIDE_SCANF 1
 #define CONSOLE 1
 #undef STRING
+#undef STRING_LIMITED
 #undef SECURE
 #include "scanf.h"
 
@@ -472,6 +502,126 @@ int CDECL MSVCRT__swscanf_s_l(const MSVCRT_wchar_t *str, const MSVCRT_wchar_t *f
 }
 
 /*********************************************************************
+ *		_snscanf (MSVCRT.@)
+ */
+int CDECL MSVCRT__snscanf(const char *str, const MSVCRT_size_t limit,
+        const char *format, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, format);
+    res = MSVCRT_vsnscanf_l(str, limit, format, NULL, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snscanf_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__snscanf_l(const char *str, const MSVCRT_size_t limit,
+        const char *format, MSVCRT__locale_t locale, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, locale);
+    res = MSVCRT_vsnscanf_l(str, limit, format, locale, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snscanf_s (MSVCRT.@)
+ */
+int CDECL MSVCRT__snscanf_s(const char *str, const MSVCRT_size_t limit,
+        const char *format, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, format);
+    res = MSVCRT_vsnscanf_s_l(str, limit, format, NULL, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snscanf_s_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__snscanf_s_l(const char *str, const MSVCRT_size_t limit,
+        const char *format, MSVCRT__locale_t locale, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, locale);
+    res = MSVCRT_vsnscanf_s_l(str, limit, format, locale, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snwscanf (MSVCRT.@)
+ */
+int CDECL MSVCRT__snwscanf(const MSVCRT_wchar_t *str, const MSVCRT_size_t limit,
+        const MSVCRT_wchar_t *format, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, format);
+    res = MSVCRT_vsnwscanf_l(str, limit, format, NULL, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snwscanf_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__snwscanf_l(const MSVCRT_wchar_t *str, const MSVCRT_size_t limit,
+        const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, locale);
+    res = MSVCRT_vsnwscanf_l(str, limit, format, locale, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snwscanf_s (MSVCRT.@)
+ */
+int CDECL MSVCRT__snwscanf_s(const MSVCRT_wchar_t *str, const MSVCRT_size_t limit,
+        const MSVCRT_wchar_t *format, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, format);
+    res = MSVCRT_vsnwscanf_s_l(str, limit, format, NULL, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
+ *		_snwscanf_s_l (MSVCRT.@)
+ */
+int CDECL MSVCRT__snwscanf_s_l(const MSVCRT_wchar_t *str, const MSVCRT_size_t limit,
+        const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, ...)
+{
+    __ms_va_list valist;
+    int res;
+
+    __ms_va_start(valist, locale);
+    res = MSVCRT_vsnwscanf_s_l(str, limit, format, locale, valist);
+    __ms_va_end(valist);
+    return res;
+}
+
+/*********************************************************************
  *		_cscanf (MSVCRT.@)
  */
 int CDECL _cscanf(const char *format, ...)
diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index b78d57c..05f0977 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -63,8 +63,28 @@
 #endif /* WIDE_SCANF */
 #else
 #ifdef STRING
+
 #undef _EOF_
 #define _EOF_ 0
+
+#ifdef STRING_LIMITED
+
+#define _GETC_(file) (consumed++, consumed <= limit ? *file++ : _EOF_ )
+#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, const MSVCRT_size_t limit, 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, const MSVCRT_size_t limit, 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, const MSVCRT_size_t limit, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#else  /* SECURE */
+#define _FUNCTION_ static int MSVCRT_vsnscanf_l(const char *file, const MSVCRT_size_t limit, const char *format, MSVCRT__locale_t locale, __ms_va_list ap)
+#endif /* SECURE */
+#endif /* WIDE_SCANF */
+#else /* STRING_LIMITED */
 #define _GETC_(file) (consumed++, *file++)
 #define _UNGETC_(nch, file) do { file--; consumed--; } while(0)
 #ifdef WIDE_SCANF
@@ -80,6 +100,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_LIMITED */
 #else /* STRING */
 #ifdef WIDE_SCANF
 #define _GETC_(file) (consumed++, MSVCRT_fgetwc(file))
diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h
index a190f5d..82c441c 100644
--- a/include/msvcrt/stdio.h
+++ b/include/msvcrt/stdio.h
@@ -114,6 +114,8 @@ int    __cdecl _rmtmp(void);
 int    __cdecl _setmaxstdio(int);
 int    __cdecl _snprintf(char*,size_t,const char*,...);
 int    __cdecl _snprintf_s(char*,size_t,size_t,const char*,...);
+int    __cdecl _snscanf(const char*,size_t,const char*,...);
+int    __cdecl _snscanf_s(const char*,size_t,const char*,...);
 char*  __cdecl _tempnam(const char*,const char*);
 int    __cdecl _unlink(const char*);
 int    __cdecl _vscprintf(const char*,__ms_va_list);
@@ -178,6 +180,8 @@ wchar_t* __cdecl _getws(wchar_t*);
 int      __cdecl _putws(const wchar_t*);
 int      __cdecl _snwprintf(wchar_t*,size_t,const wchar_t*,...);
 int      __cdecl _snwprintf_s(wchar_t*,size_t,size_t,const wchar_t*,...);
+int      __cdecl _snwscanf(const wchar_t*,size_t,const wchar_t*,...);
+int      __cdecl _snwscanf_s(const wchar_t*,size_t,const wchar_t*,...);
 int      __cdecl _vscwprintf(const wchar_t*,__ms_va_list);
 int      __cdecl _vsnwprintf(wchar_t*,size_t,const wchar_t*,__ms_va_list);
 int      __cdecl _vsnwprintf_s(wchar_t*,size_t,size_t,const wchar_t*,__ms_va_list);
diff --git a/include/msvcrt/wchar.h b/include/msvcrt/wchar.h
index c5ab25f..63c724d 100644
--- a/include/msvcrt/wchar.h
+++ b/include/msvcrt/wchar.h
@@ -276,6 +276,8 @@ wchar_t* __cdecl _getws(wchar_t*);
 int      __cdecl _putws(const wchar_t*);
 int      __cdecl _snwprintf(wchar_t*,size_t,const wchar_t*,...);
 int      __cdecl _snwprintf_s(wchar_t*,size_t,size_t,const wchar_t*,...);
+int      __cdecl _snwscanf(const wchar_t*,size_t,const wchar_t*,...);
+int      __cdecl _snwscanf_s(const wchar_t*,size_t,const wchar_t*,...);
 int      __cdecl _vscwprintf(const wchar_t*,__ms_va_list);
 int      __cdecl _vsnwprintf(wchar_t*,size_t,const wchar_t*,__ms_va_list);
 int      __cdecl _vsnwprintf_s(wchar_t*,size_t,size_t,const wchar_t*,__ms_va_list);
-- 
1.7.0.4




More information about the wine-patches mailing list