📄 parser.c
字号:
else
overflow = 1;
}
#endif
void (*StkLog)(void) = dStkLog;
void FPUcplxexp(_CMPLX *x, _CMPLX *z) {
double e2x, siny, cosy;
if(fpu == 387)
FPUcplxexp387(x, z);
else {
e2x = exp(x->x);
FPUsincos(&x->y, &siny, &cosy);
z->x = e2x * cosy;
z->y = e2x * siny;
}
}
void dStkExp(void) {
FPUcplxexp(&Arg1->d, &Arg1->d);
}
#ifndef XFRACT
void mStkExp(void) {
Arg1->d = MPC2cmplx(Arg1->m);
FPUcplxexp(&Arg1->d, &Arg1->d);
Arg1->m = cmplx2MPC(Arg1->d);
}
void lStkExp(void) {
_CMPLX x;
x.x = (double)Arg1->l.x / fg;
x.y = (double)Arg1->l.y / fg;
FPUcplxexp(&x, &x);
if(fabs(x.x) < fgLimit && fabs(x.y) < fgLimit) {
Arg1->l.x = (long)(x.x * fg);
Arg1->l.y = (long)(x.y * fg);
}
else
overflow = 1;
}
#endif
void (*StkExp)(void) = dStkExp;
void dStkPwr(void) {
Arg2->d = ComplexPower(Arg2->d, Arg1->d);
Arg1--;
Arg2--;
}
#ifndef XFRACT
void mStkPwr(void) {
_CMPLX x, y;
x = MPC2cmplx(Arg2->m);
y = MPC2cmplx(Arg1->m);
x = ComplexPower(x, y);
Arg2->m = cmplx2MPC(x);
Arg1--;
Arg2--;
}
void lStkPwr(void) {
_CMPLX x, y;
x.x = (double)Arg2->l.x / fg;
x.y = (double)Arg2->l.y / fg;
y.x = (double)Arg1->l.x / fg;
y.y = (double)Arg1->l.y / fg;
x = ComplexPower(x, y);
if(fabs(x.x) < fgLimit && fabs(x.y) < fgLimit) {
Arg2->l.x = (long)(x.x * fg);
Arg2->l.y = (long)(x.y * fg);
}
else
overflow = 1;
Arg1--;
Arg2--;
}
#endif
void (*StkPwr)(void) = dStkPwr;
void EndInit(void) {
LastInitOp = OpPtr;
}
struct ConstArg far *isconst(char *Str, int Len) {
_CMPLX z;
unsigned n, j;
for(n = 0; n < vsp; n++) {
if(v[n].len == Len) {
if(!strnicmp(v[n].s, Str, Len))
{
if(n == 7) /* The formula uses 'rand'. */
RandomSeed();
return(&v[n]);
}
}
}
v[vsp].s = Str;
v[vsp].len = Len;
v[vsp].a.d.x = v[vsp].a.d.y = 0.0;
if(isdigit(Str[0]) || 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]))) {
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 */
extern BYTE trigndx[];
#if 0
extern void (*ltrig0)(void);
extern void (*ltrig1)(void);
extern void (*ltrig2)(void);
extern void (*ltrig3)(void);
extern void (*dtrig0)(void);
extern void (*dtrig1)(void);
extern void (*dtrig2)(void);
extern void (*dtrig3)(void);
extern void (*mtrig0)(void);
extern void (*mtrig1)(void);
extern void (*mtrig2)(void);
extern void (*mtrig3)(void);
#endif
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 */
"sin", &StkSin,
"sinh", &StkSinh,
"cos", &StkCos,
"cosh", &StkCosh,
"sqr", &StkSqr,
"log", &StkLog,
"exp", &StkExp,
"abs", &StkAbs,
"conj", &StkConj,
"real", &StkReal,
"imag", &StkImag,
"fn1", &StkTrig0, /* TIW 03-30-91 */
"fn2", &StkTrig1, /* TIW 03-30-91 */
"fn3", &StkTrig2, /* TIW 03-30-91 */
"fn4", &StkTrig3, /* TIW 03-30-91 */
"flip", &StkFlip, /* MCP 4-9-91 */
"tan", &StkTan, /* TIW 04-22-91 */
"tanh", &StkTanh, /* TIW 04-22-91 */
"cotan", &StkCoTan, /* TIW 04-24-91 */
"cotanh", &StkCoTanh,/* TIW 04-24-91 */
"cosxx", &StkCosXX, /* PB 04-28-91 */
"srand", &StkSRand, /* MCP 11-21-91 */
};
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 = 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] */
"xy", /* v[5] */
"zt", /* v[6] */
"rand", /* v[7] */
};
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,
"NOPLOT", 99,
"", 0
};
int ParseStr(char *Str) {
struct ConstArg far *c;
int ModFlag = 999, Len, Equals = 0, Mod[20], mdstk = 0;
int NewStatement;
struct ERROR { int n, s; } far *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 */
o = (struct PEND_OP far *)farmemalloc(sizeof(struct PEND_OP) * (long)MAX_OPS);
if(!e || !o || !typespecific_workarea) {
static char far msg[]={"Insufficient memory to run fractal type 'formula'"};
stopmsg(0,msg);
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 */
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 */
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;
StkMod = lStkMod;
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 */
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]);
}
v[6].a.d.x = v[6].a.d.y = 0.0;
v[7].a = v[6].a;
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];
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]);
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);
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;
o[posp].f = (void(far*)(void))0;
o[posp++].p = 15;
o[posp].f = EndInit;
o[posp++].p = -30000;
Equals = paren = 0;
LastInitOp = 10000;
NewStatement = 1;
break;
case '+':
if(ExpectingArg)
SyntaxErr = 0;
ExpectingArg = 1;
o[posp].f = StkAdd;
o[posp++].p = 4 - (paren + Equals)*15;
break;
case '-':
if(ExpectingArg) {
o[posp].f = StkNeg;
o[posp++].p = 2 - (paren + Equals)*15;
}
else {
o[posp].f = StkSub;
o[posp++].p = 4 - (paren + Equals)*15;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -