improve scanf

György 'Nog' Jeney nog at sdf.lonestar.org
Sat Oct 12 12:32:48 CDT 2002


Ooops, that patch has got an error in it, use this one instead.

> ChangeLog:
>  * dlls/msvcrt/scanf.c
>  * dlls/msvcrt/scanf.h
>    Implement [ format specifier.
>
> nog.


-------------- next part --------------
Index: dlls/msvcrt/scanf.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/scanf.c,v
retrieving revision 1.1
diff -u -r1.1 scanf.c
--- dlls/msvcrt/scanf.c	17 Aug 2002 01:22:00 -0000	1.1
+++ dlls/msvcrt/scanf.c	12 Oct 2002 17:04:57 -0000
@@ -24,6 +24,7 @@
  */
 
 #include "winbase.h"
+#include "winternl.h"
 #include "msvcrt.h"
 #include "msvcrt/conio.h"
 #include "msvcrt/io.h"
Index: dlls/msvcrt/scanf.h
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/scanf.h,v
retrieving revision 1.3
diff -u -r1.3 scanf.h
--- dlls/msvcrt/scanf.h	29 Sep 2002 18:00:23 -0000	1.3
+++ dlls/msvcrt/scanf.h	12 Oct 2002 17:05:01 -0000
@@ -442,6 +442,79 @@
 		    }
 	        }
 		break;
+	    case _L_('['): {
+#ifdef WIDE_SCANF
+                    WCHAR *str = suppress ? NULL : va_arg(ap, WCHAR*);
+                    WCHAR *sptr = str;
+#else /* WIDE_SCANF */
+                    char *str = suppress ? NULL : va_arg(ap, char*);
+                    char *sptr = str;
+#endif /* WIDE_SCANF */
+		    RTL_BITMAP bitMask;
+                    LPBYTE Mask;
+		    int invert = 0; /* Set if we are NOT to find the chars */
+
+		    /* Init our bitmap */
+#ifdef WIDE_SCANF
+		    Mask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                     sizeof(WCHAR) * 32);
+		    RtlInitializeBitMap(&bitMask, Mask, sizeof(WCHAR) * 256);
+#else /* WIDE_SCANF */
+		    Mask = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                     sizeof(char) * 32);
+		    RtlInitializeBitMap(&bitMask, Mask, sizeof(char) * 256);
+#endif /* WIDE_SCANF */
+
+		    /* Read the format */
+		    format++;
+		    if(*format == '^') {
+			invert = 1;
+			format++;
+		    }
+		    if(*format == ']') {
+			RtlSetBits(&bitMask, ']', 1);
+			format++;
+		    }
+                    while(*format && (*format != ']')) {
+			if((*format == '-') && (*(format + 1) != ']')) {
+			    int n = 0;
+			    for(;(n + *(format - 1)) < *(format + 1); n++)
+				RtlSetBits(&bitMask, n + *(format - 1), 1);
+			    format++;
+			}
+			RtlSetBits(&bitMask, *format, 1);
+			format++;
+		    }
+                    /* read until char is not suitable */
+                    while ((width != 0) && (nch != _EOF_)) {
+			if(!invert) {
+			    if(RtlAreBitsSet(&bitMask, nch, 1)) {
+#ifdef WIDE_SCANF
+				if (!suppress) *sptr++ = _CONVERT_(nch);
+#else /* WIDE_SCANF */
+				if (!suppress) *sptr++ = nch;
+#endif /* WIDE_SCANF */
+			    } else
+				break;
+			} else {
+			    if(RtlAreBitsClear(&bitMask, nch, 1)) {
+#ifdef WIDE_SCANF
+				if (!suppress) *sptr++ = _CONVERT_(nch);
+#else /* WIDE_SCANF */
+				if (!suppress) *sptr++ = nch;
+#endif /* WIDE_SCANF */
+			    } else
+				break;
+			}
+                        st++;
+                        nch = _GETC_(file);
+                        if (width>0) width--;
+                    }
+                    /* terminate */
+                    if (!suppress) *sptr = 0;
+		    HeapFree(GetProcessHeap(), 0, Mask);
+                }
+                break;
             default: FIXME("unhandled: %%%c\n", *format);
 		/* From spec: "if a percent sign is followed by a character
 		 * that has no meaning as a format-control character, that



More information about the wine-devel mailing list