[ros-diffs] [fireball] 33850: - Remove duplicated sscanf wrapper. - Sync scanf.c / scanf.h with Wine.

fireball at svn.reactos.org fireball at svn.reactos.org
Wed Jun 4 11:10:41 CEST 2008


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?rev=33850&r1=33849&r2=33850&view=diff
==============================================================================
--- 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?rev=33849&view=auto
==============================================================================
--- 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?rev=33850&r1=33849&r2=33850&view=diff
==============================================================================
--- 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?rev=33850&r1=33849&r2=33850&view=diff
==============================================================================
--- 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/html/_crt_format_specification_fields_.2d_.scanf_and_wscanf_functions.asp
- * Extended by C. Scott Ananian <cananian at 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/_crt_scanf_type_field_characters.asp
-       * '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/html/_crt_scanf_width_specification.asp
-          * "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;



More information about the Ros-diffs mailing list