Author: fireball
Date: Wed Jun 4 04:10:40 2008
New Revision: 33850
URL:
http://svn.reactos.org/svn/reactos?rev=33850&view=rev
Log:
- Remove duplicated sscanf wrapper.
- Sync scanf.c / scanf.h with Wine.
Removed:
trunk/reactos/lib/sdk/crt/string/sscanf.c
Modified:
trunk/reactos/lib/sdk/crt/libcntpr.rbuild
trunk/reactos/lib/sdk/crt/wine/scanf.c
trunk/reactos/lib/sdk/crt/wine/scanf.h
Modified: trunk/reactos/lib/sdk/crt/libcntpr.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/libcntpr.rbuil…
==============================================================================
--- trunk/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/libcntpr.rbuild [iso-8859-1] Wed Jun 4 04:10:40 2008
@@ -148,7 +148,6 @@
<file>itow.c</file>
<file>mbstowcs_nt.c</file>
<file>splitp.c</file>
- <file>sscanf.c</file>
<file>strtol.c</file>
<file>strtoul.c</file>
<file>strtoull.c</file>
@@ -158,6 +157,10 @@
<file>wtoi64.c</file>
<file>wtoi.c</file>
<file>wtol.c</file>
+ </directory>
+
+ <directory name="wine">
+ <file>scanf.c</file>
</directory>
<directory name="wstring">
Removed: trunk/reactos/lib/sdk/crt/string/sscanf.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/sscanf.…
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/sscanf.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/sscanf.c (removed)
@@ -1,50 +1,0 @@
-#include <precomp.h>
-
-#include <wchar.h>
-#include <ctype.h>
-
-#define NDEBUG
-#include <internal/debug.h>
-
-#ifndef TRACE
-#define TRACE DPRINT
-#endif
-#define WARN DPRINT1
-
-
-#define EOF (-1)
-
-/* 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.
- */
-static int char2digit(char c, int base) {
- if ((c>='0') && (c<='9') &&
(c<='0'+base-1)) return (c-'0');
- if (base<=10) return -1;
- if ((c>='A') && (c<='Z') &&
(c<='A'+base-11)) return (c-'A'+10);
- if ((c>='a') && (c<='z') &&
(c<='a'+base-11)) return (c-'a'+10);
- return -1;
-}
-
-/* vsscanf */
-#undef WIDE_SCANF
-#undef CONSOLE
-#define STRING 1
-
-#ifdef _MSC_VER
-#define debugstr_a(x) x
-#endif
-
-#include "wine/scanf.h"
-
-int sscanf(const char *str, const char *format, ...)
-{
- va_list valist;
- int res;
-
- va_start(valist, format);
- res = vsscanf(str, format, valist);
- va_end(valist);
- return res;
-}
-
-/*EOF */
Modified: trunk/reactos/lib/sdk/crt/wine/scanf.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/wine/scanf.c?r…
==============================================================================
--- trunk/reactos/lib/sdk/crt/wine/scanf.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/wine/scanf.c [iso-8859-1] Wed Jun 4 04:10:40 2008
@@ -20,7 +20,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <precomp.h>
@@ -149,7 +149,7 @@
/*********************************************************************
* sscanf (MSVCRT.@)
*/
-int crt_sscanf(const char *str, const char *format, ...)
+int sscanf(const char *str, const char *format, ...)
{
va_list valist;
int res;
Modified: trunk/reactos/lib/sdk/crt/wine/scanf.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/wine/scanf.h?r…
==============================================================================
--- trunk/reactos/lib/sdk/crt/wine/scanf.h [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/wine/scanf.h [iso-8859-1] Wed Jun 4 04:10:40 2008
@@ -20,7 +20,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifdef WIDE_SCANF
@@ -73,12 +73,6 @@
#endif /* STRING */
#endif /* CONSOLE */
-/*********************************************************************
- * Implemented based on
- *
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/h…
- * Extended by C. Scott Ananian <cananian(a)alumni.princeton.edu> to handle
- * more types of format spec.
- */
_FUNCTION_ {
int rd = 0, consumed = 0;
int nch;
@@ -98,412 +92,389 @@
if (nch == _EOF_) return _EOF_RET;
while (*format) {
- /* a whitespace character in the format string causes scanf to read,
- * but not store, all consecutive white-space characters in the input
- * up to the next non-white-space character. One white space character
- * in the input matches any number (including zero) and combination of
- * white-space characters in the input. */
- if (_ISSPACE_(*format)) {
+ /* a whitespace character in the format string causes scanf to read,
+ * but not store, all consecutive white-space characters in the input
+ * up to the next non-white-space character. One white space character
+ * in the input matches any number (including zero) and combination of
+ * white-space characters in the input. */
+ if (_ISSPACE_(*format)) {
/* skip whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
}
- /* a format specification causes scanf to read and convert characters
- * in the input into values of a specified type. The value is assigned
- * to an argument in the argument list. Format specifications have
- * the form %[*][width][{h | l | I64 | L}]type */
+ /* a format specification causes scanf to read and convert characters
+ * in the input into values of a specified type. The value is assigned
+ * to an argument in the argument list. Format specifications have
+ * the form %[*][width][{h | l | I64 | L}]type */
else if (*format == '%') {
int st = 0; int suppress = 0; int width = 0;
- int base, number_signed;
- int h_prefix = 0;
- int l_prefix = 0;
- int L_prefix = 0;
- int w_prefix = 0;
- int prefix_finished = 0;
- int I64_prefix = 0;
+ int base;
+ int h_prefix = 0;
+ int l_prefix = 0;
+ int L_prefix = 0;
+ int w_prefix = 0;
+ int prefix_finished = 0;
+ int I64_prefix = 0;
format++;
- /* look for leading asterisk, which means 'suppress assignment of
- * this field'. */
- if (*format=='*') {
- format++;
- suppress=1;
- }
- /* look for width specification */
- while (_ISDIGIT_(*format)) {
- width*=10;
- width+=*format++ - '0';
- }
- if (width==0) width=-1; /* no width spec seen */
- /* read prefix (if any) */
- while (!prefix_finished) {
- switch(*format) {
- case 'h': h_prefix = 1; break;
- case 'l': l_prefix = 1; break;
- case 'w': w_prefix = 1; break;
- case 'L': L_prefix = 1; break;
- case 'I':
- if (*(format + 1) == '6' &&
- *(format + 2) == '4') {
- I64_prefix = 1;
- format += 2;
- }
- break;
- default:
- prefix_finished = 1;
- }
- if (!prefix_finished) format++;
- }
- /* read type */
+ /* look for leading asterisk, which means 'suppress assignment of
+ * this field'. */
+ if (*format=='*') {
+ format++;
+ suppress=1;
+ }
+ /* look for width specification */
+ while (_ISDIGIT_(*format)) {
+ width*=10;
+ width+=*format++ - '0';
+ }
+ if (width==0) width=-1; /* no width spec seen */
+ /* read prefix (if any) */
+ while (!prefix_finished) {
+ switch(*format) {
+ case 'h': h_prefix = 1; break;
+ case 'l': l_prefix = 1; break;
+ case 'w': w_prefix = 1; break;
+ case 'L': L_prefix = 1; break;
+ case 'I':
+ if (*(format + 1) == '6' &&
+ *(format + 2) == '4') {
+ I64_prefix = 1;
+ format += 2;
+ }
+ break;
+ default:
+ prefix_finished = 1;
+ }
+ if (!prefix_finished) format++;
+ }
+ /* read type */
switch(*format) {
- case 'x':
- case 'X': /* hexadecimal integer. */
- base = 16; number_signed = 0;
- goto number;
- case 'o': /* octal integer */
- base = 8; number_signed = 0;
- goto number;
- case 'u': /* unsigned decimal integer */
- base = 10; number_signed = 0;
- goto number;
- case 'd': /* signed decimal integer */
- base = 10; number_signed = 1;
- goto number;
- case 'i': /* generic integer */
- base = 10; number_signed = 1;
- number: {
- /* read an integer */
- ULONGLONG cur = 0;
- int negative = 0;
- int seendigit=0;
+ case 'x':
+ case 'X': /* hexadecimal integer. */
+ base = 16;
+ goto number;
+ case 'o': /* octal integer */
+ base = 8;
+ goto number;
+ case 'u': /* unsigned decimal integer */
+ base = 10;
+ goto number;
+ case 'd': /* signed decimal integer */
+ base = 10;
+ goto number;
+ case 'i': /* generic integer */
+ base = 0;
+ number: {
+ /* read an integer */
+ ULONGLONG cur = 0;
+ int negative = 0;
+ int seendigit=0;
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
/* get sign */
- if (number_signed && (nch == '-' ||
- nch == '+')) {
- negative = (nch=='-');
- nch = _GETC_(file);
- if (width>0) width--;
- }
- /* look for leading indication of base */
- if (width!=0 && nch == '0') {
- nch = _GETC_(file);
- if (width>0) width--;
- seendigit=1;
- if (width!=0 && (nch=='x' || nch=='X')) {
- if (base==0)
- base=16;
- if (base==16) {
- nch = _GETC_(file);
- if (width>0) width--;
- seendigit=0;
- }
- } else if (base==0)
- base = 8;
- }
- /* throw away leading zeros */
- while (width!=0 && nch=='0') {
- nch = _GETC_(file);
- if (width>0) width--;
- seendigit=1;
- }
- if (width!=0 && _CHAR2DIGIT_(nch, base)!=-1) {
- cur = _CHAR2DIGIT_(nch, base);
- nch = _GETC_(file);
- if (width>0) width--;
- seendigit=1;
- }
+ if (nch == '-' || nch == '+') {
+ negative = (nch=='-');
+ nch = _GETC_(file);
+ if (width>0) width--;
+ }
+ /* look for leading indication of base */
+ if (width!=0 && nch == '0') {
+ nch = _GETC_(file);
+ if (width>0) width--;
+ seendigit=1;
+ if (width!=0 && (nch=='x' || nch=='X')) {
+ if (base==0)
+ base=16;
+ if (base==16) {
+ nch = _GETC_(file);
+ if (width>0) width--;
+ seendigit=0;
+ }
+ } else if (base==0)
+ base = 8;
+ }
+ /* format %i without indication of base */
+ if (base==0)
+ base = 10;
+ /* throw away leading zeros */
+ while (width!=0 && nch=='0') {
+ nch = _GETC_(file);
+ if (width>0) width--;
+ seendigit=1;
+ }
+ if (width!=0 && _CHAR2DIGIT_(nch, base)!=-1) {
+ cur = _CHAR2DIGIT_(nch, base);
+ nch = _GETC_(file);
+ if (width>0) width--;
+ seendigit=1;
+ }
/* read until no more digits */
while (width!=0 && (nch!=_EOF_) && _CHAR2DIGIT_(nch,
base)!=-1) {
cur = cur*base + _CHAR2DIGIT_(nch, base);
nch = _GETC_(file);
- if (width>0) width--;
- seendigit=1;
- }
- /* okay, done! */
- if (!seendigit) break; /* not a valid number */
+ if (width>0) width--;
+ seendigit=1;
+ }
+ /* okay, done! */
+ if (!seendigit) break; /* not a valid number */
st = 1;
if (!suppress) {
#define _SET_NUMBER_(type) *va_arg(ap, type*) = negative ? -cur : cur
- if (number_signed) {
- if (I64_prefix) _SET_NUMBER_(LONGLONG);
- else if (l_prefix) _SET_NUMBER_(long int);
- else if (h_prefix) _SET_NUMBER_(short int);
- else _SET_NUMBER_(int);
- } else {
- if (negative) {
- WARN("Dropping sign in reading a negative number into an unsigned
value");
- negative = 0;
- }
- if (I64_prefix) _SET_NUMBER_(ULONGLONG);
- else if (l_prefix) _SET_NUMBER_(unsigned long int);
- else if (h_prefix)
- _SET_NUMBER_(unsigned short int);
- else _SET_NUMBER_(unsigned int);
- }
- }
+ if (I64_prefix) _SET_NUMBER_(LONGLONG);
+ else if (l_prefix) _SET_NUMBER_(long int);
+ else if (h_prefix) _SET_NUMBER_(short int);
+ else _SET_NUMBER_(int);
+ }
}
break;
- case 'e':
- case 'E':
- case 'f':
- case 'g':
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
case 'G': { /* read a float */
long double cur = 0;
- int negative = 0;
+ int negative = 0;
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
- /* get sign. */
+ /* get sign. */
if (nch == '-' || nch == '+') {
- negative = (nch=='-');
- if (width>0) width--;
- if (width==0) break;
- nch = _GETC_(file);
- }
- /* get first digit. */
- if ('.' != nch) {
- if (!_ISDIGIT_(nch)) break;
- cur = (nch - '0');
- nch = _GETC_(file);
- if (width>0) width--;
- /* read until no more digits */
- while (width!=0 && (nch!=_EOF_) && _ISDIGIT_(nch)) {
+ negative = (nch=='-');
+ if (width>0) width--;
+ if (width==0) break;
+ nch = _GETC_(file);
+ }
+ /* get first digit. */
+ if ('.' != nch) {
+ if (!_ISDIGIT_(nch)) break;
+ cur = (nch - '0');
+ nch = _GETC_(file);
+ if (width>0) width--;
+ /* read until no more digits */
+ while (width!=0 && (nch!=_EOF_) && _ISDIGIT_(nch)) {
cur = cur*10 + (nch - '0');
nch = _GETC_(file);
- if (width>0) width--;
- }
- } else {
- cur = 0; /* MaxPayneDemo Fix: .8 -> 0.8 */
- }
- /* handle decimals */
+ if (width>0) width--;
+ }
+ } else {
+ cur = 0; /* MaxPayneDemo Fix: .8 -> 0.8 */
+ }
+ /* handle decimals */
if (width!=0 && nch == '.') {
float dec = 1;
nch = _GETC_(file);
- if (width>0) width--;
+ if (width>0) width--;
while (width!=0 && (nch!=_EOF_) &&
_ISDIGIT_(nch)) {
dec /= 10;
cur += dec * (nch - '0');
nch = _GETC_(file);
- if (width>0) width--;
+ if (width>0) width--;
}
}
- /* handle exponent */
- if (width!=0 && (nch == 'e' || nch == 'E')) {
- int exponent = 0, negexp = 0;
- float expcnt;
- nch = _GETC_(file);
- if (width>0) width--;
- /* possible sign on the exponent */
- if (width!=0 && (nch=='+' || nch=='-')) {
- negexp = (nch=='-');
+ /* handle exponent */
+ if (width!=0 && (nch == 'e' || nch == 'E')) {
+ int exponent = 0, negexp = 0;
+ float expcnt;
+ nch = _GETC_(file);
+ if (width>0) width--;
+ /* possible sign on the exponent */
+ if (width!=0 && (nch=='+' || nch=='-')) {
+ negexp = (nch=='-');
nch = _GETC_(file);
- if (width>0) width--;
- }
- /* exponent digits */
- while (width!=0 && (nch!=_EOF_) && _ISDIGIT_(nch)) {
- exponent *= 10;
- exponent += (nch - '0');
+ if (width>0) width--;
+ }
+ /* exponent digits */
+ while (width!=0 && (nch!=_EOF_) && _ISDIGIT_(nch)) {
+ exponent *= 10;
+ exponent += (nch - '0');
nch = _GETC_(file);
- if (width>0) width--;
+ if (width>0) width--;
}
- /* update 'cur' with this exponent. */
- expcnt = negexp ? .1 : 10;
- while (exponent!=0) {
- if (exponent&1)
- cur*=expcnt;
- exponent/=2;
- expcnt=expcnt*expcnt;
- }
- }
+ /* update 'cur' with this exponent. */
+ expcnt = negexp ? .1 : 10;
+ while (exponent!=0) {
+ if (exponent&1)
+ cur*=expcnt;
+ exponent/=2;
+ expcnt=expcnt*expcnt;
+ }
+ }
st = 1;
if (!suppress) {
- if (L_prefix) _SET_NUMBER_(long double);
- else if (l_prefix) _SET_NUMBER_(double);
- else _SET_NUMBER_(float);
- }
+ if (L_prefix) _SET_NUMBER_(long double);
+ else if (l_prefix) _SET_NUMBER_(double);
+ else _SET_NUMBER_(float);
+ }
}
break;
- /* According to
- *
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html…
- * 's' reads a character string in a call to fscanf
- * and 'S' a wide character string and vice versa in a
- * call to fwscanf. The 'h', 'w' and 'l' prefixes override
- * this behaviour. 'h' forces reading char * but 'l' and
'w'
- * force reading WCHAR. */
- case 's':
- if (w_prefix || l_prefix) goto widecharstring;
- else if (h_prefix) goto charstring;
-#ifdef WIDE_SCANF
- else goto widecharstring;
-#else /* WIDE_SCANF */
- else goto charstring;
-#endif /* WIDE_SCANF */
- case 'S':
- if (w_prefix || l_prefix) goto widecharstring;
- else if (h_prefix) goto charstring;
-#ifdef WIDE_SCANF
- else goto charstring;
-#else /* WIDE_SCANF */
- else goto widecharstring;
-#endif /* WIDE_SCANF */
- charstring: { /* read a word into a char */
- char*str = suppress ? NULL : va_arg(ap, char*);
- char*sptr = str;
+ /* According to msdn,
+ * 's' reads a character string in a call to fscanf
+ * and 'S' a wide character string and vice versa in a
+ * call to fwscanf. The 'h', 'w' and 'l' prefixes override
+ * this behaviour. 'h' forces reading char * but 'l' and 'w'
+ * force reading WCHAR. */
+ case 's':
+ if (w_prefix || l_prefix) goto widecharstring;
+ else if (h_prefix) goto charstring;
+#ifdef WIDE_SCANF
+ else goto widecharstring;
+#else /* WIDE_SCANF */
+ else goto charstring;
+#endif /* WIDE_SCANF */
+ case 'S':
+ if (w_prefix || l_prefix) goto widecharstring;
+ else if (h_prefix) goto charstring;
+#ifdef WIDE_SCANF
+ else goto charstring;
+#else /* WIDE_SCANF */
+ else goto widecharstring;
+#endif /* WIDE_SCANF */
+ charstring: { /* read a word into a char */
+ char *sptr = suppress ? NULL : va_arg(ap, char*);
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
/* read until whitespace */
while (width!=0 && (nch!=_EOF_) && !_ISSPACE_(nch))
{
if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
- st++;
- nch = _GETC_(file);
- if (width>0) width--;
+ st++;
+ nch = _GETC_(file);
+ if (width>0) width--;
}
/* terminate */
if (!suppress) *sptr = 0;
}
break;
- widecharstring: { /* read a word into a wchar_t* */
- wchar_t*str =
- suppress ? NULL : va_arg(ap, wchar_t*);
- wchar_t*sptr = str;
+ widecharstring: { /* read a word into a wchar_t* */
+ wchar_t *sptr = suppress ? NULL : va_arg(ap, wchar_t*);
/* skip initial whitespace */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
/* read until whitespace */
while (width!=0 && (nch!=_EOF_) && !_ISSPACE_(nch))
{
if (!suppress) *sptr++ = _WIDE2SUPPORTED_(nch);
- st++;
- nch = _GETC_(file);
- if (width>0) width--;
+ st++;
+ nch = _GETC_(file);
+ if (width>0) width--;
}
/* terminate */
if (!suppress) *sptr = 0;
}
break;
/* 'c' and 'C work analogously to 's' and 'S' as
described
- * above */
- case 'c':
- if (w_prefix || l_prefix) goto widecharacter;
- else if (h_prefix) goto character;
-#ifdef WIDE_SCANF
- else goto widecharacter;
-#else /* WIDE_SCANF */
- else goto character;
-#endif /* WIDE_SCANF */
- case 'C':
- if (w_prefix || l_prefix) goto widecharacter;
- else if (h_prefix) goto character;
-#ifdef WIDE_SCANF
- else goto character;
-#else /* WIDE_SCANF */
- else goto widecharacter;
-#endif /* WIDE_SCANF */
- character: { /* read single character into char */
- if (nch!=_EOF_) {
- if (!suppress) {
- char*c = va_arg(ap, char*);
- *c = _CHAR2SUPPORTED_(nch);
- }
- st = 1;
- nch = _GETC_(file);
- }
- }
- break;
- widecharacter: { /* read single character into a wchar_t */
- if (nch!=_EOF_) {
- if (!suppress) {
- wchar_t*c = va_arg(ap, wchar_t*);
- *c = _WIDE2SUPPORTED_(nch);
- }
- nch = _GETC_(file);
- st = 1;
- }
- }
- break;
- case 'n': {
- if (!suppress) {
- int*n = va_arg(ap, int*);
-
- /*
- *n = consumed - (nch!=_EOF_);
-
- FIXME: The above is the Wine version and it doesnt work in ros
- when %n is at end of input string (return one too many).
- But does it fail in Wine too?? If so wine also needs fixin.
- -Gunnar
- */
-
- *n = consumed - 1;
- }
- /* This is an odd one: according to the standard,
- * "Execution of a %n directive does not increment the
- * assignment count returned at the completion of
- * execution" even if it wasn't suppressed with the
- * '*' flag. The Corrigendum to the standard seems
- * to contradict this (comment out the assignment to
- * suppress below if you want to implement these
- * alternate semantics) but the windows program I'm
- * looking at expects the behavior I've coded here
- * (which happens to be what glibc does as well).
- */
- suppress = 1;
- st = 1;
- }
- break;
- case '[': {
+ * above */
+ case 'c':
+ if (w_prefix || l_prefix) goto widecharacter;
+ else if (h_prefix) goto character;
+#ifdef WIDE_SCANF
+ else goto widecharacter;
+#else /* WIDE_SCANF */
+ else goto character;
+#endif /* WIDE_SCANF */
+ case 'C':
+ if (w_prefix || l_prefix) goto widecharacter;
+ else if (h_prefix) goto character;
+#ifdef WIDE_SCANF
+ else goto character;
+#else /* WIDE_SCANF */
+ else goto widecharacter;
+#endif /* WIDE_SCANF */
+ character: { /* read single character into char */
+ char *str = suppress ? NULL : va_arg(ap, char*);
+ if (width == -1) width = 1;
+ while ((width != 0) && (nch != _EOF_))
+ {
+ if (!suppress) *str++ = _CHAR2SUPPORTED_(nch);
+ st++;
+ width--;
+ nch = _GETC_(file);
+ }
+ }
+ break;
+ widecharacter: { /* read single character into a wchar_t */
+ wchar_t *str = suppress ? NULL : va_arg(ap, wchar_t*);
+ if (width == -1) width = 1;
+ while ((width != 0) && (nch != _EOF_))
+ {
+ if (!suppress) *str++ = _WIDE2SUPPORTED_(nch);
+ st++;
+ width--;
+ nch = _GETC_(file);
+ }
+ }
+ break;
+ case 'n': {
+ if (!suppress) {
+ int*n = va_arg(ap, int*);
+ *n = consumed - 1;
+ }
+ /* This is an odd one: according to the standard,
+ * "Execution of a %n directive does not increment the
+ * assignment count returned at the completion of
+ * execution" even if it wasn't suppressed with the
+ * '*' flag. The Corrigendum to the standard seems
+ * to contradict this (comment out the assignment to
+ * suppress below if you want to implement these
+ * alternate semantics) but the windows program I'm
+ * looking at expects the behavior I've coded here
+ * (which happens to be what glibc does as well).
+ */
+ suppress = 1;
+ st = 1;
+ }
+ break;
+ case '[': {
_CHAR_ *str = suppress ? NULL : va_arg(ap, _CHAR_*);
_CHAR_ *sptr = str;
- RTL_BITMAP bitMask;
+ RTL_BITMAP bitMask;
ULONG *Mask;
- int invert = 0; /* Set if we are NOT to find the chars */
-
- /* Init our bitmap */
+ int invert = 0; /* Set if we are NOT to find the chars */
+
+ /* Init our bitmap */
#ifdef _LIBCNT_
- Mask = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, _BITMAPSIZE_/8);
+ Mask = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
_BITMAPSIZE_/8);
#else
- Mask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, _BITMAPSIZE_/8);
+ Mask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, _BITMAPSIZE_/8);
#endif
- RtlInitializeBitMap(&bitMask, Mask, _BITMAPSIZE_);
-
- /* Read the format */
- format++;
- if(*format == '^') {
- invert = 1;
- format++;
- }
- if(*format == ']') {
- RtlSetBits(&bitMask, ']', 1);
- format++;
- }
+ RtlInitializeBitMap(&bitMask, Mask, _BITMAPSIZE_);
+
+ /* Read the format */
+ format++;
+ if(*format == '^') {
+ invert = 1;
+ format++;
+ }
+ if(*format == ']') {
+ RtlSetBits(&bitMask, ']', 1);
+ format++;
+ }
while(*format && (*format != ']')) {
- /* According to:
- *
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/h…
- * "Note that %[a-z] and %[z-a] are interpreted as equivalent to
%[abcde...z]." */
- if((*format == '-') && (*(format + 1) != ']')) {
- if ((*(format - 1)) < *(format + 1))
- RtlSetBits(&bitMask, *(format - 1) +1 , *(format + 1) - *(format - 1));
- else
- RtlSetBits(&bitMask, *(format + 1) , *(format - 1) - *(format + 1));
- format++;
- } else
- RtlSetBits(&bitMask, *format, 1);
- format++;
- }
+ /* According to msdn:
+ * "Note that %[a-z] and %[z-a] are interpreted as equivalent to
%[abcde...z]." */
+ if((*format == '-') && (*(format + 1) != ']')) {
+ if ((*(format - 1)) < *(format + 1))
+ RtlSetBits(&bitMask, *(format - 1) +1 , *(format + 1) - *(format - 1));
+ else
+ RtlSetBits(&bitMask, *(format + 1) , *(format - 1) - *(format + 1));
+ format++;
+ } else
+ RtlSetBits(&bitMask, *format, 1);
+ format++;
+ }
/* read until char is not suitable */
while ((width != 0) && (nch != _EOF_)) {
- if(!invert) {
- if(RtlAreBitsSet(&bitMask, nch, 1)) {
- if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
- } else
- break;
- } else {
- if(RtlAreBitsClear(&bitMask, nch, 1)) {
- if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
- } else
- break;
- }
+ if(!invert) {
+ if(RtlAreBitsSet(&bitMask, nch, 1)) {
+ if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
+ } else
+ break;
+ } else {
+ if(RtlAreBitsClear(&bitMask, nch, 1)) {
+ if (!suppress) *sptr++ = _CHAR2SUPPORTED_(nch);
+ } else
+ break;
+ }
st++;
nch = _GETC_(file);
if (width>0) width--;
@@ -511,20 +482,20 @@
/* terminate */
if (!suppress) *sptr = 0;
#ifdef _LIBCNT_
- RtlFreeHeap(RtlGetProcessHeap(), 0, Mask);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Mask);
#else
- HeapFree(GetProcessHeap(), 0, Mask);
+ HeapFree(GetProcessHeap(), 0, Mask);
#endif
}
break;
default:
- /* From spec: "if a percent sign is followed by a character
- * that has no meaning as a format-control character, that
- * character and the following characters are treated as
- * an ordinary sequence of characters, that is, a sequence
- * of characters that must match the input. For example,
- * to specify that a percent-sign character is to be input,
- * use %%." */
+ /* From spec: "if a percent sign is followed by a character
+ * that has no meaning as a format-control character, that
+ * character and the following characters are treated as
+ * an ordinary sequence of characters, that is, a sequence
+ * of characters that must match the input. For example,
+ * to specify that a percent-sign character is to be input,
+ * use %%." */
while ((nch!=_EOF_) && _ISSPACE_(nch))
nch = _GETC_(file);
if (nch==*format) {
@@ -537,18 +508,18 @@
if (st && !suppress) rd++;
else if (!st) break;
}
- /* a non-white-space character causes scanf to read, but not store,
- * a matching non-white-space character. */
+ /* a non-white-space character causes scanf to read, but not store,
+ * a matching non-white-space character. */
else {
/* check for character match */
if (nch == *format) {
- nch = _GETC_(file);
+ nch = _GETC_(file);
} else break;
}
format++;
}
if (nch!=_EOF_) {
- _UNGETC_(nch, file);
+ _UNGETC_(nch, file);
}
TRACE("returning %d\n", rd);
return rd;