#include <stdio.h> // sprintf
#include <math.h>
+#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
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]) {
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) {
// 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;
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);
}
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;