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