fix follow bug hex->dec, bin->dec, oct->dec, now all converting should work fine...
[reactos.git] / reactos / subsys / system / calc / winecalc.c
index 6674f1c..add5cc9 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h> // sprintf
 #include <math.h>
+#include <stdlib.h>
 
 #include <windows.h>
 #include <tchar.h>
@@ -2938,26 +2939,73 @@ void calc_buffer_format(CALC *calc) {
 void calc_buffer_display(CALC *calc) {
     TCHAR *p;
     TCHAR s[CALC_BUF_SIZE];
-    TCHAR r[CALC_BUF_SIZE] = TEXT("0");
     int point=0;
     calcfloat real;
+    static int old_base = NBASE_DECIMAL;
 
+   
     switch (calc->numBase) {
-    case NBASE_HEX:
-        real = calc_atof(calc->buffer, calc->numBase);
-        _stprintf(calc->display, TEXT("%lx"), (long)real);
+    case NBASE_HEX:      
+        real = calc_atof(calc->buffer, old_base);
+        _stprintf(calc->display, _T("%lx"), (long)real);   
+        _stprintf(calc->buffer, _T("%lx"), (long)real);         
+        old_base = NBASE_HEX;        
         break;
 
-    case NBASE_OCTAL:
-        _stprintf(calc->display, TEXT("%lo"), (long)calc->buffer);
+    case NBASE_OCTAL:  
+         real = calc_atof(calc->buffer, old_base);
+        _stprintf(calc->display, TEXT("%lo"), (long)real);
+        _stprintf(calc->buffer, TEXT("%lo"), (long)real);
+        old_base = NBASE_OCTAL;
         break;
 
     case NBASE_BINARY:
-        _stprintf(calc->display, TEXT("%lx"), (long)calc->buffer);
+        {
+          int buf=0;          
+          int t;
+
+          if (calc->buffer[0]==_T('\0'))
+          {
+            real=0;
+          }
+          else
+          {
+            real = calc_atof(calc->buffer, old_base);
+          }
+          
+          calc->display[buf]=_T('0');
+          calc->buffer[buf]=_T('0');
+          for (t=31;t>=0;t--)
+          {                  
+            if (((((long)real)>>t) & ~0xFFFFFFFE)==0)
+            {
+                calc->display[buf]=_T('0');
+                calc->buffer[buf]=_T('0');
+                buf++;
+            }
+            else
+            {
+                calc->display[buf]=_T('1');
+                calc->buffer[buf]=_T('1');
+                buf++;
+            }
+            
+          }
+        
+          if (buf==0) 
+          {
+              buf++;
+          }
+         
+          calc->buffer[buf]=_T('\0');
+          calc->display[buf]=_T('\0');          
+          old_base = NBASE_BINARY;
+        }
         break;
 
     case NBASE_DECIMAL:
-        calc_buffer_format(calc);
+
+       calc_buffer_format(calc);
 
         if (calc->displayMode) {
             if (!_tcscmp(calc->buffer, TEXT("0")) || !calc->buffer[0]) {
@@ -2966,11 +3014,12 @@ void calc_buffer_display(CALC *calc) {
             else {
                 int i = 0;
                 int lz = 0;
-                calcfloat r;
                 int exp = 0;
 
-                r = calc_atof(calc->buffer, calc->numBase);
-                _stprintf(s, FMT_DESC_EXP, r);
+                       
+
+                real = calc_atof(calc->buffer,old_base);
+                _stprintf(s, FMT_DESC_EXP, real);
                 // remove leading zeros in exponent
                 p = s;
                 while (*p) {
@@ -3009,6 +3058,20 @@ void calc_buffer_display(CALC *calc) {
             // add point if missing
             // display
 
+            if (old_base != calc->numBase)
+            {
+            if (calc->buffer[0]==_T('\0'))
+            {
+                real = 0;
+            }
+            else
+            {
+                real = calc_atof(calc->buffer, old_base);
+            }           
+            _stprintf(calc->display, _T("%.f"), real);   
+            _stprintf(calc->buffer, _T("%.f"), real);               
+            }                              
+
             _tcscpy(s,calc->buffer);
             p = s;
 
@@ -3026,15 +3089,15 @@ void calc_buffer_display(CALC *calc) {
             if (!point && calc->numBase == NBASE_DECIMAL)
                 _tcscat(s, TEXT("."));
 
-            if (*s == TEXT('.')) {
-                _tcscat(r, s);
-                _tcscpy(calc->display, r);
-            }
-            else {
-                _tcscpy(calc->display, s);
-            }
+            if (*s == TEXT('.'))
+                _tcscpy(calc->display, TEXT("0"));
+            else
+                calc->display[0] = 0;
+            _tcscat(calc->display, s);
         }
+        old_base = NBASE_DECIMAL;
     }
+   
     InvalidateRect(calc->hWnd, NULL, FALSE);
     UpdateWindow(calc->hWnd);
 }
@@ -3415,12 +3478,11 @@ int parse(int wParam, int lParam)
                 else {
                     calc.memory = calc_atof(calc.buffer, calc.numBase);
                 }
+                return 0;
             }
-            return 0;
         }
-        break;
+        // fall through for Enter processing
 
-        // fall through for Enter processing ... but there is a bug here in Ctrl+M vs. Return
     case TEXT('='):
         {
             calcfloat r = calc.operand;