[ros-diffs] [dchapyshev] 39622: - Reimplement RtlLargeIntegerToChar (based on Wine code with my changes). It fixes all large_int Wine tests

dchapyshev at svn.reactos.org dchapyshev at svn.reactos.org
Mon Feb 16 13:07:27 CET 2009


Author: dchapyshev
Date: Mon Feb 16 06:07:27 2009
New Revision: 39622

URL: http://svn.reactos.org/svn/reactos?rev=39622&view=rev
Log:
- Reimplement RtlLargeIntegerToChar (based on Wine code with my changes). It fixes all large_int Wine tests

Modified:
    trunk/reactos/lib/rtl/unicode.c

Modified: trunk/reactos/lib/rtl/unicode.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/unicode.c?rev=39622&r1=39621&r2=39622&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/unicode.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/unicode.c [iso-8859-1] Mon Feb 16 06:07:27 2009
@@ -1559,56 +1559,56 @@
    IN ULONG  Length,
    IN OUT PCHAR  String)
 {
-   NTSTATUS Status = STATUS_SUCCESS;
-   ULONG Radix;
-   CHAR  temp[65];
-   ULONGLONG v = Value->QuadPart;
-   ULONG i;
-   PCHAR tp;
-   PCHAR sp;
-
-   Radix = Base;
-   if (Radix == 0)
-      Radix = 10;
-
-   if ((Radix != 2) && (Radix != 8) &&
-         (Radix != 10) && (Radix != 16))
-      return STATUS_INVALID_PARAMETER;
-
-   tp = temp;
-   while (v || tp == temp)
-   {
-      i = v % Radix;
-      v = v / Radix;
-      if (i < 10)
-         *tp = i + '0';
-      else
-         *tp = i + 'A' - 10;
-      tp++;
-   }
-
-   if ((ULONG)((ULONG_PTR)tp - (ULONG_PTR)temp) > Length)
-      return STATUS_BUFFER_OVERFLOW;
-
-   //_SEH2_TRY
-   {
-      sp = String;
-      while (tp > temp)
-         *sp++ = *--tp;
-
-      if((ULONG)((ULONG_PTR)sp - (ULONG_PTR)String) < Length)
-         *sp = 0;
-   }
-#if 0
-   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-   {
-      /* Get the error code */
-      Status = _SEH2_GetExceptionCode();
-   }
-   _SEH2_END;
-#endif
-
-   return Status;
+    ULONGLONG Val = Value->QuadPart;
+    NTSTATUS Status = STATUS_SUCCESS;
+    CHAR Buffer[65];
+    CHAR Digit;
+    ULONG Len;
+    PCHAR Pos;
+
+    if (Base == 0) Base = 10;
+
+    if ((Base != 2) && (Base != 8) &&
+        (Base != 10) && (Base != 16))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    Pos = &Buffer[64];
+    *Pos = '\0';
+
+    do
+    {
+        Pos--;
+        Digit = Val % Base;
+        Val = Val / Base;
+        if (Digit < 10)
+            *Pos = '0' + Digit;
+        else
+            *Pos = 'A' + Digit - 10;
+    }
+    while (Val != 0L);
+
+    Len = &Buffer[64] - Pos;
+
+    if (Len > Length)
+        return STATUS_BUFFER_OVERFLOW;
+
+    _SEH2_TRY
+    {
+        if (Len == Length)
+            RtlCopyMemory(String, Pos, Len);
+        else
+            RtlCopyMemory(String, Pos, Len + 1);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        /* Get the error code */
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    return Status;
 }
 
 /*



More information about the Ros-diffs mailing list