Implement RtlUnicodeStringToInteger (NTDLL)
Robert Shearman
R.J.Shearman at warwick.ac.uk
Tue Nov 5 02:35:27 CST 2002
Hi,
This patch implements RtlUnicodeStringToInteger which is used by several unicode system libraries (eg SDBAPIU.DLL).
Changelog:
- Implement RtlUnicodeStringToInteger
-------------- next part --------------
? wine/dlls/msvcrt/tests
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 4 Nov 2002 18:32:14 -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 4 Nov 2002 18:32:16 -0000
@@ -835,3 +835,65 @@
*pf = out_flags;
return len;
}
+
+/**************************************************************************
+ * RtlUnicodeStringToInteger (NTDLL.@)
+ *
+ * Convert a text buffer into its integer form
+ * FIXME: handle hexadecimal notation as well
+ */
+NTSTATUS WINAPI RtlUnicodeStringToInteger(
+ const UNICODE_STRING *str,
+ int terminator, /* FIXME: guess. don't know what this actually is: this doesn't seem to do much in Windows*/
+ int * pdest)
+{
+ LPWSTR lpwstr = str->Buffer;
+ 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, terminator, pdest);
+
+ switch (terminator)
+ {
+ case 0:
+ case 2:
+ case 8:
+ case 10:
+ case 16:
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ *pdest = 0;
+ for (; (CharsParsed < str->Length) && (*lpwstr <= ' '); lpwstr++)
+ CharsParsed++;
+
+ if (*lpwstr == '+')
+ lpwstr++;
+ else if (*lpwstr == '-')
+ bMinus = 1;
+
+ for (; (CharsParsed < str->Length) && (*lpwstr != '\0'); lpwstr++)
+ {
+ CharsParsed++;
+ if (*lpwstr > '9' || *lpwstr < '0')
+ {
+ if (*lpwstr <= ' ')
+ {
+ // if <= ' ' then it is a control char and so we stop parsing
+ *pdest = bMinus ? 0x80000000 : 0 | RunningTotal;
+ // otherwise it is an error and we return the caller a 0 as their integer
+ }
+ return STATUS_SUCCESS;
+ }
+ // increase significance of previous digits each time
+ // we find another valid one and add on this valid one
+ RunningTotal = *lpwstr - '0' + RunningTotal * 10;
+ }
+
+ *pdest = bMinus ? 0x80000000 : 0 | RunningTotal;
+ return STATUS_SUCCESS;
+}
More information about the wine-patches
mailing list