pkg://hcalc-1.0-1.src.rpm:8294/hcalc.tar.gz
info downloads
Makefile 100644 124 24 441 6453331606 10264 0 ustar dj user CC = gcc
CFLAGS = -g -O2 -MMD
OBJS = \
hcalc.o \
input.o \
setupx.o \
images.o \
draw.o \
$E
hcalc : $(OBJS)
gcc -o $@ $^ -lXpm -lX11
clean :
-rm -f *.o *.d *~ \#* hcalc core
tar :
tar cvfz distrib.tar.gz *.c *.h Makefile *.xpm
D=$(wildcard *.d)
ifneq ($D,)
include $D
endif
chars.xpm 100644 124 24 2177 6453310034 10472 0 ustar dj user /* XPM */
static char *xpm[] = {
"145 7 2 1",
" c #000000000000", /* 24 */
"- c #6666ffff6666", /* 113 */
" --- - --- --- - - ----- --- ----- --- --- - - -- ",
" - - -- - - - - - - - - - - - - - - - - - - ",
" - -- - - - - - ---- - - - - - - ---- ---- --- ---- --- - - - - -- --- - ",
" - - - - -- -- ----- - ---- - --- ---- - - - - - - - - - - --- ----- - - - - - - ----- ",
" -- - - - - - - - - - - - - - - - - - - - ----- - - - - - - - - ",
" - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- - - - - ",
" --- --- ----- --- - --- --- - --- --- ---- ---- --- ---- ---- - - - - - - --- "};
draw.c 100644 124 24 4756 6505257416 7766 0 ustar dj user /* Copyright 1998 DJ Delorie <dj@delorie.com>
Distributed under the terms of the GNU GPL
http://www.delorie.com/store/hcalc/
*/
#include "hcalc.h"
static char shown_offsets[15];
static int shown_bitmask;
static int show_bits;
#define CHARS_LEFT 6
#define CHARS_TOP 6
#define BITS_LEFT_X 92
#define BITS_TOP_1 6
#define BITS_BOT_1 10
#define BITS_TOP_0 10
#define BITS_BOT_0 12
void
redraw_chars()
{
int i;
for (i=0; i<15; i++)
{
XCopyArea(display, chars, window, gc,
shown_offsets[i], 0, 5, 7,
CHARS_LEFT+6*i, CHARS_TOP);
}
}
void
redraw()
{
XCopyArea(display, face, window, gc, 0, 0, WIDTH, HEIGHT, 0, 0);
if (show_bits)
{
int i, x;
XSetForeground(display, gc, bit_off);
for (i=0; i<32; i++)
{
x = BITS_LEFT_X - 2*i - 3*(i/4);
if (!(shown_bitmask & (1<<i)))
XDrawLine(display, window, gc, x, BITS_TOP_0, x, BITS_BOT_0);
}
XSetForeground(display, gc, bit_on);
for (i=0; i<32; i++)
{
x = BITS_LEFT_X - 2*i - 3*(i/4);
if (shown_bitmask & (1<<i))
XDrawLine(display, window, gc, x, BITS_TOP_1, x, BITS_BOT_1);
}
}
else
redraw_chars();
}
set_bits(int b)
{
shown_bitmask = b;
show_bits = 1;
redraw();
}
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]];
if (show_bits == 0)
redraw_chars();
else
{
show_bits = 0;
redraw();
}
}
void
send_current_display()
{
char tmp[40], *tp=tmp;
int i;
XEvent e;
if (show_bits)
{
for (i=31; i>0; i--)
if (shown_bitmask & (1<<i))
break;
for (; i>=0; i--)
{
if (shown_bitmask & (1<<i))
*tp++ = '1';
else
*tp++ = '0';
}
}
else
{
for (i=0; i<15; i++)
{
char c = charmap[shown_offsets[i]/6];
if (c != ' ' && c != ',')
*tp++ = c;
}
}
*tp = 0;
e.type = SelectionNotify;
e.xselection.display = display;
e.xselection.requestor = event.xselectionrequest.requestor;
e.xselection.selection = event.xselectionrequest.selection;
e.xselection.target = event.xselectionrequest.target;
e.xselection.property = event.xselectionrequest.property;
e.xselection.time = event.xselectionrequest.time;
if (event.xselectionrequest.target != XA_STRING)
{
e.xselection.property = None;
}
else
{
XChangeProperty(display, e.xselection.requestor, e.xselection.property,
XA_STRING, 8, PropModeReplace, tmp, strlen(tmp));
}
XSendEvent(display, e.xselection.requestor, False, 0, &e);
}
face.xpm 100644 124 24 45432 6453266564 10333 0 ustar dj user /* XPM */
static char *xpm[] = {
"125 147 7 1",
" c #000000000000", /* 24 */
"- c #ffff00000000", /* 54 */
"0 c #333333333333", /* 67 */
"1 c #cccc99996666", /* 123 */
"2 c #999999999999", /* 153 */
"3 c #00006666cccc", /* 170 */
"4 c #ffffffffffff", /* 239 */
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22224444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444442222222222222222222222222222",
"22244 44222-------------------22222",
"2224 422---------------------2222",
"2224 422---444--4-----4444---2222",
"2224 422--4---4-4-----4---4--2222",
"2224 422--4-----4-----4---4--2222",
"2224 422--4-----4-----4444---2222",
"2224 422--4-----4-----4--4---2222",
"2224 422--4---4-4-----4---4--2222",
"2224 422---444--44444-4---4--2222",
"2224 422---------------------2222",
"22244 44222-------------------22222",
"22224444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444442222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222",
"22230000000000000000000003330000000000000000000003330000000000000000000003330000000000000000000003220000000000000000000002222",
"22330044440044444004440003330040004044444040004003330004440004440044444003330044440004440040004003320044440044444040000002222",
"22330040004040000040004003330040004040000040004003330040004040004000400003330040004000400044004003320040004040000040000002222",
"22330040004040000040000003330040004040000004040003330040004040000000400003330040004000400040404003320040004040000040000002222",
"22330040004044440040000003330044444044440000400003330040004040000000400003330044440000400040044003320040004044440040000002222",
"22330040004040000040000003330040004040000004040003330040004040000000400003330040004000400040004003320040004040000040000002222",
"22330040004040000040004003330040004040000040004003330040004040004000400003330040004000400040004003320040004040000040000002222",
"22330044440044444004440003330040004044444040004003330004440004440000400003330044440004440040004003320044440044444044444002222",
"22230000000000000000000003330000000000000000000003330000000000000000000003330000000000000000000003220000000000000000000002222",
"22222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222",
"22220000000000000000000002220000000000000000000002220000000000000000000002220000000000000000000002220000000000000000000002222",
"22220004440044444004440002220044440004440040000002220004440040004040004002220000000004000040000002220000004000040000000002222",
"22220040004000400040004002220040004040004040000002220040004040004044044002220000000040000400000002220000000400004000000002222",
"22220040000000400040004002220040004040000040000002220040000040004040404002220000000400004000000002220000000040000400000002222",
"22220004440000400040004002220044440040000040000002220004440040004040404002220000004000040000000002220000000004000040000002222",
"22220000004000400040004002220040040040000040000002220000004040004040004002220000000400004000000002220000000040000400000002222",
"22220040004000400040004002220040004040004040000002220040004040004040004002220000000040000400000002220000000400004000000002222",
"22220004440000400004440002220040004004440044444002220004440004440040004002220000000004000040000002220000004000040000000002222",
"22220000000000000000000002220000000000000000000002220000000000000000000002220000000000000000000002220000000000000000000002222",
"22222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222000000000000000000022222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222211111111111111111111111111111111111111111111111111111111111111111111111222222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222000000000000000000022111000000000000000000011111000000000000000000011111000000000000000000011122 22222",
"2222000000000000000000000211000000000000000000000111000000000000000000000111000000000000000000000112 2222",
"2222000444004000404444400211000000004444000000000111000000004444400000000111000000004444400000000112 4 2222",
"2222004000404000404000000211000000004000400000000111000000004000000000000111000000004000000000000112 2222",
"2222004000004000404000000211000000004000400000000111000000004000000000000111000000004000000000000112 2222",
"2222000444004444404444000211000000004000400000000111000000004444000000000111000000004444000000000112 44444 2222",
"2222000000404000404000000211000000004000400000000111000000004000000000000111000000004000000000000112 2222",
"2222004000404000404000000211000000004000400000000111000000004000000000000111000000004000000000000112 2222",
"2222000444004000404000000211000000004444000000000111000000004444400000000111000000004000000000000112 4 2222",
"2222000000000000000000000211000000000000000000000111000000000000000000000111000000000000000000000112 2222",
"22222000000000000000000022111000000000000000000011111000000000000000000011111000000000000000000011122 22222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222000000000000000000022111000000000000000000011111000000000000000000011111000000000000000000011122 22222",
"2222000000000000000000000211000000000000000000000111000000000000000000000111000000000000000000000112 2222",
"2222000444004000404000400211000000000444000000000111000000004444000000000111000000000444000000000112 2222",
"2222000040004400404000400211000000004000400000000111000000004000400000000111000000004000400000000112 4 4 2222",
"2222000040004040404000400211000000004000400000000111000000004000400000000111000000004000000000000112 4 4 2222",
"2222000040004004400404000211000000004444400000000111000000004444000000000111000000004000000000000112 4 2222",
"2222000040004000400404000211000000004000400000000111000000004000400000000111000000004000000000000112 4 4 2222",
"2222000040004000400040000211000000004000400000000111000000004000400000000111000000004000400000000112 4 4 2222",
"2222000444004000400040000211000000004000400000000111000000004444000000000111000000000444000000000112 2222",
"2222000000000000000000000211000000000000000000000111000000000000000000000111000000000000000000000112 2222",
"22222000000000000000000022111000000000000000000011111000000000000000000011111000000000000000000011122 22222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222000000000000000000022111444444444444444444411111444444444444444444411114444444444444444444441122 22222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"222200000044400044400000021144444444 44444444111444444444 444444444111444444444 444444444112 2222",
"2222000004000404000400000211444444444444 4444444411144444444 444 4444444411144444444 444 44444444112 2222",
"2222000004000404000400000211444444444444 4444444411144444444 444 4444444411144444444 444 44444444112 2222",
"222200000400040444400000021144444444444 444444444111444444444 444444444111444444444 44444444112 44444 2222",
"22220000040004040040000002114444444444 444444444411144444444 444 44444444111444444444444 44444444112 2222",
"22220000040004040004000002114444444444 444444444411144444444 444 44444444111444444444444 44444444112 2222",
"22220000004440040004000002114444444444 4444444444111444444444 444444444111444444444 444444444112 2222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"22222000000000000000000022111444444444444444444411111444444444444444444411114444444444444444444441122 22222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222000000000000000000022111444444444444444444411111444444444444444444411114444444444444444444441122 22222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"222200044400400040444400021144444444 444 4444444411144444444 44444444111444444444 444444444112 2222",
"222200400040440040400040021144444444 444 4444444411144444444 44444444444411144444444 444444444444112 4 2222",
"222200400040404040400040021144444444 444 4444444411144444444 44444444411144444444 444444444444112 4 2222",
"222200444440400440400040021144444444 44444444111444444444444 4444444411144444444 444444444112 44444 2222",
"2222004000404000404000400211444444444444 44444444111444444444444 4444444411144444444 444 44444444112 4 2222",
"2222004000404000404000400211444444444444 4444444411144444444 444 4444444411144444444 444 44444444112 4 2222",
"2222004000404000404444000211444444444444 44444444111444444444 444444444111444444444 444444444112 2222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"22222000000000000000000022114444444444444444444411111444444444444444444411114444444444444444444441122 22222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222222222222222222222222111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222",
"22222000000000000000000022111444444444444444444411111444444444444444444411111444444444444444444411122 22222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"22220040004004440044440002114444444444 4444444444111444444444 444444444111444444444 444444444112 2222",
"2222004000404000404000400211444444444 444444444411144444444 444 4444444411144444444 444 44444444112 2222",
"22220004040040004040004002114444444444 4444444444111444444444444 44444444111444444444444 44444444112 2222",
"22220000400040004044440002114444444444 44444444441114444444444 4444444441114444444444 444444444112 2222",
"22220004040040004040040002114444444444 4444444444111444444444 44444444444111444444444444 44444444112 2222",
"22220040004040004040004002114444444444 444444444411144444444 44444444444411144444444 444 44444444112 2222",
"2222004000400444004000400211444444444 44444444411144444444 44444444111444444444 444444444112 2222",
"2222000000000000000000000211444444444444444444444111444444444444444444444111444444444444444444444112 2222",
"2222200000000000000000002211144444444444444444441111144444444444444444441111144444444444444444441112 2222",
"2222222222222222222222222211111111111111111111111111111111111111111111111111111111111111111111111112 44444 2222",
"2222222222222222222222222211111111111111111111111111111111111111111111111111111111111111111111111122 2222",
"2222222222222222222222222211111111111111111111111111111111111111111111111111222222222222222222222222 2222",
"2222222222222222222222222211111111111111111111111111111111111111111111111112222222222222222222222222 2222",
"2222222222222222222222222211111111111111111111111111111111111111111111111112222222222222222222222222 44444 2222",
"2222200000000000000000002211144444444444444444441111144444444444444444441112244444444444444444442222 2222",
"2222000000000000000000000211444444444444444444444111444444444444444444444112444444444444444444444222 2222",
"2222000000444004444400000211444444444 444444444111444444444444444444444112444444 44444444444444222 2222",
"222200000400040400000000021144444444 444 44444444111444444444444444444444112444444 44444 44444444222 2222",
"222200000400000400000000021144444444 44 444444441114444444444444444444441124444 44 444444444222 2222",
"222200000400000444400000021144444444 4 4 44444444111444444444444444444444112444444 444 4444444444222 2222",
"222200000400000400000000021144444444 44 444444441114444444444 4444444444112444444 44 44 4444222 2222",
"222200000400040400000000021144444444 444 44444444111444444444 44444444411244444444 444444444444222 2222",
"2222000000444004444400000211444444444 4444444441114444444444 4444444444112444444444444444444444222 2222",
"2222000000000000000000000211444444444444444444444111444444444444444444444112444444444444444444444222 2222",
"22222000000000000000000022111444444444444444444411111444444444444444444411122444444444444444444422222 22222",
"22222222222222222222222222111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222",
"22222222222222222222222222211111111111111111111111111111111111111111111111222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"};
hcalc.c 100644 124 24 417 6505257426 10052 0 ustar dj user /* Copyright 1998 DJ Delorie <dj@delorie.com>
Distributed under the terms of the GNU GPL
http://www.delorie.com/store/hcalc/
*/
#include "hcalc.h"
int
main(int argc, char **argv)
{
setbuf(stdout, 0);
setup_x(argc, argv);
load_pixmaps();
process_input();
}
hcalc.h 100644 124 24 1241 6505257451 10071 0 ustar dj user /* 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 <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
extern Display *display;
extern int screen;
extern Visual *visual;
extern Colormap cmap;
extern Window window;
extern Window rootwin;
extern GC gc;
extern Atom wm_protocols_atom;
extern Atom delete_atom;
extern Atom paste_atom;
extern XEvent event;
extern Pixmap face;
extern Pixmap chars;
int bit_on;
int bit_off;
extern int char_to_x[256];
extern char charmap[];
#define MAXCHARS 15
#define WIDTH 125
#define HEIGHT 147
images.c 100644 124 24 1343 6505257432 10261 0 ustar dj user /* Copyright 1998 DJ Delorie <dj@delorie.com>
Distributed under the terms of the GNU GPL
http://www.delorie.com/store/hcalc/
*/
#include "hcalc.h"
#include <X11/xpm.h>
#define xpm face_data
#include "face.xpm"
#undef xpm
#define xpm chars_data
#include "chars.xpm"
#undef xpm
Pixmap face;
Pixmap chars;
char charmap[] = " 0123456789ABCDEF-x,.ro+";
int char_to_x[256];
void
load_pixmaps()
{
int i, c;
XpmAttributes attr;
attr.valuemask = 0;
XpmCreatePixmapFromData(display, window, face_data, &face, 0, &attr);
XpmCreatePixmapFromData(display, window, chars_data, &chars, 0, &attr);
for (i=0; i<256; i++)
{
char_to_x[i] = 0;
for (c=0; charmap[c]; c++)
if (charmap[c] == i)
char_to_x[i] = c*6;
}
}
input.c 100644 124 24 15013 6505257436 10176 0 ustar dj user /* Copyright 1998 DJ Delorie <dj@delorie.com>
Distributed under the terms of the GNU GPL
http://www.delorie.com/store/hcalc/
*/
#include "hcalc.h"
#include <ctype.h>
#include <string.h>
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 = (long long)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";
long long ll = (long long)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 = (long long)saved & (long long)value;
break;
case '|':
value = (long long)saved | (long long)value;
break;
case '^':
value = (long long)saved ^ (long long)value;
break;
case 'S':
if (value < 0)
value = (long long)saved >> (long long)(-value);
else
value = (long long)saved << (long long)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 = ~ (long long)value;
show_value();
break;
case '<':
end_number();
value = (long long)value << 1;
show_value();
break;
case '>':
end_number();
value = (long long)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._="
};
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]);
}
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)
exit(0);
if (bmap[y][x] == 'P' && b == 1)
copy();
if (bmap[y][x] == 'P' && b != 1)
paste();
key(bmap[y][x]);
}
setupx.c 100644 124 24 5764 6505257442 10360 0 ustar dj user /* Copyright 1998 DJ Delorie <dj@delorie.com>
Distributed under the terms of the GNU GPL
http://www.delorie.com/store/hcalc/
*/
#include "hcalc.h"
Display *display=0;
int screen=0;
Visual *visual=0;
Colormap cmap=0;
Window window=0;
Window rootwin=0;
GC gc=0;
Atom wm_protocols_atom=0;
Atom delete_atom=0;
Atom paste_atom=0;
XEvent event;
int bit_on, bit_off;
void
setup_x(int argc, char **argv)
{
char *name = "hcalc";
XSizeHints size_hints;
XTextProperty xtp;
XSetWindowAttributes attributes;
XColor color;
display = XOpenDisplay(0);
screen = XDefaultScreen(display);
cmap = XDefaultColormap(display, screen);
visual = XDefaultVisual(display, screen);
rootwin = XDefaultRootWindow(display);
gc = XCreateGC(display, rootwin, 0, 0);
wm_protocols_atom = XInternAtom(display, "WM_PROTOCOLS", 0);
delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", 0);
paste_atom = XInternAtom(display, "PASTE_DATA", 0);
size_hints.flags = PSize;
size_hints.width = WIDTH;
size_hints.height = HEIGHT;
size_hints.x = 0;
size_hints.y = 0;
window = XCreateWindow(display,
rootwin,
size_hints.x, size_hints.y,
size_hints.width, size_hints.height,
0,
CopyFromParent, /* depth */
InputOutput,
CopyFromParent, /* visual */
0, 0);
XSetWMNormalHints(display, window, &size_hints);
XStringListToTextProperty(&name, 1, &xtp);
XSetWMName(display, window, &xtp);
XFree(xtp.value);
XSetWMProtocols(display, window, &delete_atom, 1);
attributes.event_mask = ExposureMask | ButtonPressMask | KeyPressMask;
XChangeWindowAttributes(display, window, CWEventMask, &attributes);
XMapWindow(display, window);
XFlush(display);
color.red = 0x6666;
color.green = 0xffff;
color.blue = 0x6666;
color.flags = DoRed | DoGreen | DoBlue;
XAllocColor(display, cmap, &color);
bit_on = color.pixel;
color.red = 0x3333;
color.green = 0xcccc;
color.blue = 0x3333;
color.flags = DoRed | DoGreen | DoBlue;
XAllocColor(display, cmap, &color);
bit_off = color.pixel;
}
void
process_input()
{
char c;
KeySym keysym;
char tmp[16], *tp;
XTextProperty tprop;
while (1)
{
XNextEvent(display, &event);
if (event.xany.window == window)
{
switch (event.type)
{
case Expose:
if (event.xexpose.count == 0)
redraw();
break;
case KeyPress:
if (XLookupString(&event.xkey, &c, 1, &keysym, 0) == 1)
{
if (c == 3)
exit(0);
key(c);
}
else
{
switch (keysym)
{
case XK_F1:
key('D');
break;
case XK_F2:
key('H');
break;
case XK_F3:
key('O');
break;
case XK_F4:
key('B');
break;
}
}
break;
case ButtonPress:
button(event.xbutton.button, event.xbutton.x, event.xbutton.y);
break;
case SelectionRequest:
send_current_display();
break;
case SelectionNotify:
if (event.xselection.property == paste_atom)
{
XGetTextProperty(display, window, &tprop, paste_atom);
complete_paste(tprop.value, tprop.nitems);
}
break;
}
}
}
}