Module: wine Branch: master Commit: 231fc1145772011aae5a73ebaf9b911756302393 URL: http://source.winehq.org/git/wine.git/?a=commit;h=231fc1145772011aae5a73ebaf...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Apr 22 13:48:49 2010 +0200
msvcrt: Add support for locales in scanf helper functions.
---
dlls/msvcrt/scanf.c | 24 ++++++++++++------------ dlls/msvcrt/scanf.h | 17 ++++++++++------- 2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/dlls/msvcrt/scanf.c b/dlls/msvcrt/scanf.c index 8959897..8cbe964 100644 --- a/dlls/msvcrt/scanf.c +++ b/dlls/msvcrt/scanf.c @@ -57,31 +57,31 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) { return -1; }
-/* vfscanf */ +/* vfscanf_l */ #undef WIDE_SCANF #undef CONSOLE #undef STRING #include "scanf.h"
-/* vfwscanf */ +/* vfwscanf_l */ #define WIDE_SCANF 1 #undef CONSOLE #undef STRING #include "scanf.h"
-/* vsscanf */ +/* vsscanf_l */ #undef WIDE_SCANF #undef CONSOLE #define STRING 1 #include "scanf.h"
-/* vswscanf */ +/* vswscanf_l */ #define WIDE_SCANF 1 #undef CONSOLE #define STRING 1 #include "scanf.h"
-/* vcscanf */ +/* vcscanf_l */ #undef WIDE_SCANF #define CONSOLE 1 #undef STRING @@ -97,7 +97,7 @@ int CDECL MSVCRT_fscanf(MSVCRT_FILE *file, const char *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vfscanf(file, format, valist); + res = MSVCRT_vfscanf_l(file, format, NULL, valist); __ms_va_end(valist); return res; } @@ -111,7 +111,7 @@ int CDECL MSVCRT_scanf(const char *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vfscanf(MSVCRT_stdin, format, valist); + res = MSVCRT_vfscanf_l(MSVCRT_stdin, format, NULL, valist); __ms_va_end(valist); return res; } @@ -125,7 +125,7 @@ int CDECL MSVCRT_fwscanf(MSVCRT_FILE *file, const MSVCRT_wchar_t *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vfwscanf(file, format, valist); + res = MSVCRT_vfwscanf_l(file, format, NULL, valist); __ms_va_end(valist); return res; } @@ -140,7 +140,7 @@ int CDECL MSVCRT_wscanf(const MSVCRT_wchar_t *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vfwscanf(MSVCRT_stdin, format, valist); + res = MSVCRT_vfwscanf_l(MSVCRT_stdin, format, NULL, valist); __ms_va_end(valist); return res; } @@ -155,7 +155,7 @@ int CDECL MSVCRT_sscanf(const char *str, const char *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vsscanf(str, format, valist); + res = MSVCRT_vsscanf_l(str, format, NULL, valist); __ms_va_end(valist); return res; } @@ -170,7 +170,7 @@ int CDECL MSVCRT_swscanf(const MSVCRT_wchar_t *str, const MSVCRT_wchar_t *format int res;
__ms_va_start(valist, format); - res = MSVCRT_vswscanf(str, format, valist); + res = MSVCRT_vswscanf_l(str, format, NULL, valist); __ms_va_end(valist); return res; } @@ -185,7 +185,7 @@ int CDECL _cscanf(const char *format, ...) int res;
__ms_va_start(valist, format); - res = MSVCRT_vcscanf(format, valist); + res = MSVCRT_vcscanf_l(format, NULL, valist); __ms_va_end(valist); return res; } diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index 953c133..086854f 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -48,7 +48,7 @@ #ifdef CONSOLE #define _GETC_(file) (consumed++, _getch()) #define _UNGETC_(nch, file) do { _ungetch(nch); consumed--; } while(0) -#define _FUNCTION_ static int MSVCRT_vcscanf(const char *format, __ms_va_list ap) +#define _FUNCTION_ static int MSVCRT_vcscanf_l(const char *format, MSVCRT__locale_t locale, __ms_va_list ap) #else #ifdef STRING #undef _EOF_ @@ -56,19 +56,19 @@ #define _GETC_(file) (consumed++, *file++) #define _UNGETC_(nch, file) do { file--; consumed--; } while(0) #ifdef WIDE_SCANF -#define _FUNCTION_ static int MSVCRT_vswscanf(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, __ms_va_list ap) +#define _FUNCTION_ static int MSVCRT_vswscanf_l(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap) #else /* WIDE_SCANF */ -#define _FUNCTION_ static int MSVCRT_vsscanf(const char *file, const char *format, __ms_va_list ap) +#define _FUNCTION_ static int MSVCRT_vsscanf_l(const char *file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap) #endif /* WIDE_SCANF */ #else /* STRING */ #ifdef WIDE_SCANF #define _GETC_(file) (consumed++, MSVCRT_fgetwc(file)) #define _UNGETC_(nch, file) do { MSVCRT_ungetwc(nch, file); consumed--; } while(0) -#define _FUNCTION_ static int MSVCRT_vfwscanf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list ap) +#define _FUNCTION_ static int MSVCRT_vfwscanf_l(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, __ms_va_list ap) #else /* WIDE_SCANF */ #define _GETC_(file) (consumed++, MSVCRT_fgetc(file)) #define _UNGETC_(nch, file) do { MSVCRT_ungetc(nch, file); consumed--; } while(0) -#define _FUNCTION_ static int MSVCRT_vfscanf(MSVCRT_FILE* file, const char *format, __ms_va_list ap) +#define _FUNCTION_ static int MSVCRT_vfscanf_l(MSVCRT_FILE* file, const char *format, MSVCRT__locale_t locale, __ms_va_list ap) #endif /* WIDE_SCANF */ #endif /* STRING */ #endif /* CONSOLE */ @@ -91,6 +91,9 @@ _FUNCTION_ { nch = _GETC_(file); if (nch == _EOF_) return _EOF_RET;
+ if(!locale) + locale = get_locale(); + while (*format) { /* a whitespace character in the format string causes scanf to read, * but not store, all consecutive white-space characters in the input @@ -250,7 +253,7 @@ _FUNCTION_ { nch = _GETC_(file); } /* get first digit. */ - if ('.' != nch) { + if (*locale->locinfo->lconv->decimal_point != nch) { if (!_ISDIGIT_(nch)) break; cur = (nch - '0'); nch = _GETC_(file); @@ -265,7 +268,7 @@ _FUNCTION_ { cur = 0; /* MaxPayneDemo Fix: .8 -> 0.8 */ } /* handle decimals */ - if (width!=0 && nch == '.') { + if (width!=0 && nch == *locale->locinfo->lconv->decimal_point) { long double dec = 1; nch = _GETC_(file); if (width>0) width--;