diff options
Diffstat (limited to 'actions.c')
-rw-r--r-- | actions.c | 551 |
1 files changed, 551 insertions, 0 deletions
diff --git a/actions.c b/actions.c new file mode 100644 index 0000000..37c5736 --- /dev/null +++ b/actions.c @@ -0,0 +1,551 @@ +/* $XConsortium: actions.c,v 1.9 94/04/17 20:43:30 converse Exp $ */ +/* + +Copyright (c) 1989 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +/* + * actions.c - externally available procedures for xcalc + * + * Author: Donna Converse, MIT X Consortium + */ + +#include <X11/Intrinsic.h> +#include <setjmp.h> +#include "xcalc.h" +extern int rpn; +extern Atom wm_delete_window; +extern int pre_op(); +extern void post_op(), Quit(), ringbell(), do_select(); + +#ifndef IEEE +extern jmp_buf env; +extern void fail_op(); +#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 + +/*ARGSUSED*/ +void add(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kADD); + rpn ? twof(kADD) : twoop(kADD); + post_op(); +} + +/*ARGSUSED*/ +void back(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kBKSP); + bkspf(); + post_op(); +} + +/*ARGSUSED*/ +void bell(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + ringbell(); +} + +/*ARGSUSED*/ +void clearit(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kCLR); + clearf(); + post_op(); +} + +/*ARGSUSED*/ +void cosine(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kCOS); + oneop(kCOS); + post_op(); +} + +/*ARGSUSED*/ +void decimal(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kDEC); + decf(); + post_op(); +} + +/*ARGSUSED*/ +void degree(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kDRG); + drgf(); + post_op(); +} + +/*ARGSUSED*/ +void digit(w, e, vector, count) + 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(); +} + +/*ARGSUSED*/ +void divide(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kDIV); + rpn ? twof(kDIV) : twoop(kDIV); + post_op(); +} + +/*ARGSUSED*/ +void e(w, ev, vector, count) + Widget w; + XEvent *ev; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kE); + oneop(kE); + post_op(); +} + +/*ARGSUSED*/ +void enter(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kENTR); + entrf(); + post_op(); +} + +/*ARGSUSED*/ +void epower(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kEXP); + oneop(kEXP); + post_op(); +} + +/*ARGSUSED*/ +void equal(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kEQU); + equf(); + post_op(); +} + +/*ARGSUSED*/ +void exchange(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kEXC); + oneop(kEXC); + post_op(); +} + +/*ARGSUSED*/ +void factorial(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kFACT); + oneop(kFACT); + post_op(); +} + +/*ARGSUSED*/ +void inverse(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kINV); + invf(); + post_op(); +} + +/*ARGSUSED*/ +void leftParen(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kLPAR); + lparf(); + post_op(); +} + +/*ARGSUSED*/ +void logarithm(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kLOG); + oneop(kLOG); + post_op(); +} + +/*ARGSUSED*/ +void multiply(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kMUL); + rpn ? twof(kMUL) : twoop(kMUL); + post_op(); +} + +/*ARGSUSED*/ +void naturalLog(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kLN); + oneop(kLN); + post_op(); +} + +/*ARGSUSED*/ +void negate(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kNEG); + negf(); + post_op(); +} + +/*ARGSUSED*/ +void nop(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + ringbell(); +} + +/*ARGSUSED*/ +void off(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kOFF); + offf(); + post_op(); +} + +/*ARGSUSED*/ +void pi(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kPI); + oneop(kPI); + post_op(); +} + +/*ARGSUSED*/ +void power(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kPOW); + rpn ? twof(kPOW) : twoop(kPOW); + post_op(); +} + +/*ARGSUSED*/ +void quit(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + if (e->type == ClientMessage && e->xclient.data.l[0] != wm_delete_window) + ringbell(); + else + Quit(); +} + +/*ARGSUSED*/ +void recall(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kRCL); + rpn ? memf(kRCL) : oneop(kRCL); + post_op(); +} + +/*ARGSUSED*/ +void reciprocal(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kRECIP); + oneop(kRECIP); + post_op(); +} + +/*ARGSUSED*/ +void rightParen(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kRPAR); + rparf(); + post_op(); +} + +/*ARGSUSED*/ +void roll(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kROLL); + rollf(); + post_op(); +} + +/*ARGSUSED*/ +void scientific(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kEE); + eef(); + post_op(); +} + +/*ARGSUSED*/ +void selection(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + do_select(((XButtonReleasedEvent *)e)->time); +} + +/*ARGSUSED*/ +void sine(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSIN); + oneop(kSIN); + post_op(); +} + +/*ARGSUSED*/ +void square(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSQR); + oneop(kSQR); + post_op(); +} + +/*ARGSUSED*/ +void squareRoot(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSQRT); + oneop(kSQRT); + post_op(); +} + +/*ARGSUSED*/ +void store(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSTO); + rpn ? memf(kSTO) : oneop(kSTO); + post_op(); +} + +/*ARGSUSED*/ +void subtract(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSUB); + rpn ? twof(kSUB) : twoop(kSUB); + post_op(); +} + +/*ARGSUSED*/ +void sum(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kSUM); + rpn ? memf(kSUM) : oneop(kSUM); + post_op(); +} + +/*ARGSUSED*/ +void tangent(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kTAN); + oneop(kTAN); + post_op(); +} + +/*ARGSUSED*/ +void tenpower(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(k10X); + oneop(k10X); + post_op(); +} + +/*ARGSUSED*/ +void XexchangeY(w, e, vector, count) + Widget w; + XEvent *e; + String *vector; + Cardinal *count; +{ + XCALC_PRE_OP(kXXY); + twof(kXXY); + post_op(); +} |