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.rbuild... ============================================================================== --- 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.c... ============================================================================== --- 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?re... ============================================================================== --- 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?re... ============================================================================== --- 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/ht... - * Extended by C. Scott Ananian cananian@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/ht... - * "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;