void negf(void) { flagINV=0; if (exponent) { /* neg the exponent */ if (dispstr[exponent]=='-') dispstr[exponent]='+'; else dispstr[exponent]='-'; DrawDisplay(); return; } if (strcmp("0",dispstr)==0) return; /* don't neg a zero */ if (dispstr[0]=='-') /* already neg-ed */ strcpy(dispstr,dispstr+1); /* move str left once */ else { /* not neg-ed. add a '-' */ char tmp[32]; snprintf(tmp, sizeof(tmp), "-%s", dispstr); strlcpy(dispstr, tmp, sizeof(dispstr)); } if (entered==2) dnum = -1.0 * dnum; DrawDisplay(); }
XxLcdAlphaDisplay::XxLcdAlphaDisplay ( EzString Name, XxDrawable *pParent , int XOffset, int YOffset , int nDigits , XxColor OnColor, XxColor OffColor ) { int i; XxLcdAlphaDisplay::nDigits = nDigits; XxLcdAlphaDisplay::DisplayVal = -1; XxLcdAlphaDisplay::pDigits = new XxLcdAlphaDigit *[nDigits]; XxLcdAlphaDisplay::EliminateZeroDigit = EliminateZeroDigit; for (i = 0; i < nDigits; i++) { pDigits[i] = new XxLcdAlphaDigit ( Name + EzString ("_") + EzString (i) , pParent , XOffset, YOffset , OnColor, OffColor ); XOffset += pDigits[i]->GetNetWidth (); }; DrawDisplay (EzString ("")); };
XxLcdNumDisplay::XxLcdNumDisplay ( EzString Name, XxDrawable *pParent , int XOffset, int YOffset , int NumDigits, int DotDigit , int EliminateZeroDigit , XxColor OnColor, XxColor OffColor, XxColor BackColor ) { int i; XxLcdNumDisplay::NumDigits = NumDigits; XxLcdNumDisplay::DisplayVal = -1; XxLcdNumDisplay::pDigits = new XxLcdNumDigit *[NumDigits]; XxLcdNumDisplay::EliminateZeroDigit = EliminateZeroDigit; for (i = 0; i < NumDigits; i++) { pDigits[i] = new XxLcdNumDigit ( Name + EzString ("_") + EzString (i) , pParent , XOffset, YOffset , OnColor, OffColor, BackColor ); if (i == DotDigit) pDigits[i]->SetDot (1); XOffset += pDigits[i]->GetWidth (); }; DrawDisplay (0); };
BOOL DrawItem(WPARAM wParam, LPARAM lParam) { LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam; UINT state = lpdi->itemState; RECT rect = lpdi->rcItem; HDC hdc = lpdi->hDC; SetGraphicsMode(hdc, GM_ADVANCED); switch (wParam) { // Spectrum case SPECTRUM_ID: return DrawSpectrum(hdc, rect); break; // Display case DISPLAY_ID: return DrawDisplay(hdc, rect); break; // Meter case METER_ID: return DrawMeter(hdc, rect); break; } }
BOOL DrawItem(WPARAM wParam, LPARAM lParam) { LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam; UINT state = lpdi->itemState; RECT rect = lpdi->rcItem; HDC hdc = lpdi->hDC; switch (wParam) { // Scale case SCALE_ID: DrawScale(hdc, rect, state); break; // Display case DISPLAY_ID: DrawDisplay(hdc, rect, state); break; // Knob case KNOB_ID: DrawKnob(hdc, rect, state); break; } }
void fail_op(void) { if (SignalKind == SIGFPE) strlcpy(dispstr, "math error", sizeof(dispstr)); else if (SignalKind == SIGILL) strlcpy(dispstr, "illegal operand", sizeof(dispstr)); entered=3; DrawDisplay(); return; }
void post_op(void) { #ifdef DEBUG showstack("\0"); #endif #ifndef IEEE if (errno) { strlcpy(dispstr, "error", sizeof(dispstr)); DrawDisplay(); entered=3; errno=0; } #endif }
void clearf(void) { flagINV=0; if (CLR && !rpn) { /* clear all */ ClearStacks(); flagPAREN=0; } CLR++; exponent=Dpoint=0; clrdisp=1; entered=1; strlcpy(dispstr, "0", sizeof(dispstr)); DrawDisplay(); }
void eef(void) { flagINV=0; if (clrdisp) { if (rpn && lift_enabled) PushNum(dnum); strlcpy(dispstr, rpn ? "1" : "0", sizeof(dispstr)); } if (!exponent) { strcat(dispstr,"E+"); DrawDisplay(); exponent=strlen(dispstr)-1; /* where the '-' goes */ } clrdisp=0; entered=1; }
/*-------------------------------------------------------------------------*/ void change_base(void) { parse_double(&dnum); if (dnum >= 0) { switch (numbase) { case 8: numbase = 10; break; case 10: numbase = 16; break; case 16: numbase = 8; break; } format_double(dnum); } else strlcpy(dispstr, "error", sizeof(dispstr)); DrawDisplay(); }
void bkspf(void) { lift_enabled = 0; if (! flagINV) { if (entered!=1) { clearf(); return; } if (clrdisp) return; if ((int) strlen(dispstr) > 0) { #ifndef X_LOCALE const char *dp = localeconv()->decimal_point; size_t dp_len = strlen(dp); size_t ds_len = strlen(dispstr); if (ds_len >= dp_len && strcmp(dispstr + ds_len - dp_len, dp) == 0) Dpoint=0; #else if (dispstr[strlen(dispstr)-1] == '.') Dpoint=0; #endif dispstr[strlen(dispstr)-1] = 0; } if (strlen(dispstr) == 0) { strcat(dispstr, "0"); clrdisp++; } } else { strlcpy(dispstr, "0", sizeof(dispstr)); dnum = 0.0; clrdisp++; flagINV = 0; } DrawDisplay(); }
void decf(void) { flagINV=0; if (clrdisp) { if (rpn && lift_enabled) PushNum(dnum); strlcpy(dispstr, "0", sizeof(dispstr)); } if (!Dpoint) { #ifndef X_LOCALE strcat(dispstr, localeconv()->decimal_point); #else strcat(dispstr, "."); #endif DrawDisplay(); Dpoint++; } clrdisp=0; entered=1; }
/* Two operand functions for infix calc */ void twoop(int keynum) { if (flagINV) { flagINV=0; DrawDisplay(); } if (!entered) { /* something like "5+*" */ if (!isopempty()) (void) PopOp(); /* replace the prev op */ PushOp(keynum); /* with the new one */ return; } if (entered==1) parse_double(&dnum); clrdisp=CLR=1; entered=Dpoint=exponent=0; if (!isopempty()) { /* there was a previous op */ lastop=PopOp(); /* get it */ if (lastop==kLPAR) { /* put it back */ PushOp(kLPAR); PushOp(keynum); PushNum(dnum); return; } /* now, if the current op (keynum) is of higher priority than the lastop, the current op and number are just pushed on top Priorities: (Y^X) > *,/ > +,- > >>,<< > & > ^ > ~ */ if (priority(keynum) > priority(lastop)) { PushNum(dnum); PushOp(lastop); PushOp(keynum); } else { /* execute lastop on lastnum and dnum, push result and current op on stack */ acc=PopNum(); switch (lastop) { /* perform the operation */ case kADD: acc += dnum; break; case kSUB: acc -= dnum; break; case kMUL: acc *= dnum; break; case kDIV: acc /= dnum; break; case kPOW: acc = pow(acc,dnum); break; case kMOD: acc = (long)acc % (long)dnum; break; case kAND: acc = (long)acc & (long)dnum; break; case kOR: acc = (long)acc | (long)dnum; break; case kXOR: acc = (long)acc ^ (long)dnum; break; case kSHL: acc = (long)acc << (long)dnum; break; case kSHR: acc = (long)acc >> (long)dnum; break; } PushNum(acc); PushOp(keynum); format_double(acc); DrawDisplay(); dnum=acc; } }
/*-------------------------------------------------------------------------*/ void numeric(int keynum) { char st[2]; flagINV=0; if (rpn && (memop == kSTO || memop == kRCL || memop == kSUM)) { int cell = 0; switch (keynum) { case kONE: cell = 1; break; case kTWO: cell = 2; break; case kTHREE: cell = 3; break; case kFOUR: cell = 4; break; case kFIVE: cell = 5; break; case kSIX: cell = 6; break; case kSEVEN: cell = 7; break; case kEIGHT: cell = 8; break; case kNINE: cell = 9; break; case kZERO: cell = 0; break; } switch (memop) { case kSTO: mem[cell] = dnum; lift_enabled = 1; entered = 2; clrdisp++; break; case kRCL: PushNum(dnum); dnum = mem[cell]; format_double(dnum); lift_enabled = 1; entered = 1; clrdisp++; break; case kSUM: mem[cell] += dnum; lift_enabled = 1; entered = 2; clrdisp++; break; } memop = kCLR; DrawDisplay(); return; } if (clrdisp) { dispstr[0]='\0'; exponent=Dpoint=0; /* if (rpn && entered==2) PushNum(dnum); */ if (rpn & lift_enabled) PushNum(dnum); } if ((int) strlen(dispstr) >= MAXDISP) return; st[0] = '\0'; switch (keynum){ case kZERO: st[0] = '0'; break; case kONE: st[0] = '1'; break; case kTWO: st[0] = '2'; break; case kTHREE: st[0] = '3'; break; case kFOUR: st[0] = '4'; break; case kFIVE: st[0] = '5'; break; case kSIX: st[0] = '6'; break; case kSEVEN: st[0] = '7'; break; case kEIGHT: if (numbase > 8) st[0] = '8'; break; case kNINE: if (numbase > 8) st[0] = '9'; break; case kxA: if (numbase > 10) st[0] = 'A'; break; case kxB: if (numbase > 10) st[0] = 'B'; break; case kxC: if (numbase > 10) st[0] = 'C'; break; case kxD: if (numbase > 10) st[0] = 'D'; break; case kxE: if (numbase > 10) st[0] = 'E'; break; case kxF: if (numbase > 10) st[0] = 'F'; break; } if (st[0] == '\0') return; st[1] = '\0'; strcat(dispstr,st); DrawDisplay(); if (clrdisp && keynum != kZERO) clrdisp=0; /*no leading 0s*/ memop = keynum; entered=1; lift_enabled = 0; }
void XxLcdAlphaDisplay::SetVal (EzString Val) { DrawDisplay (Val); };
void XxLcdNumDisplay::SetVal (int Val) { DrawDisplay (Val); };