Import of DJ Dalories hcalc window calculator

svn path=/trunk/; revision=3225
This commit is contained in:
Steven Edwards 2002-07-15 04:55:44 +00:00
parent 1713f73a79
commit c979d633b1
11 changed files with 967 additions and 0 deletions

BIN
rosapps/hcalc/bitmap1.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

BIN
rosapps/hcalc/chars.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

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

Binary file not shown.

282
rosapps/hcalc/hcalc.c Normal file
View 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
View 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
View 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
View 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

Binary file not shown.

452
rosapps/hcalc/input.c Normal file
View 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
View 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