void sub(void) { sp--; *sp -= *(sp+1); }
void mul(void) { sp--; *sp *= *(sp+1); }
void div(void) { sp--; *sp /= *(sp+1); }
+void mod(void) { sp--; *sp = fmod(*sp, *(sp+1)); }
void pot(void) { sp--; *sp = pow(*sp, *(sp+1)); }
void osin(void) { *sp = sin(*sp); }
void ocos(void) { *sp = cos(*sp); }
void oacos(void) { *sp = acos(*sp); }
void oatan(void) { *sp = atan(*sp); }
void osqrt(void) { *sp = sqrt(*sp); }
+void oexp(void) { *sp = exp(*sp); }
void olog(void) { *sp = log10(*sp); }
void oln(void) { *sp = log(*sp); }
"-", OBINARY, 0, 0, sub,
"*", OBINARY, 0, 100, mul,
"/", OBINARY, 0, 100, div,
+ "%", OBINARY, 0, 100, mod,
"^", OBINARY, 1, 200, pot,
"sin", OUNARY, 0, 50, osin,
"cos", OUNARY, 0, 50, ocos,
"acos", OUNARY, 0, 50, oacos,
"atan", OUNARY, 0, 50, oatan,
"sqrt", OUNARY, 0, 50, osqrt,
+ "exp", OUNARY, 0, 50, oexp,
"log", OUNARY, 0, 50, olog,
"ln", OUNARY, 0, 50, oln,
};
m.buttons = 7;
r = egetrect(1, &m);
- if(r.min.x == 0 && r.min.y == 0 && r.max.x == 0 && r.max.y == 0)
+ if(Dx(r) < 1 || Dy(r) < 1)
return;
xmin_ = convx(&screen->r, r.min.x);
xmax_ = convx(&screen->r, r.max.x);
void
parserange(char *s)
{
- while(*s && !isdigit(*s)) s++;
+ while(*s && !isdigit(*s) && *s != '-') s++;
if(*s == 0) return;
xmin = strtod(s, &s);
- while(*s && !isdigit(*s)) s++;
+ while(*s && !isdigit(*s) && *s != '-') s++;
if(*s == 0) return;
xmax = strtod(s, &s);
- while(*s && !isdigit(*s)) s++;
+ while(*s && !isdigit(*s) && *s != '-') s++;
if(*s == 0) return;
ymin = strtod(s, &s);
- while(*s && !isdigit(*s)) s++;
+ while(*s && !isdigit(*s) && *s != '-') s++;
if(*s == 0) return;
ymax = strtod(s, &s);
}