ntdll: RtlUnicodeStringToInteger
Robert Shearman
R.J.Shearman at warwick.ac.uk
Sun Nov 10 08:39:08 CST 2002
Hi,
I sent this patch before and it wasn't applied. If there was something wrong
with it, please let me know for future reference, otherwise here it is
again.
Changelog
- implemented RtlUnicodeStringToInteger
-------------- next part --------------
? wine/dlls/ntdll/tests/rtlstr.c
Index: wine/dlls/ntdll/ntdll.spec
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/ntdll.spec,v
retrieving revision 1.79
diff -u -r1.79 ntdll.spec
--- wine/dlls/ntdll/ntdll.spec 10 Oct 2002 17:55:48 -0000 1.79
+++ wine/dlls/ntdll/ntdll.spec 5 Nov 2002 21:49:11 -0000
@@ -528,7 +528,7 @@
@ stdcall RtlUnicodeStringToAnsiSize(ptr) RtlUnicodeStringToAnsiSize
@ stdcall RtlUnicodeStringToAnsiString(ptr ptr long) RtlUnicodeStringToAnsiString
@ stub RtlUnicodeStringToCountedOemString
-@ stub RtlUnicodeStringToInteger
+@ stdcall RtlUnicodeStringToInteger(ptr long ptr) RtlUnicodeStringToInteger
@ stdcall RtlUnicodeStringToOemSize(ptr) RtlUnicodeStringToOemSize
@ stdcall RtlUnicodeStringToOemString(ptr ptr long) RtlUnicodeStringToOemString
@ stub RtlUnicodeToCustomCPN
Index: wine/dlls/ntdll/rtlstr.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/rtlstr.c,v
retrieving revision 1.24
diff -u -r1.24 rtlstr.c
--- wine/dlls/ntdll/rtlstr.c 12 Sep 2002 22:07:03 -0000 1.24
+++ wine/dlls/ntdll/rtlstr.c 5 Nov 2002 21:49:12 -0000
@@ -835,3 +835,74 @@
*pf = out_flags;
return len;
}
+
+/**************************************************************************
+ * RtlUnicodeStringToInteger (NTDLL.@)
+ *
+ * Convert a text buffer into its integer form
+ */
+NTSTATUS WINAPI RtlUnicodeStringToInteger(
+ const UNICODE_STRING *str,
+ int base,
+ int * pdest)
+{
+ LPWSTR lpwstr = str->Buffer;
+ WCHAR wchCurrent = 0;
+ int CharsParsed = 0;
+ int RunningTotal = 0;
+ char bMinus = 0;
+
+ // no checking done on UNICODE_STRING and int* in native DLL either
+ TRACE("(%p, %d, %p)", str, base, pdest);
+
+ switch (base)
+ {
+ case 0:
+ base = 10;
+ break;
+ case 2:
+ case 8:
+ case 10:
+ case 16:
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ if ((str->Length) >= 4 && (base == 10) && (*lpwstr == '0') && (*(lpwstr+1) == 'x'))
+ {
+ lpwstr+=2;
+ base = 16;
+ }
+
+ *pdest = 0;
+ for (; (CharsParsed*2 < str->Length) && (*lpwstr <= ' '); lpwstr++)
+ CharsParsed++;
+
+ if (*lpwstr == '+')
+ lpwstr++;
+ else if (*lpwstr == '-')
+ {
+ bMinus = 1;
+ lpwstr++;
+ }
+
+ for (; (CharsParsed*2 < str->Length) && (*lpwstr != '\0'); lpwstr++)
+ {
+ CharsParsed++;
+ wchCurrent = *lpwstr;
+ if (wchCurrent >= 'A')
+ wchCurrent = '0' + 10 + wchCurrent - 'A';
+ if ((wchCurrent - '0') >= base || wchCurrent < '0')
+ {
+ *pdest = bMinus ? -RunningTotal: RunningTotal;
+ return STATUS_SUCCESS;
+ }
+ // increase significance of previous digits each time
+ // we find another valid one and add on this valid one
+ RunningTotal = wchCurrent - '0' + RunningTotal * base;
+ }
+
+ *pdest = bMinus ? -RunningTotal : RunningTotal;
+ return STATUS_SUCCESS;
+}
More information about the wine-patches
mailing list