mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 00:54:40 +00:00
Import of DJ Dalories hcalc window calculator
svn path=/trunk/; revision=3225
This commit is contained in:
parent
1713f73a79
commit
c979d633b1
11 changed files with 967 additions and 0 deletions
BIN
rosapps/hcalc/bitmap1.bmp
Normal file
BIN
rosapps/hcalc/bitmap1.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 146 B |
BIN
rosapps/hcalc/chars.bmp
Normal file
BIN
rosapps/hcalc/chars.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 202 B |
BIN
rosapps/hcalc/face.bmp
Normal file
BIN
rosapps/hcalc/face.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.3 KiB |
BIN
rosapps/hcalc/hcalc.aps
Normal file
BIN
rosapps/hcalc/hcalc.aps
Normal file
Binary file not shown.
282
rosapps/hcalc/hcalc.c
Normal file
282
rosapps/hcalc/hcalc.c
Normal file
|
@ -0,0 +1,282 @@
|
|||
/* Copyright 1998 DJ Delorie <dj@delorie.com>
|
||||
Distributed under the terms of the GNU GPL
|
||||
http://www.delorie.com/store/hcalc/
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define STRICT
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
#include "hcalc.h"
|
||||
|
||||
#define WIDTH 125
|
||||
#define HEIGHT 147
|
||||
|
||||
/*
|
||||
** local vars
|
||||
*/
|
||||
static char szAppName[16];
|
||||
static char szTitle[80];
|
||||
static HINSTANCE hInst;
|
||||
static HBITMAP face, chars, bits;
|
||||
|
||||
static int r=0, g=0, b=0;
|
||||
static HWND window;
|
||||
|
||||
static char shown_offsets[15];
|
||||
static int shown_bitmask;
|
||||
static int show_bits;
|
||||
|
||||
#define CHARS_LEFT 6
|
||||
#define CHARS_TOP 6
|
||||
|
||||
#define BITS_RIGHT 92
|
||||
#define BITS_TOP 6
|
||||
|
||||
char charmap[] = " 0123456789ABCDEF-x,.ro+";
|
||||
int char_to_x[256];
|
||||
|
||||
void
|
||||
paint_bits(HDC dc, HDC bdc)
|
||||
{
|
||||
int i;
|
||||
SelectObject(bdc, bits);
|
||||
for (i=0; i<32; i++)
|
||||
{
|
||||
int b = (shown_bitmask >> i) & 1;
|
||||
BitBlt(dc, BITS_RIGHT-2*i-3*(i/4), BITS_TOP, 1, 7,
|
||||
bdc, b, 0, SRCCOPY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
paint_chars(HDC dc, HDC bdc)
|
||||
{
|
||||
int i;
|
||||
SelectObject(bdc, chars);
|
||||
for (i=0; i<15; i++)
|
||||
{
|
||||
BitBlt(dc, CHARS_LEFT+6*i, CHARS_TOP, 5, 7,
|
||||
bdc, shown_offsets[i], 0, SRCCOPY);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
paint()
|
||||
{
|
||||
PAINTSTRUCT paintstruct;
|
||||
HDC dc = BeginPaint(window, &paintstruct);
|
||||
HDC bdc = CreateCompatibleDC(dc);
|
||||
SelectObject(bdc, face);
|
||||
BitBlt(dc, 0, 0, WIDTH, HEIGHT, bdc, 0, 0, SRCCOPY);
|
||||
|
||||
if (show_bits)
|
||||
paint_bits(dc, bdc);
|
||||
else
|
||||
paint_chars(dc, bdc);
|
||||
|
||||
DeleteDC(bdc);
|
||||
EndPaint(window, &paintstruct);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
redraw()
|
||||
{
|
||||
RECT r;
|
||||
r.left = 0;
|
||||
r.right = WIDTH-1;
|
||||
r.top = 0;
|
||||
r.bottom = HEIGHT-1;
|
||||
InvalidateRect(window, &r, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
set_bits(int b)
|
||||
{
|
||||
shown_bitmask = b;
|
||||
show_bits = 1;
|
||||
redraw();
|
||||
}
|
||||
|
||||
void
|
||||
set_string(char *s)
|
||||
{
|
||||
char tmp[16];
|
||||
int i;
|
||||
sprintf(tmp, "%15.15s", s);
|
||||
for (i=0; i<15; i++)
|
||||
shown_offsets[i] = char_to_x[tmp[i]];
|
||||
show_bits = 0;
|
||||
redraw();
|
||||
}
|
||||
|
||||
static int count=0;
|
||||
static char tmp[100];
|
||||
static char ctmp[20] = " ";
|
||||
|
||||
void
|
||||
do_exit(int ec)
|
||||
{
|
||||
PostQuitMessage(ec);
|
||||
}
|
||||
|
||||
/*
|
||||
** Main Windows Proc
|
||||
*/
|
||||
LRESULT CALLBACK
|
||||
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int i;
|
||||
int lw = LOWORD(wParam);
|
||||
int hw = HIWORD(wParam);
|
||||
HWND w = (HWND)lParam;
|
||||
|
||||
window = hWnd;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
|
||||
case WM_PAINT:
|
||||
return paint();
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
#if 0
|
||||
count++;
|
||||
wsprintf(tmp, "%3d %3d", LOWORD(lParam), HIWORD(lParam));
|
||||
set_string(tmp);
|
||||
#else
|
||||
button(1, LOWORD(lParam), HIWORD(lParam));
|
||||
#endif
|
||||
break;
|
||||
|
||||
case WM_RBUTTONDOWN:
|
||||
#if 0
|
||||
count++;
|
||||
set_bits(count);
|
||||
#else
|
||||
button(2, LOWORD(lParam), HIWORD(lParam));
|
||||
#endif
|
||||
break;
|
||||
|
||||
case WM_CHAR:
|
||||
#if 0
|
||||
for (i=0; i<20; i++)
|
||||
ctmp[i] = ctmp[i+1];
|
||||
ctmp[14] = wParam;
|
||||
ctmp[15] = 0;
|
||||
set_string(ctmp);
|
||||
#else
|
||||
key(wParam);
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
} /* switch message */
|
||||
|
||||
return DefWindowProc (hWnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
/*
|
||||
** register class
|
||||
*/
|
||||
static BOOL
|
||||
InitApplication(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
int i, style;
|
||||
WNDCLASS wc;
|
||||
HWND hWnd;
|
||||
RECT size;
|
||||
|
||||
LoadString(hInstance, IDS_APPNAME, szAppName, sizeof(szAppName));
|
||||
LoadString(hInstance, IDS_DESCRIPTION, szTitle, sizeof(szTitle));
|
||||
|
||||
hInst = hInstance;
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szAppName;
|
||||
|
||||
if (RegisterClass(&wc) == 0)
|
||||
return FALSE;
|
||||
|
||||
style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX;
|
||||
|
||||
size.left = 0;
|
||||
size.top = 0;
|
||||
size.right = WIDTH-3;
|
||||
size.bottom = HEIGHT-3;
|
||||
AdjustWindowRect(&size, style, 0);
|
||||
|
||||
hWnd = CreateWindowEx(WS_EX_TOPMOST,
|
||||
szAppName,
|
||||
szTitle,
|
||||
style,
|
||||
CW_USEDEFAULT, 0,
|
||||
size.right-size.left, size.bottom-size.top,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (hWnd == NULL)
|
||||
return FALSE;
|
||||
|
||||
face = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_FACE));
|
||||
chars = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_CHARS));
|
||||
bits = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITS));
|
||||
|
||||
for (i=0; i<256; i++)
|
||||
char_to_x[i] = 0;
|
||||
for (i=0; charmap[i]; i++)
|
||||
char_to_x[charmap[i]] = i*6;
|
||||
|
||||
window = hWnd;
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
UpdateWindow(hWnd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
** Main entry
|
||||
*/
|
||||
int WINAPI
|
||||
WinMain(HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpszCmdLine,
|
||||
int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
HANDLE hAccelTable;
|
||||
|
||||
if (!InitApplication(hInstance, nCmdShow))
|
||||
return FALSE;
|
||||
|
||||
hAccelTable = LoadAccelerators(hInstance, szAppName);
|
||||
|
||||
while( GetMessage(&msg, NULL, 0, 0))
|
||||
if (!TranslateAccelerator (msg.hwnd, hAccelTable, &msg))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
return msg.wParam;
|
||||
}
|
5
rosapps/hcalc/hcalc.h
Normal file
5
rosapps/hcalc/hcalc.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
/* Copyright 1998 DJ Delorie <dj@delorie.com>
|
||||
Distributed under the terms of the GNU GPL
|
||||
http://www.delorie.com/store/hcalc/
|
||||
*/
|
||||
#include "resource.h"
|
135
rosapps/hcalc/hcalc.mak
Normal file
135
rosapps/hcalc/hcalc.mak
Normal file
|
@ -0,0 +1,135 @@
|
|||
# Microsoft Visual C++ Generated NMAKE File, Format Version 2.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=Win32 Release
|
||||
!MESSAGE No configuration specified. Defaulting to Win32 Release.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "Win32 Release"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE on this makefile
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "hcalc.mak" CFG="Win32 Release"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
################################################################################
|
||||
# Begin Project
|
||||
# PROP Target_Last_Scanned "Win32 Debug"
|
||||
OUTDIR=.\WinRel
|
||||
INTDIR=.\WinRel
|
||||
|
||||
ALL : $(OUTDIR)/hcalc.exe $(OUTDIR)/hcalc.bsc
|
||||
|
||||
$(OUTDIR) :
|
||||
if not exist $(OUTDIR)/nul mkdir $(OUTDIR)
|
||||
|
||||
MTL=MkTypLib.exe
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
BSC32=bscmake.exe
|
||||
BSC32_SBRS= \
|
||||
$(INTDIR)/hcalc.sbr \
|
||||
$(INTDIR)/input.sbr
|
||||
LINK32=link.exe
|
||||
DEF_FILE=
|
||||
LINK32_OBJS= \
|
||||
$(INTDIR)/hcalc.obj \
|
||||
$(INTDIR)/hcalc.res \
|
||||
$(INTDIR)/input.obj
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "WinRel"
|
||||
# PROP BASE Intermediate_Dir "WinRel"
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "WinRel"
|
||||
# PROP Intermediate_Dir "WinRel"
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /win32
|
||||
# ADD BASE CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c
|
||||
# ADD CPP /nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
BSC32_FLAGS=/nologo /o$(OUTDIR)/"hcalc.bsc"
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /NOLOGO /SUBSYSTEM:windows /MACHINE:I386
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
|
||||
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
|
||||
odbccp32.lib /NOLOGO /SUBSYSTEM:windows /INCREMENTAL:no\
|
||||
/PDB:$(OUTDIR)/"hcalc.pdb" /MACHINE:I386 /OUT:$(OUTDIR)/"hcalc.exe"
|
||||
MTL_PROJ=/nologo /D "NDEBUG" /win32
|
||||
CPP_PROJ=/nologo /W3 /GX /YX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\
|
||||
/FR$(INTDIR)/ /Fp$(OUTDIR)/"hcalc.pch" /Fo$(INTDIR)/ /c
|
||||
CPP_OBJS=.\WinRel/
|
||||
|
||||
.c{$(CPP_OBJS)}.obj:
|
||||
$(CPP) $(CPP_PROJ) $<
|
||||
|
||||
.cpp{$(CPP_OBJS)}.obj:
|
||||
$(CPP) $(CPP_PROJ) $<
|
||||
|
||||
.cxx{$(CPP_OBJS)}.obj:
|
||||
$(CPP) $(CPP_PROJ) $<
|
||||
|
||||
RSC_PROJ=/l 0x409 /fo$(INTDIR)/"hcalc.res" /d "NDEBUG"
|
||||
|
||||
$(OUTDIR)/hcalc.bsc : $(OUTDIR) $(BSC32_SBRS)
|
||||
$(BSC32) @<<
|
||||
$(BSC32_FLAGS) $(BSC32_SBRS)
|
||||
<<
|
||||
|
||||
$(OUTDIR)/hcalc.exe : $(OUTDIR) $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
################################################################################
|
||||
# Begin Group "Source Files"
|
||||
|
||||
################################################################################
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\hcalc.c
|
||||
DEP_HCALC=\
|
||||
.\HCALC.H
|
||||
|
||||
$(INTDIR)/hcalc.obj : $(SOURCE) $(DEP_HCALC) $(INTDIR)
|
||||
|
||||
# End Source File
|
||||
################################################################################
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\hcalc.rc
|
||||
DEP_HCALC_=\
|
||||
.\chars.bmp\
|
||||
.\face.bmp
|
||||
|
||||
$(INTDIR)/hcalc.res : $(SOURCE) $(DEP_HCALC_) $(INTDIR)
|
||||
$(RSC) $(RSC_PROJ) $(SOURCE)
|
||||
|
||||
# End Source File
|
||||
################################################################################
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\input.c
|
||||
DEP_INPUT=\
|
||||
.\HCALC.H
|
||||
|
||||
$(INTDIR)/input.obj : $(SOURCE) $(DEP_INPUT) $(INTDIR)
|
||||
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Project
|
||||
################################################################################
|
73
rosapps/hcalc/hcalc.rc
Normal file
73
rosapps/hcalc/hcalc.rc
Normal file
|
@ -0,0 +1,73 @@
|
|||
//Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Bitmap
|
||||
//
|
||||
|
||||
IDB_CHARS BITMAP DISCARDABLE "chars.bmp"
|
||||
IDB_FACE BITMAP DISCARDABLE "face.bmp"
|
||||
IDB_BITS BITMAP DISCARDABLE "bitmap1.bmp"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// String Table
|
||||
//
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_APPNAME "hcalc"
|
||||
IDS_DESCRIPTION "hcalc"
|
||||
END
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
BIN
rosapps/hcalc/hcalc.vcp
Normal file
BIN
rosapps/hcalc/hcalc.vcp
Normal file
Binary file not shown.
452
rosapps/hcalc/input.c
Normal file
452
rosapps/hcalc/input.c
Normal file
|
@ -0,0 +1,452 @@
|
|||
/* Copyright 1998 DJ Delorie <dj@delorie.com>
|
||||
Distributed under the terms of the GNU GPL
|
||||
http://www.delorie.com/store/hcalc/
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
extern void set_bits(int);
|
||||
extern void set_string(char *);
|
||||
extern void do_exit(int);
|
||||
|
||||
#ifdef GNUC
|
||||
#define longlong long long
|
||||
#else
|
||||
#define longlong __int64
|
||||
#define XBell(d,v) 1
|
||||
#endif
|
||||
|
||||
char pending_op = 0;
|
||||
int making_number = 0;
|
||||
int base = 10;
|
||||
|
||||
#define MAXIN 40
|
||||
|
||||
char input_buf[MAXIN];
|
||||
int iptr;
|
||||
double value, saved, stored=0;
|
||||
|
||||
void
|
||||
convert_number()
|
||||
{
|
||||
char *ip = input_buf;
|
||||
double scale = 1;
|
||||
int sign = +1;
|
||||
|
||||
if (*ip == '-')
|
||||
sign = -1;
|
||||
value = 0;
|
||||
while (*++ip)
|
||||
{
|
||||
if (*ip == '.')
|
||||
break;
|
||||
if (*ip >= '0' && *ip <= '9')
|
||||
{
|
||||
value *= base;
|
||||
value += *ip-'0';
|
||||
}
|
||||
if (*ip >= 'a' && *ip <= 'f')
|
||||
{
|
||||
value *= base;
|
||||
value += *ip-'a'+10;
|
||||
}
|
||||
}
|
||||
if (*ip)
|
||||
while (*++ip)
|
||||
{
|
||||
if (*ip >= '0' && *ip <= '9')
|
||||
{
|
||||
scale *= base;
|
||||
value += (*ip-'0')/scale;
|
||||
}
|
||||
if (*ip >= 'a' && *ip <= 'f')
|
||||
{
|
||||
scale *= base;
|
||||
value += (*ip-'a'+10)/scale;
|
||||
}
|
||||
}
|
||||
value *= sign;
|
||||
}
|
||||
|
||||
void
|
||||
show_value()
|
||||
{
|
||||
char tmp[20], *tp;
|
||||
char commas[40], *cp, *dp;
|
||||
double v = value;
|
||||
|
||||
if (base == 2)
|
||||
{
|
||||
int q = (unsigned int)((longlong)v & 0xffffffffL);
|
||||
set_bits(q);
|
||||
return;
|
||||
}
|
||||
|
||||
tmp[0] = ' ';
|
||||
if (v < 0)
|
||||
{
|
||||
tmp[0] = '-';
|
||||
v = -v;
|
||||
}
|
||||
|
||||
if (base == 10)
|
||||
{
|
||||
sprintf(tmp+1, "%.14G", v);
|
||||
if (strchr(tmp+1, 'E'))
|
||||
sprintf(tmp+1, "%.9G", v);
|
||||
if (tmp[14] == '.')
|
||||
tmp[14] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
static char tohex[] = "0123456789ABCDEF";
|
||||
longlong ll = (longlong)v;
|
||||
char *revptr;
|
||||
tp = tmp+1;
|
||||
if (base == 16)
|
||||
{
|
||||
*tp++ = '0';
|
||||
*tp++ = 'x';
|
||||
}
|
||||
else if (base == 8)
|
||||
*tp++ = '0';
|
||||
|
||||
revptr = tp;
|
||||
do {
|
||||
*tp++ = tohex[ll%base];
|
||||
ll /= base;
|
||||
} while (ll);
|
||||
*tp-- = 0;
|
||||
while (revptr < tp) {
|
||||
char t = *revptr;
|
||||
*revptr = *tp;
|
||||
*tp = t;
|
||||
tp--;
|
||||
revptr++;
|
||||
}
|
||||
}
|
||||
|
||||
cp = commas+40;
|
||||
tp = tmp+strlen(tmp);
|
||||
dp = strchr(tmp, '.');
|
||||
if (dp == 0)
|
||||
dp = tp;
|
||||
|
||||
*--cp = 0;
|
||||
while (tp>=tmp)
|
||||
{
|
||||
*--cp = *tp--;
|
||||
switch (base)
|
||||
{
|
||||
case 10:
|
||||
if (isdigit(cp[0]) && isdigit(cp[1]) && isdigit(cp[2]) && tp<dp
|
||||
&& tp>=tmp && isdigit(*tp))
|
||||
*--cp = ',';
|
||||
break;
|
||||
case 16:
|
||||
if (isxdigit(cp[0]) && isxdigit(cp[1])
|
||||
&& isxdigit(cp[2]) && isxdigit(cp[3])
|
||||
&& tp>=tmp && isxdigit(*tp))
|
||||
*--cp = ',';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (strlen(cp) > 15)
|
||||
set_string(tmp);
|
||||
else
|
||||
set_string(cp);
|
||||
}
|
||||
|
||||
void
|
||||
end_number()
|
||||
{
|
||||
if (!making_number)
|
||||
return;
|
||||
making_number = 0;
|
||||
iptr = 0;
|
||||
|
||||
switch (pending_op)
|
||||
{
|
||||
case '+':
|
||||
value = saved + value;
|
||||
break;
|
||||
case '-':
|
||||
value = saved - value;
|
||||
break;
|
||||
case '*':
|
||||
value = saved * value;
|
||||
break;
|
||||
case '/':
|
||||
value = saved / value;
|
||||
break;
|
||||
case '&':
|
||||
value = (double)((longlong)saved & (longlong)value);
|
||||
break;
|
||||
case '|':
|
||||
value = (double)((longlong)saved | (longlong)value);
|
||||
break;
|
||||
case '^':
|
||||
value = (double)((longlong)saved ^ (longlong)value);
|
||||
break;
|
||||
case 'S':
|
||||
if (value < 0)
|
||||
value = (double)((longlong)saved >> (longlong)(-value));
|
||||
else
|
||||
value = (double)((longlong)saved << (longlong)value);
|
||||
break;
|
||||
}
|
||||
saved = value;
|
||||
pending_op = 0;
|
||||
show_value();
|
||||
}
|
||||
|
||||
void
|
||||
start_number()
|
||||
{
|
||||
if (making_number)
|
||||
return;
|
||||
|
||||
iptr = 1;
|
||||
input_buf[0] = ' ';
|
||||
input_buf[1] = 0;
|
||||
making_number = 1;
|
||||
}
|
||||
|
||||
void
|
||||
key(char c)
|
||||
{
|
||||
int v = c;
|
||||
/* printf("key %c\n", c); */
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 27:
|
||||
making_number = 0;
|
||||
iptr = 0;
|
||||
pending_op = 0;
|
||||
value = saved = 0;
|
||||
set_string("");
|
||||
break;
|
||||
case 'u':
|
||||
if (making_number)
|
||||
{
|
||||
making_number = 0;
|
||||
set_string("");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
case 'b':
|
||||
case 'c':
|
||||
case 'd':
|
||||
case 'e':
|
||||
case 'f':
|
||||
v = c - 'a' - '9' - 1;
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
v -= '0';
|
||||
if (v >= base || iptr == MAXIN-1)
|
||||
XBell(display, 0);
|
||||
else
|
||||
{
|
||||
start_number();
|
||||
input_buf[iptr++] = c;
|
||||
input_buf[iptr] = 0;
|
||||
convert_number();
|
||||
show_value();
|
||||
}
|
||||
break;
|
||||
case '.':
|
||||
if (strchr(input_buf, '.'))
|
||||
{
|
||||
XBell(display, 0);
|
||||
break;
|
||||
}
|
||||
case ',':
|
||||
if (iptr == 1 || iptr == MAXIN-1)
|
||||
XBell(display, 0);
|
||||
else
|
||||
{
|
||||
start_number();
|
||||
input_buf[iptr++] = c;
|
||||
input_buf[iptr] = 0;
|
||||
convert_number();
|
||||
show_value();
|
||||
}
|
||||
break;
|
||||
|
||||
case 8:
|
||||
if (iptr == 1)
|
||||
XBell(display, 0);
|
||||
else
|
||||
{
|
||||
input_buf[--iptr] = 0;
|
||||
convert_number();
|
||||
show_value();
|
||||
}
|
||||
break;
|
||||
|
||||
case '_': /* +/- */
|
||||
if (making_number)
|
||||
{
|
||||
if (input_buf[0] == '-')
|
||||
input_buf[0] = ' ';
|
||||
else
|
||||
input_buf[0] = '-';
|
||||
convert_number();
|
||||
show_value();
|
||||
}
|
||||
else
|
||||
{
|
||||
value *= -1.0;
|
||||
saved *= -1.0;
|
||||
show_value();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
end_number();
|
||||
base = 10;
|
||||
show_value();
|
||||
break;
|
||||
case 'H':
|
||||
end_number();
|
||||
base = 16;
|
||||
show_value();
|
||||
break;
|
||||
case 'O':
|
||||
end_number();
|
||||
base = 8;
|
||||
show_value();
|
||||
break;
|
||||
case 'B':
|
||||
end_number();
|
||||
base = 2;
|
||||
show_value();
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
c = '*';
|
||||
case '+':
|
||||
case '-':
|
||||
case '*':
|
||||
case '/':
|
||||
case '^':
|
||||
case '&':
|
||||
case '|':
|
||||
case 'S':
|
||||
case '=':
|
||||
end_number();
|
||||
pending_op = c;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
case 10:
|
||||
end_number();
|
||||
break;
|
||||
|
||||
case '~':
|
||||
end_number();
|
||||
value = (double)(~(longlong)value);
|
||||
show_value();
|
||||
break;
|
||||
|
||||
case '<':
|
||||
end_number();
|
||||
value = (double)((longlong)value << 1);
|
||||
show_value();
|
||||
break;
|
||||
|
||||
case '>':
|
||||
end_number();
|
||||
value = (double)((longlong)value >> 1);
|
||||
show_value();
|
||||
break;
|
||||
|
||||
case '[': /* STO */
|
||||
stored = value;
|
||||
break;
|
||||
case ']': /* RCL */
|
||||
value = stored;
|
||||
show_value();
|
||||
making_number = 1;
|
||||
iptr = 1;
|
||||
input_buf[0] = ' ';
|
||||
break;
|
||||
case '}': /* SUM */
|
||||
stored += value;
|
||||
break;
|
||||
|
||||
case 'P': /* click on the display itself */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static char *bmap[] = {
|
||||
"PPPP\033",
|
||||
"DHOB\010",
|
||||
"[]}<>",
|
||||
"Sdef/",
|
||||
"~abc*",
|
||||
"|789-",
|
||||
"&456+",
|
||||
"^123=",
|
||||
"u0._="
|
||||
};
|
||||
|
||||
#if 0
|
||||
void
|
||||
copy()
|
||||
{
|
||||
XSetSelectionOwner(display, XA_PRIMARY, window, event.xbutton.time);
|
||||
}
|
||||
|
||||
void
|
||||
paste()
|
||||
{
|
||||
XConvertSelection(display, XA_PRIMARY, XA_STRING, paste_atom, window,
|
||||
event.xbutton.time);
|
||||
}
|
||||
|
||||
void
|
||||
complete_paste(char *s, int n)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<n; i++)
|
||||
key(s[i]);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
button(int b, int x, int y)
|
||||
{
|
||||
x = (x-2)/24;
|
||||
if (x < 0) x = 0;
|
||||
if (x > 4) x = 4;
|
||||
y = (y-1)/16;
|
||||
if (y < 0) y = 0;
|
||||
if (y > 8) y = 8;
|
||||
|
||||
if (bmap[y][x] == 27 && b == 3)
|
||||
do_exit(0);
|
||||
|
||||
#if 0
|
||||
if (bmap[y][x] == 'P' && b == 1)
|
||||
copy();
|
||||
if (bmap[y][x] == 'P' && b != 1)
|
||||
paste();
|
||||
#endif
|
||||
|
||||
key(bmap[y][x]);
|
||||
}
|
20
rosapps/hcalc/resource.h
Normal file
20
rosapps/hcalc/resource.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by hcalc.rc
|
||||
//
|
||||
#define IDS_APPNAME 1
|
||||
#define IDS_DESCRIPTION 2
|
||||
#define IDB_CHARS 102
|
||||
#define IDB_FACE 103
|
||||
#define IDB_BITS 105
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 106
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
Loading…
Reference in a new issue