#include <X11/Intrinsic.h>
#include <setjmp.h>
#include "xcalc.h"
#ifndef IEEE
#define XCALC_PRE_OP(keynum) { if (pre_op(keynum)) return; \
if (setjmp (env)) {fail_op(); return;}}
#else
#define XCALC_PRE_OP(keynum) if (pre_op(keynum)) return;
#endif
static void add(Widget w, XEvent *e, String *vector, Cardinal *count);
static void back(Widget w, XEvent *e, String *vector, Cardinal *count);
static void bell(Widget w, XEvent *e, String *vector, Cardinal *count);
static void clearit(Widget w, XEvent *e, String *vector, Cardinal *count);
static void cosine(Widget w, XEvent *e, String *vector, Cardinal *count);
static void decimal(Widget w, XEvent *e, String *vector, Cardinal *count);
static void degree(Widget w, XEvent *e, String *vector, Cardinal *count);
static void digit(Widget w, XEvent *e, String *vector, Cardinal *count);
static void divide(Widget w, XEvent *e, String *vector, Cardinal *count);
static void e(Widget w, XEvent *e, String *vector, Cardinal *count);
static void enter(Widget w, XEvent *e, String *vector, Cardinal *count);
static void epower(Widget w, XEvent *e, String *vector, Cardinal *count);
static void equal(Widget w, XEvent *e, String *vector, Cardinal *count);
static void exchange(Widget w, XEvent *e, String *vector, Cardinal *count);
static void factorial(Widget w, XEvent *e, String *vector, Cardinal *count);
static void inverse(Widget w, XEvent *e, String *vector, Cardinal *count);
static void leftParen(Widget w, XEvent *e, String *vector, Cardinal *count);
static void logarithm(Widget w, XEvent *e, String *vector, Cardinal *count);
static void multiply(Widget w, XEvent *e, String *vector, Cardinal *count);
static void naturalLog(Widget w, XEvent *e, String *vector, Cardinal *count);
static void factorial(Widget w, XEvent *e, String *vector, Cardinal *count);
static void negate(Widget w, XEvent *e, String *vector, Cardinal *count);
static void nop(Widget w, XEvent *e, String *vector, Cardinal *count);
static void off(Widget w, XEvent *e, String *vector, Cardinal *count);
static void pi(Widget w, XEvent *e, String *vector, Cardinal *count);
static void power(Widget w, XEvent *e, String *vector, Cardinal *count);
static void quit(Widget w, XEvent *e, String *vector, Cardinal *count);
static void recall(Widget w, XEvent *e, String *vector, Cardinal *count);
static void reciprocal(Widget w, XEvent *e, String *vector, Cardinal *count);
static void rightParen(Widget w, XEvent *e, String *vector, Cardinal *count);
static void roll(Widget w, XEvent *e, String *vector, Cardinal *count);
static void scientific(Widget w, XEvent *e, String *vector, Cardinal *count);
static void selection(Widget w, XEvent *e, String *vector, Cardinal *count);
static void sine(Widget w, XEvent *e, String *vector, Cardinal *count);
static void square(Widget w, XEvent *e, String *vector, Cardinal *count);
static void squareRoot(Widget w, XEvent *e, String *vector, Cardinal *count);
static void store(Widget w, XEvent *e, String *vector, Cardinal *count);
static void subtract(Widget w, XEvent *e, String *vector, Cardinal *count);
static void sum(Widget w, XEvent *e, String *vector, Cardinal *count);
static void tangent(Widget w, XEvent *e, String *vector, Cardinal *count);
static void tenpower(Widget w, XEvent *e, String *vector, Cardinal *count);
static void XexchangeY(Widget w, XEvent *e, String *vector, Cardinal *count);
XtActionsRec Actions[] = {
{"add", add},
{"back", back},
{"bell", bell},
{"clear", clearit},
{"cosine", cosine},
{"decimal", decimal},
{"degree", degree},
{"digit", digit},
{"divide", divide},
{"e", e},
{"enter", enter},
{"epower", epower},
{"equal", equal},
{"exchange", exchange},
{"factorial", factorial},
{"inverse", inverse},
{"leftParen", leftParen},
{"logarithm", logarithm},
{"multiply", multiply},
{"naturalLog", naturalLog},
{"negate", negate},
{"nop", nop},
{"off", off},
{"pi", pi},
{"power", power},
{"quit", quit},
{"recall", recall},
{"reciprocal", reciprocal},
{"rightParen", rightParen},
{"roll", roll},
{"scientific", scientific},
{"selection", selection},
{"sine", sine},
{"square", square},
{"squareRoot", squareRoot},
{"store", store},
{"subtract", subtract},
{"sum", sum},
{"tangent", tangent},
{"tenpower", tenpower},
{"XexchangeY", XexchangeY}
};
int ActionsCount = XtNumber(Actions);
static void add(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kADD);
rpn ? twof(kADD) : twoop(kADD);
post_op();
}
static void back(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kBKSP);
bkspf();
post_op();
}
static void bell(Widget w, XEvent *e, String *vector, Cardinal *count)
{
ringbell();
}
static void clearit(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kCLR);
clearf();
post_op();
}
static void cosine(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kCOS);
oneop(kCOS);
post_op();
}
static void decimal(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kDEC);
decf();
post_op();
}
static void degree(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kDRG);
drgf();
post_op();
}
static void digit(Widget w, XEvent *e, String *vector, Cardinal *count)
{
switch (vector[0][0])
{
case '1': XCALC_PRE_OP(kONE); numeric(kONE); break;
case '2': XCALC_PRE_OP(kTWO); numeric(kTWO); break;
case '3': XCALC_PRE_OP(kTHREE); numeric(kTHREE); break;
case '4': XCALC_PRE_OP(kFOUR); numeric(kFOUR); break;
case '5': XCALC_PRE_OP(kFIVE); numeric(kFIVE); break;
case '6': XCALC_PRE_OP(kSIX); numeric(kSIX); break;
case '7': XCALC_PRE_OP(kSEVEN); numeric(kSEVEN); break;
case '8': XCALC_PRE_OP(kEIGHT); numeric(kEIGHT); break;
case '9': XCALC_PRE_OP(kNINE); numeric(kNINE); break;
case '0': XCALC_PRE_OP(kZERO); numeric(kZERO); break;
}
post_op();
}
static void divide(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kDIV);
rpn ? twof(kDIV) : twoop(kDIV);
post_op();
}
static void e(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kE);
oneop(kE);
post_op();
}
static void enter(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kENTR);
entrf();
post_op();
}
static void epower(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kEXP);
oneop(kEXP);
post_op();
}
static void equal(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kEQU);
equf();
post_op();
}
static void exchange(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kEXC);
oneop(kEXC);
post_op();
}
static void factorial(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kFACT);
oneop(kFACT);
post_op();
}
static void inverse(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kINV);
invf();
post_op();
}
static void leftParen(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kLPAR);
lparf();
post_op();
}
static void logarithm(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kLOG);
oneop(kLOG);
post_op();
}
static void multiply(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kMUL);
rpn ? twof(kMUL) : twoop(kMUL);
post_op();
}
static void naturalLog(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kLN);
oneop(kLN);
post_op();
}
static void negate(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kNEG);
negf();
post_op();
}
static void nop(Widget w, XEvent *e, String *vector, Cardinal *count)
{
ringbell();
}
static void off(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kOFF);
offf();
post_op();
}
static void pi(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kPI);
oneop(kPI);
post_op();
}
static void power(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kPOW);
rpn ? twof(kPOW) : twoop(kPOW);
post_op();
}
static void quit(Widget w, XEvent *e, String *vector, Cardinal *count)
{
if (e->type == ClientMessage && e->xclient.data.l[0] != wm_delete_window)
ringbell();
else
Quit();
}
static void recall(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kRCL);
rpn ? memf(kRCL) : oneop(kRCL);
post_op();
}
static void reciprocal(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kRECIP);
oneop(kRECIP);
post_op();
}
static void rightParen(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kRPAR);
rparf();
post_op();
}
static void roll(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kROLL);
rollf();
post_op();
}
static void scientific(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kEE);
eef();
post_op();
}
static void selection(Widget w, XEvent *e, String *vector, Cardinal *count)
{
do_select(((XButtonReleasedEvent *)e)->time);
}
static void sine(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSIN);
oneop(kSIN);
post_op();
}
static void square(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSQR);
oneop(kSQR);
post_op();
}
static void squareRoot(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSQRT);
oneop(kSQRT);
post_op();
}
static void store(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSTO);
rpn ? memf(kSTO) : oneop(kSTO);
post_op();
}
static void subtract(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSUB);
rpn ? twof(kSUB) : twoop(kSUB);
post_op();
}
static void sum(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kSUM);
rpn ? memf(kSUM) : oneop(kSUM);
post_op();
}
static void tangent(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kTAN);
oneop(kTAN);
post_op();
}
static void tenpower(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(k10X);
oneop(k10X);
post_op();
}
static void XexchangeY(Widget w, XEvent *e, String *vector, Cardinal *count)
{
XCALC_PRE_OP(kXXY);
twof(kXXY);
post_op();
}