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