📄 parser.c
字号:
break;
case L_MATH:
v[vsp].a.l.x = v[vsp].a.l.y = 0;
break;
}
#endif
if(isdigit(Str[0])
|| (Str[0] == '-' && (isdigit(Str[1]) || Str[1] == '.'))
|| Str[0] == '.') {
if(o[posp-1].f == StkNeg) {
posp--;
Str = Str - 1;
InitN--;
v[vsp].len++;
}
for(n = 1; isdigit(Str[n]) || Str[n] == '.'; n++);
if(Str[n] == ',') {
j = n + SkipWhiteSpace(&Str[n+1]) + 1;
if(isdigit(Str[j])
|| (Str[j] == '-' && (isdigit(Str[j+1]) || Str[j+1] == '.'))
|| Str[j] == '.') {
z.y = atof(&Str[j]);
for(; isdigit(Str[j]) || Str[j] == '.' || Str[j] == '-'; j++);
v[vsp].len = j;
}
else
z.y = 0.0;
}
else
z.y = 0.0;
z.x = atof(Str);
switch(MathType) {
case D_MATH:
v[vsp].a.d = z;
break;
#ifndef XFRACT
case M_MATH:
v[vsp].a.m = cmplx2MPC(z);
break;
case L_MATH:
v[vsp].a.l.x = (long)(z.x * fg);
v[vsp].a.l.y = (long)(z.y * fg);
break;
#endif
}
v[vsp].s = Str;
}
return(&v[vsp++]);
}
struct FNCT_LIST {
char far *s; /* TIW 03-31-91 added far */
void (**ptr)(void);
};
/* TIW 03-30-91 START */
void (*StkTrig0)(void) = dStkSin;
void (*StkTrig1)(void) = dStkSqr;
void (*StkTrig2)(void) = dStkSinh;
void (*StkTrig3)(void) = dStkCosh;
char maxfn = 0;
/* TIW 03-30-91 STOP */
struct FNCT_LIST far FnctList[] = { /* TIW 03-31-91 added far */
s_sin, &StkSin,
s_sinh, &StkSinh,
s_cos, &StkCos,
s_cosh, &StkCosh,
s_sqr, &StkSqr,
s_log, &StkLog,
s_exp, &StkExp,
s_abs, &StkAbs,
s_conj, &StkConj,
s_real, &StkReal,
s_imag, &StkImag,
s_fn1, &StkTrig0, /* TIW 03-30-91 */
s_fn2, &StkTrig1, /* TIW 03-30-91 */
s_fn3, &StkTrig2, /* TIW 03-30-91 */
s_fn4, &StkTrig3, /* TIW 03-30-91 */
s_flip, &StkFlip, /* MCP 4-9-91 */
s_tan, &StkTan, /* TIW 04-22-91 */
s_tanh, &StkTanh, /* TIW 04-22-91 */
s_cotan, &StkCoTan, /* TIW 04-24-91 */
s_cotanh,&StkCoTanh, /* TIW 04-24-91 */
s_cosxx, &StkCosXX, /* PB 04-28-91 */
s_srand, &StkSRand, /* MCP 11-21-91 */
s_asin, &StkASin, /* TIW 11-26-94 */
s_asinh, &StkASinh, /* TIW 11-26-94 */
s_acos, &StkACos, /* TIW 11-26-94 */
s_acosh, &StkACosh, /* TIW 11-26-94 */
s_atan, &StkATan, /* TIW 11-26-94 */
s_atanh, &StkATanh, /* TIW 11-26-94 */
s_sqrt, &StkSqrt, /* TIW 11-26-94 */
s_cabs, &StkCAbs, /* TIW 11-26-94 */
s_floor, &StkFloor, /* TIW 06-30-96 */
s_ceil, &StkCeil, /* TIW 06-30-96 */
s_trunc, &StkTrunc, /* TIW 06-30-96 */
s_round, &StkRound, /* TIW 06-30-96 */
};
void NotAFnct(void) { }
void FnctNotFound(void) { }
/* determine if s names a function and if so which one */
/* TIW 04-22-91 */
whichfn(char *s, int len)
{
int out;
if(len != 3)
out = 0;
else if(strnicmp(s,"fn",2))
out = 0;
else
out = atoi(s+2);
if(out < 1 || out > 4)
out = 0;
return(out);
}
#ifndef XFRACT
void (far *isfunct(char *Str, int Len))(void)
#else
void (*isfunct(Str, Len))()
char *Str;
int Len;
#endif
{
unsigned n;
int functnum; /* TIW 04-22-91 */
n = SkipWhiteSpace(&Str[Len]);
if(Str[Len+n] == '(') {
for(n = 0; n < sizeof(FnctList) / sizeof(struct FNCT_LIST); n++) {
if(far_strlen(FnctList[n].s) == Len) { /* TIW 03-31-91 added far */
if(!far_strnicmp(FnctList[n].s, Str, Len)) { /* TIW 03-31-91 added far */
/* count function variables */
if((functnum = whichfn(Str, Len)) != 0) /* TIW 04-22-91 */
if(functnum > maxfn) /* TIW 04-22-91 */
maxfn = (char)functnum; /* TIW 04-22-91 */
return(*FnctList[n].ptr);
}
}
}
return(FnctNotFound);
}
return(NotAFnct);
}
void RecSortPrec(void) {
int ThisOp = NextOp++;
while(o[ThisOp].p > o[NextOp].p && NextOp < posp)
RecSortPrec();
f[OpPtr++] = o[ThisOp].f;
}
static char *Constants[] = {
"pixel", /* v[0] */
"p1", /* v[1] */
"p2", /* v[2] */
"z", /* v[3] */
"LastSqr", /* v[4] */
"pi", /* v[5] */
"e", /* v[6] */
"rand", /* v[7] */
"p3", /* v[8] */
"whitesq", /* v[9] */
"scrnpix", /* v[10] */
"scrnmax", /* v[11] */
"maxit", /* v[12] */
};
struct SYMETRY {
char *s;
int n;
} SymStr[] = {
"NOSYM", 0,
"XAXIS_NOPARM", -1,
"XAXIS", 1,
"YAXIS_NOPARM", -2,
"YAXIS", 2,
"XYAXIS_NOPARM",-3,
"XYAXIS", 3,
"ORIGIN_NOPARM",-4,
"ORIGIN", 4,
"PI_SYM_NOPARM",-5,
"PI_SYM", 5,
"XAXIS_NOIMAG", -6,
"XAXIS_NOREAL", 6,
"NOPLOT", 99,
"", 0
};
static int ParseStr(char *Str, int pass) {
struct ConstArg far *c;
int ModFlag = 999, Len, Equals = 0, Mod[20], mdstk = 0;
int NewStatement;
struct ERROR { int n, s; } far *e;
double const_pi, const_e;
SetRandom = Randomized = 0;
e = (struct ERROR far *)farmemalloc(sizeof(struct ERROR) * 100L);
/* PB 910417 changed "o" to be a temporary alloc, during ParseStr only */
if(pass == 0)
o = (struct PEND_OP far *)
((char far *)typespecific_workarea + total_formula_mem-sizeof(struct PEND_OP) * Max_Ops);
else if(used_extra == 1)
o = (struct PEND_OP far *)
((char far *)typespecific_workarea + total_formula_mem-sizeof(struct PEND_OP) * Max_Ops);
else
o = (struct PEND_OP far *)farmemalloc(sizeof(struct PEND_OP) * (long)Max_Ops);
if(!e || !o || !typespecific_workarea) {
stopmsg(0,ParseErrs(INSUFFICIENT_MEM_FOR_TYPE_FORMULA));
return(1);
}
switch(MathType) {
case D_MATH:
StkAdd = dStkAdd;
StkSub = dStkSub;
StkNeg = dStkNeg;
StkMul = dStkMul;
StkSin = dStkSin;
StkSinh = dStkSinh;
StkLT = dStkLT;
StkLTE = dStkLTE;
StkMod = dStkMod;
StkSqr = dStkSqr;
StkCos = dStkCos;
StkCosh = dStkCosh;
StkLog = dStkLog;
StkExp = dStkExp;
StkPwr = dStkPwr;
StkDiv = dStkDiv;
StkAbs = dStkAbs;
StkReal = dStkReal;
StkImag = dStkImag;
StkConj = dStkConj;
StkTrig0 = dtrig0; /* TIW 03-30-91 */
StkTrig1 = dtrig1; /* TIW 03-30-91 */
StkTrig2 = dtrig2; /* TIW 03-30-91 */
StkTrig3 = dtrig3; /* TIW 03-30-91 */
StkFlip = dStkFlip;
StkTan = dStkTan; /* TIW 04-22-91 */
StkTanh = dStkTanh; /* TIW 04-22-91 */
StkCoTan = dStkCoTan; /* TIW 04-24-91 */
StkCoTanh = dStkCoTanh; /* TIW 04-24-91 */
StkCosXX = dStkCosXX; /* PB 04-28-91 */
StkGT = dStkGT; /* MCP 11-3-91 */
StkGTE = dStkGTE; /* MCP 11-3-91 */
StkEQ = dStkEQ; /* MCP 11-3-91 */
StkNE = dStkNE; /* MCP 11-3-91 */
StkAND = dStkAND; /* MCP 11-3-91 */
StkOR = dStkOR ; /* MCP 11-3-91 */
StkSRand = dStkSRand; /* MCP 11-21-91 */
StkASin = dStkASin; /* TIW 11-25-94 */
StkASinh = dStkASinh; /* TIW 11-25-94 */
StkACos = dStkACos; /* TIW 11-25-94 */
StkACosh = dStkACosh; /* TIW 11-25-94 */
StkATan = dStkATan; /* TIW 11-25-94 */
StkATanh = dStkATanh; /* TIW 11-25-94 */
StkCAbs = dStkCAbs; /* TIW 11-25-94 */
StkSqrt = dStkSqrt; /* TIW 11-25-94 */
StkZero = dStkZero; /* JCO 12-31-94 */
StkFloor = dStkFloor; /* TIW 06-30-96 */
StkCeil = dStkCeil; /* TIW 06-30-96 */
StkTrunc = dStkTrunc; /* TIW 06-30-96 */
StkRound = dStkRound; /* TIW 06-30-96 */
break;
#ifndef XFRACT
case M_MATH:
StkAdd = mStkAdd;
StkSub = mStkSub;
StkNeg = mStkNeg;
StkMul = mStkMul;
StkSin = mStkSin;
StkSinh = mStkSinh;
StkLT = mStkLT;
StkLTE = mStkLTE;
StkMod = mStkMod;
StkSqr = mStkSqr;
StkCos = mStkCos;
StkCosh = mStkCosh;
StkLog = mStkLog;
StkExp = mStkExp;
StkPwr = mStkPwr;
StkDiv = mStkDiv;
StkAbs = mStkAbs;
StkReal = mStkReal;
StkImag = mStkImag;
StkConj = mStkConj;
StkTrig0 = mtrig0; /* TIW 03-30-91 */
StkTrig1 = mtrig1; /* TIW 03-30-91 */
StkTrig2 = mtrig2; /* TIW 03-30-91 */
StkTrig3 = mtrig3; /* TIW 03-30-91 */
StkFlip = mStkFlip;
StkTan = mStkTan; /* TIW 04-22-91 */
StkTanh = mStkTanh;/* TIW 04-22-91 */
StkCoTan = mStkCoTan; /* TIW 04-24-91 */
StkCoTanh = mStkCoTanh;/* TIW 04-24-91 */
StkCosXX = mStkCosXX; /* PB 04-28-91 */
StkGT = mStkGT; /* MCP 11-3-91 */
StkGTE = mStkGTE; /* MCP 11-3-91 */
StkEQ = mStkEQ; /* MCP 11-3-91 */
StkNE = mStkNE; /* MCP 11-3-91 */
StkAND = mStkAND; /* MCP 11-3-91 */
StkOR = mStkOR ; /* MCP 11-3-91 */
StkSRand = mStkSRand; /* MCP 11-21-91 */
StkASin = mStkASin; /* TIW 11-25-94 */
StkACos = mStkACos; /* TIW 11-25-94 */
StkACosh = mStkACosh; /* TIW 11-25-94 */
StkATan = mStkATan; /* TIW 11-25-94 */
StkATanh = mStkATanh; /* TIW 11-25-94 */
StkCAbs = mStkCAbs; /* TIW 11-25-94 */
StkSqrt = mStkSqrt; /* TIW 11-25-94 */
StkZero = mStkZero; /* JCO 12-31-94 */
StkFloor = mStkFloor; /* TIW 06-30-96 */
StkCeil = mStkCeil; /* TIW 06-30-96 */
StkTrunc = mStkTrunc; /* TIW 06-30-96 */
StkRound = mStkRound; /* TIW 06-30-96 */
break;
case L_MATH:
Delta16 = bitshift - 16;
ShiftBack = 32 - bitshift; /* TW 06-18-90 */
StkAdd = lStkAdd;
StkSub = lStkSub;
StkNeg = lStkNeg;
StkMul = lStkMul;
StkSin = lStkSin;
StkSinh = lStkSinh;
StkLT = lStkLT;
StkLTE = lStkLTE;
if (save_release > 1826)
StkMod = lStkMod;
else
StkMod = lStkModOld;
StkSqr = lStkSqr;
StkCos = lStkCos;
StkCosh = lStkCosh;
StkLog = lStkLog;
StkExp = lStkExp;
StkPwr = lStkPwr;
StkDiv = lStkDiv;
StkAbs = lStkAbs;
StkReal = lStkReal;
StkImag = lStkImag;
StkConj = lStkConj;
StkTrig0 = ltrig0; /* TIW 03-30-91 */
StkTrig1 = ltrig1; /* TIW 03-30-91 */
StkTrig2 = ltrig2; /* TIW 03-30-91 */
StkTrig3 = ltrig3; /* TIW 03-30-91 */
StkFlip = lStkFlip;
StkTan = lStkTan; /* TIW 04-22-91 */
StkTanh = lStkTanh; /* TIW 04-22-91 */
StkCoTan = lStkCoTan; /* TIW 04-24-91 */
StkCoTanh = lStkCoTanh; /* TIW 04-24-91 */
StkCosXX = lStkCosXX; /* PB 04-28-91 */
StkGT = lStkGT; /* MCP 11-3-91 */
StkGTE = lStkGTE; /* MCP 11-3-91 */
StkEQ = lStkEQ; /* MCP 11-3-91 */
StkNE = lStkNE; /* MCP 11-3-91 */
StkAND = lStkAND; /* MCP 11-3-91 */
StkOR = lStkOR ; /* MCP 11-3-91 */
StkSRand = lStkSRand; /* MCP 11-21-91 */
StkASin = lStkASin; /* TIW 11-25-94 */
StkACos = lStkACos; /* TIW 11-25-94 */
StkACosh = lStkACosh; /* TIW 11-25-94 */
StkATan = lStkATan; /* TIW 11-25-94 */
StkATanh = lStkATanh; /* TIW 11-25-94 */
StkCAbs = lStkCAbs; /* TIW 11-25-94 */
StkSqrt = lStkSqrt; /* TIW 11-25-94 */
StkZero = lStkZero; /* JCO 12-31-94 */
StkFloor = lStkFloor; /* TIW 06-30-96 */
StkCeil = lStkCeil; /* TIW 06-30-96 */
StkTrunc = lStkTrunc; /* TIW 06-30-96 */
StkRound = lStkRound; /* TIW 06-30-96 */
break;
#endif
}
maxfn = 0; /* TIW 03-30-91 */
for(vsp = 0; vsp < sizeof(Constants) / sizeof(char*); vsp++) {
v[vsp].s = Constants[vsp];
v[vsp].len = strlen(Constants[vsp]);
}
const_pi = atan(1.0) * 4;
const_e = exp(1.0);
v[7].a.d.x = v[7].a.d.y = 0.0;
v[11].a.d.x = (double)xdots;
v[11].a.d.y = (double)ydots;
v[12].a.d.x = (double)maxit;
v[12].a.d.y = 0;
switch(MathType) {
case D_MATH:
v[1].a.d.x = param[0];
v[1].a.d.y = param[1];
v[2].a.d.x = param[2];
v[2].a.d.y = param[3];
v[5].a.d.x = const_pi;
v[5].a.d.y = 0.0;
v[6].a.d.x = const_e;
v[6].a.d.y = 0.0;
v[8].a.d.x = param[4];
v[8].a.d.y = param[5];
break;
#ifndef XFRACT
case M_MATH:
v[1].a.m.x = *d2MP(param[0]);
v[1].a.m.y = *d2MP(param[1]);
v[2].a.m.x = *d2MP(param[2]);
v[2].a.m.y = *d2MP(param[3]);
v[5].a.m.x = *d2MP(const_pi);
v[5].a.m.y = *d2MP(0.0);
v[6].a.m.x = *d2MP(const_e);
v[6].a.m.y = *d2MP(0.0);
v[8].a.m.x = *d2MP(param[4]);
v[8].a.m.y = *d2MP(param[5]);
v[11].a.m = cmplx2MPC(v[11].a.d);
v[12].a.m = cmplx2MPC(v[12].a.d);
break;
case L_MATH:
v[1].a.l.x = (long)(param[0] * fg);
v[1].a.l.y = (long)(param[1] * fg);
v[2].a.l.x = (long)(param[2] * fg);
v[2].a.l.y = (long)(param[3] * fg);
v[5].a.l.x = (long)(const_pi * fg);
v[5].a.l.y = 0L;
v[6].a.l.x = (long)(const_e * fg);
v[6].a.l.y = 0L;
v[8].a.l.x = (long)(param[4] * fg);
v[8].a.l.y = (long)(param[5] * fg);
v[11].a.l.x = xdots; v[11].a.l.x <<= bitshift;
v[11].a.l.y = ydots; v[11].a.l.y <<= bitshift;
v[12].a.l.x = maxit; v[12].a.l.x <<= bitshift;
v[12].a.l.y = 0L;
break;
#endif
}
LastInitOp = ErrPtr = paren = OpPtr = LodPtr = StoPtr = posp = 0;
NewStatement = 1;
SyntaxErr = -1;
ExpectingArg = 1;
for(n = 0; Str[n]; n++) {
if(!Str[n])
break;
InitN = n;
switch(Str[n]) {
case ' ':
case '\t':
case '\r':
case '\n':
break;
case '(':
paren++;
if(!ExpectingArg)
SyntaxErr = 1;
break;
case ')':
if(paren)
paren--;
else
SyntaxErr = 2;
if(ExpectingArg) {
e[ErrPtr].n = InitN;
e[ErrPtr++].s = 0;
}
break;
case '|':
if(Str[n+1] == '|') {
if(ExpectingArg)
SyntaxErr = 0;
ExpectingArg = 1;
n++;
o[posp].f = StkOR;
o[posp++].p = 7 - (paren + Equals)*15;
}
else if(ModFlag == paren-1) {
if(ExpectingArg)
SyntaxErr = 0;
paren--;
ModFlag = Mod[--mdstk];
}
else {
if(!ExpectingArg)
SyntaxErr = 1;
Mod[mdstk++] = ModFlag;
o[posp].f = StkMod;
o[posp++].p = 2 - (paren + Equals)*15;
ModFlag = paren++;
}
break;
case ',':
case ';':
if(paren) {
e[ErrPtr].n = InitN;
e[ErrPtr++].s = 3;
}
if(!ExpectingArg) {
NewStatement = 1;
ExpectingArg = 1;
o[posp].f = (void(far*)(void))0;
o[posp++].p = 15;
o[posp].f = StkClr;
o[posp++].p = -30000;
Equals = paren = 0;
}
else if(!NewStatement)
SyntaxErr = 0;
break;
case ':':
if(paren) {
e[ErrPtr].n = InitN;
e[ErrPtr++].s = 3;
}
if(ExpectingArg)
SyntaxErr = 0;
else
ExpectingArg = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -