Fixed varargs handling in the scanf functions (spotted by Eric

Pouech).
This commit is contained in:
Alexandre Julliard 2004-02-19 01:13:12 +00:00
parent 80d8cc36b4
commit c042e13ef6
4 changed files with 124 additions and 56 deletions

View File

@ -73,9 +73,6 @@ MSVCRT_FILE* MSVCRT_files[MSVCRT_MAX_FILES];
int MSVCRT_flags[MSVCRT_MAX_FILES];
char *MSVCRT_tempfiles[MSVCRT_MAX_FILES];
MSVCRT_FILE MSVCRT__iob[3];
#define MSVCRT_stdin (MSVCRT__iob+STDIN_FILENO)
#define MSVCRT_stdout (MSVCRT__iob+STDOUT_FILENO)
#define MSVCRT_stderr (MSVCRT__iob+STDERR_FILENO)
static int MSVCRT_fdstart = 3; /* first unallocated fd */
static int MSVCRT_fdend = 3; /* highest allocated fd */
@ -2374,34 +2371,6 @@ int _wremove(const MSVCRT_wchar_t *path)
return -1;
}
/*********************************************************************
* scanf (MSVCRT.@)
*/
int MSVCRT_scanf(const char *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_fscanf(MSVCRT_stdin, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* wscanf (MSVCRT.@)
*/
int MSVCRT_wscanf(const MSVCRT_wchar_t *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_fwscanf(MSVCRT_stdin, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* rename (MSVCRT.@)
*/

View File

@ -38,6 +38,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
extern MSVCRT_FILE MSVCRT__iob[];
/* helper function for *scanf. Returns the value of character c in the
* given base, or -1 if the given character is not a digit of the base.
*/
@ -60,43 +62,135 @@ static int wchar2digit(MSVCRT_wchar_t c, int base) {
return -1;
}
/*********************************************************************
* fscanf (MSVCRT.@)
*/
/* vfscanf */
#undef WIDE_SCANF
#undef CONSOLE
#undef STRING
#include "scanf.h"
/*********************************************************************
* fwscanf (MSVCRT.@)
*/
/* vfwscanf */
#define WIDE_SCANF 1
#undef CONSOLE
#undef STRING
#include "scanf.h"
/*********************************************************************
* sscanf (MSVCRT.@)
*/
/* vsscanf */
#undef WIDE_SCANF
#undef CONSOLE
#define STRING 1
#include "scanf.h"
/*********************************************************************
* swscanf (MSVCRT.@)
*/
/* vswscanf */
#define WIDE_SCANF 1
#undef CONSOLE
#define STRING 1
#include "scanf.h"
/*********************************************************************
* _cscanf (MSVCRT.@)
*/
/* vcscanf */
#undef WIDE_SCANF
#define CONSOLE 1
#undef STRING
#include "scanf.h"
/*********************************************************************
* fscanf (MSVCRT.@)
*/
int MSVCRT_fscanf(MSVCRT_FILE *file, const char *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vfscanf(file, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* scanf (MSVCRT.@)
*/
int MSVCRT_scanf(const char *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vfscanf(MSVCRT_stdin, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* fwscanf (MSVCRT.@)
*/
int MSVCRT_fwscanf(MSVCRT_FILE *file, const MSVCRT_wchar_t *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vfwscanf(file, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* wscanf (MSVCRT.@)
*/
int MSVCRT_wscanf(const MSVCRT_wchar_t *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vfwscanf(MSVCRT_stdin, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* sscanf (MSVCRT.@)
*/
int MSVCRT_sscanf(const char *str, const char *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vsscanf(str, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* swscanf (MSVCRT.@)
*/
int MSVCRT_swscanf(const MSVCRT_wchar_t *str, const MSVCRT_wchar_t *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vswscanf(str, format, valist);
va_end(valist);
return res;
}
/*********************************************************************
* _cscanf (MSVCRT.@)
*/
int _cscanf(const char *format, ...)
{
va_list valist;
int res;
va_start(valist, format);
res = MSVCRT_vcscanf(format, valist);
va_end(valist);
return res;
}

View File

@ -48,7 +48,7 @@
#ifdef CONSOLE
#define _GETC_(file) (consumed++, _getch())
#define _UNGETC_(nch, file) do { _ungetch(nch); consumed--; } while(0)
#define _FUNCTION_ _cscanf(const _CHAR_ *format, ...)
#define _FUNCTION_ static int MSVCRT_vcscanf(const char *format, 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_ MSVCRT_swscanf(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, ...)
#define _FUNCTION_ static int MSVCRT_vswscanf(const MSVCRT_wchar_t *file, const MSVCRT_wchar_t *format, va_list ap)
#else /* WIDE_SCANF */
#define _FUNCTION_ MSVCRT_sscanf(const char *file, const char *format, ...)
#define _FUNCTION_ static int MSVCRT_vsscanf(const char *file, const char *format, 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_ MSVCRT_fwscanf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, ...)
#define _FUNCTION_ static int MSVCRT_vfwscanf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, 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_ MSVCRT_fscanf(MSVCRT_FILE* file, const char *format, ...)
#define _FUNCTION_ static int MSVCRT_vfscanf(MSVCRT_FILE* file, const char *format, va_list ap)
#endif /* WIDE_SCANF */
#endif /* STRING */
#endif /* CONSOLE */
@ -79,10 +79,9 @@
* Extended by C. Scott Ananian <cananian@alumni.princeton.edu> to handle
* more types of format spec.
*/
int _FUNCTION_ {
_FUNCTION_ {
int rd = 0, consumed = 0;
int nch;
va_list ap;
if (!*format) return 0;
#ifndef WIDE_SCANF
#ifdef CONSOLE
@ -98,7 +97,6 @@ int _FUNCTION_ {
nch = _GETC_(file);
if (nch == _EOF_) return _EOF_RET;
va_start(ap, format);
while (*format) {
/* a whitespace character in the format string causes scanf to read,
* but not store, all consecutive white-space characters in the input
@ -512,7 +510,6 @@ int _FUNCTION_ {
if (nch!=_EOF_) {
_UNGETC_(nch, file);
}
va_end(ap);
TRACE("returning %d\n", rd);
return rd;
}

View File

@ -79,6 +79,10 @@
#else
#define MSVCRT_STDIN_FILENO 0
#define MSVCRT_STDOUT_FILENO 1
#define MSVCRT_STDERR_FILENO 2
/* more file._flag flags, but these conflict with Unix */
#define MSVCRT__IOFBF 0x0000
#define MSVCRT__IONBF 0x0004
@ -144,6 +148,10 @@ MSVCRT(FILE)* MSVCRT(__p__iob)(void);
#define stdin (_iob+STDIN_FILENO)
#define stdout (_iob+STDOUT_FILENO)
#define stderr (_iob+STDERR_FILENO)
#else
#define MSVCRT_stdin (MSVCRT__iob+MSVCRT_STDIN_FILENO)
#define MSVCRT_stdout (MSVCRT__iob+MSVCRT_STDOUT_FILENO)
#define MSVCRT_stderr (MSVCRT__iob+MSVCRT_STDERR_FILENO)
#endif /* USE_MSVCRT_PREFIX */
#ifndef MSVCRT_STDIO_DEFINED