/*---------------------------------* | File: MENU.c - MLO 900131 V1.00 | | Procedures for menu handling | *---------------------------------*/ #include "rpn.h" #include "proto.h" #include "hmenu.h" #include extern double stack[]; extern double reg[]; extern double acc[]; extern double Convert, ConvertD, ConvertG, ConvertR; extern double LastX; extern double Pig; extern int LastCode; extern Boolean MathError; extern struct Window *Wrpn; extern struct Menu *MenuStrip; static void clearStk(void); static void clearReg(void); static void clearAcc(void); static void vanity(void); void menupick( USHORT code ) { struct MenuItem *thisItem; int nmenu, nitem, nsub, i; double x, y; double *p; /*------------------------------* | Pick up menu, item and (if | | appropriate) subitem numbers | *------------------------------*/ while (code != MENUNULL) { nmenu = MENUNUM(code); nitem = ITEMNUM(code); if (nmenu > 3 && nmenu < 6) { nsub = SUBNUM(code); } switch (nmenu) { case 0: switch (nitem) { case 0: /* Quit */ cleanup(SYS_NORMAL); break; case 1: /* About */ vanity(); break; } break; case 1: switch (nitem) { case 0: /* Clear X */ stack[0] = 0.0; outStk(); LastCode = ENTER_CODE; break; case 1: /* Clear Stack */ clearStk(); LastCode = ENTER_CODE; break; case 2: /* Clear Registers */ clearReg(); break; case 3: /* Clear Accumulators */ clearAcc(); break; case 4: /* Clear All */ clearStk(); clearReg(); clearAcc(); LastCode = ENTER_CODE; break; } break; case 2: switch (nitem) { case 0: /* Set Deg */ Convert = ConvertD; break; case 1: /* Set Rad */ Convert = ConvertR; break; case 2: /* Set Grd */ Convert = ConvertG; break; } break; case 3: switch (nitem) { case 0: /* To H.... */ x = floor(y = fabs(stack[0])); y = (y - x) * 100.0; y = y / 0.36 - floor(y) / 0.9; x += y / 100.0; hxs: if (stack[0] < 0) x = -x; xs(x); break; case 1: /* To H.MMSS */ x = floor(y = fabs(stack[0])); y = (y - x) * 60.0; x += floor(y) * 0.004 + y * 0.006; goto hxs; case 2: /* To Rad */ x = stack[0] * ConvertD; xs(x); break; case 3: /* To Deg */ x = stack[0] / ConvertD; xs(x); break; case 4: /* To Polar */ x = sqrt(stack[0] * stack[0] + stack[1] * stack[1]); y = (x == 0.0) ? 0.0 : (atan2(stack[1], stack[0]) / Convert); xys: if (!MathError) { stack[0] = x; stack[1] = y; outStk(); } break; case 5: /* To Cartesian */ x = stack[0] * cos( (y = stack[1] * Convert) ); y = stack[0] * sin(y); goto xys; } break; case 4: /* Store ... */ if ((i = nsub) < NREGS) { p = reg + i; } else { i -= NREGS; p = acc + i; } switch (nitem) { case 0: /* Store */ *p = stack[0]; outReg(nsub); break; case 1: /* Store + */ x = *p + stack[0]; sxs: if (!MathError) { *p = x; outReg(nsub); } break; case 2: /* Store - */ x = *p - stack[0]; goto sxs; case 3: /* Store * */ x = *p * stack[0]; goto sxs; case 4: /* Store / */ x = *p / stack[0]; goto sxs; } break; case 5: /* Recall ... */ if ((i = nsub) < NREGS) { p = reg + i; } else { i -= NREGS; p = acc + i; } switch (nitem) { case 0: /* Recall */ enter(); stack[0] = *p; outStk(); break; case 1: /* Recall + */ x = stack[0] + *p; rxs: if (!MathError) { enter(); stack[0] = x; outStk(); } break; case 2: /* Recall - */ x = stack[0] - *p; goto rxs; case 3: /* Recall * */ x = stack[0] * *p; goto rxs; case 4: /* Recall / */ x = stack[0] / *p; goto rxs; } break; case 6: switch (nitem) { case 0: /* Last X */ enter(); stack[0] = LastX; outStk(); break; case 1: /* Fisher */ x = regCoef(); y = acc[4] - acc[3] * acc[3] / acc[0]; x = sqrt(y * (1.0 - x * x) / (acc[0] - 2.0)); if (!MathError) { impEnter(); LastX = stack[0]; stack[0] = x; outStk(); } break; } break; } thisItem = (struct MenuItem *) ItemAddress(MenuStrip, code); code = thisItem->NextSelect; } } static void clearStk(void) {/*---------------------------------* | Local function. Clear all stack | *---------------------------------*/ int i; for (i=0; i