home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best Objectech Shareware Selections
/
UNTITLED.iso
/
boss
/
grap
/
util
/
010
/
parserfp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-28
|
36KB
|
1,199 lines
/* */
/* PARSERFP.C -- Part of FRACTINT fractal drawer. */
/* */
/* By Chuck Ebbert CompuServe [76306,1226] */
/* internet: 76306.1226@compuserve.com */
/* */
/* Fast floating-point parser code. The functions beginning with */
/* "fStk" are in PARSERA.ASM. PARSER.C calls this code after */
/* it has parsed the formula. */
/* */
/* Converts the function pointers/load pointers/store pointers */
/* built by parsestr() into an optimized array of function */
/* pointer/operand pointer pairs. */
/* */
/* ******************************************************************* */
/* */
/* (C) 1992, 1993 Chuck Ebbert. All rights reserved. */
/* */
/* This code may be freely distributed and used in non-commercial */
/* programs provided the author is credited either during program */
/* execution or in the documentation, and this copyright notice */
/* is left intact. Sale of this code, or its use in any commercial */
/* product requires permission from the author. Nominal */
/* distribution and handling fees may be charged by shareware and */
/* freeware distributors. */
/* */
/* Chuck Ebbert */
/* 1915 Blust Ln. */
/* Enola, PA 17025 */
/* */
/* ******************************************************************* */
/* */
/* Revised 22 MAR 1993 */
/* */
/* Uncomment the next line to enable debug. */
/* #define TESTFP 1 */
/* */
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <time.h>
#include "mpmath.h"
#include "prototyp.h"
extern union Arg *Arg1, *Arg2;
/* Some of these variables should be renamed for safety */
extern union Arg s[20], far * far *Store, far * far *Load;
extern int StoPtr, LodPtr, OpPtr;
extern int debugflag;
extern unsigned vsp, LastOp;
extern struct ConstArg far *v;
extern int inside; /* "inside" color to use */
extern int outside; /* "outside" color to use */
extern int potflag; /* potential enabled? */
extern char useinitorbit;
extern int InitLodPtr, InitStoPtr, InitOpPtr, LastInitOp;
extern void (far * far *f)(void);
struct fls { /* function, load, store pointers CAE fp */
void (near *function)(void);
union Arg near *operand;
} far *pfls = (struct fls far *)0;
void StkLod(void);
void StkClr(void);
void dStkAdd(void);
void dStkSub(void);
void dStkMul(void);
void dStkDiv(void);
void StkSto(void);
void dStkSqr(void);
void EndInit(void);
void dStkMod(void);
void dStkLTE(void);
void dStkSin(void);
void dStkCos(void);
void dStkSinh(void);
void dStkCosh(void);
void dStkCosXX(void);
void dStkTan(void);
void dStkTanh(void);
void dStkCoTan(void);
void dStkCoTanh(void);
void dStkLog(void);
void dStkExp(void);
void dStkPwr(void);
void dStkLT(void);
void dStkFlip(void);
void dStkReal(void);
void dStkImag(void);
void dStkConj(void);
void dStkNeg(void);
void dStkAbs(void);
void dStkRecip(void);
void StkIdent(void);
void dStkGT(void);
void dStkGTE(void);
void dStkNE(void);
void dStkEQ(void);
void dStkAND(void);
void dStkOR(void);
#define fgf(x) pfls[(x)].function
#define opp(x) pfls[(x)].operand
#define NO_OPERAND (void near *)0
#define LastSqr v[4].a
#define MAX_ARGS 100
#define MAX_STACK 8
#define TWO_FREE 6
#ifndef XFRACT
void (near fStkPull2 )(void); /* pull up fpu stack from 2 to 4 */
void (near fStkPush2 )(void); /* push down fpu stack from 8 to 6 */
void (near fStkPush2a )(void); /* push down fpu stack from 6 to 4 */
void (near fStkPush4 )(void); /* push down fpu stack from 8 to 4 */
void (near fStkLodDup )(void); /* lod, dup */
void (near fStkLodSqr )(void); /* lod, sqr, dont save magnitude */
void (near fStkLodSqr2 )(void); /* lod, sqr, save magnitude */
void (near fStkStoDup )(void); /* store, duplicate */
void (near fStkStoSqr )(void); /* store, sqr, save lastsqr */
void (near fStkStoSqr0 )(void); /* store, sqr, dont save lastsqr */
void (near fStkLodDbl )(void); /* load, double */
void (near fStkStoDbl )(void); /* store, double */
void (near fStkReal2 )(void); /* fast ver. of real */
void (near fStkSqr )(void); /* sqr, save magnitude in lastsqr */
void (near fStkSqr0 )(void); /* sqr, no save magnitude */
void (near fStkClr1 )(void); /* clear fpu */
void (near fStkClr2 )(void); /* test stack top, clear fpu */
void (near fStkStoClr1 )(void); /* store, clr1 */
void (near fStkAdd )(void);
void (near fStkSub )(void);
void (near fStkSto )(void);
void (near fStkSto2 )(void); /* fast ver. of sto */
void (near fStkLod )(void);
void (near fStkEndInit )(void);
void (near fStkMod )(void);
void (near fStkMod2 )(void);
void (near fStkLodMod2 )(void);
void (near fStkStoMod2 )(void);
void (near fStkLTE )(void);
void (near fStkLodLTEMul )(void);
void (near fStkLTE2 )(void);
void (near fStkLodLTE )(void);
void (near fStkLodLTE2 )(void);
void (near fStkLodLTEAnd2 )(void);
void (near fStkLT )(void);
void (near fStkLodLTMul )(void);
void (near fStkLT2 )(void);
void (near fStkLodLT )(void);
void (near fStkLodLT2 )(void);
void (near fStkGTE )(void);
void (near fStkLodGTE )(void);
void (near fStkLodGTE2 )(void);
void (near fStkGT )(void);
void (near fStkGT2 )(void);
void (near fStkLodGT )(void);
void (near fStkLodGT2 )(void);
void (near fStkEQ )(void);
void (near fStkLodEQ )(void);
void (near fStkNE )(void);
void (near fStkLodNE )(void);
void (near fStkAND )(void);
void (near fStkANDClr2 )(void);
void (near fStkOR )(void);
void (near fStkSin )(void);
void (near fStkSinh )(void);
void (near fStkCos )(void);
void (near fStkCosXX )(void);
void (near fStkCosh )(void);
void (near fStkTan )(void);
void (near fStkTanh )(void);
void (near fStkCoTan )(void);
void (near fStkCoTanh )(void);
void (near fStkLog )(void);
void (near fStkExp )(void);
void (near fStkPwr )(void);
void (near fStkMul )(void);
void (near fStkDiv )(void);
void (near fStkFlip )(void);
void (near fStkReal )(void);
void (near fStkImag )(void);
void (near fStkRealFlip )(void);
void (near fStkImagFlip )(void);
void (near fStkConj )(void);
void (near fStkNeg )(void);
void (near fStkAbs )(void);
void (near fStkRecip )(void);
void (near fStkLodReal )(void);
void (near fStkLodRealC )(void);
void (near fStkLodImag )(void);
void (near fStkLodRealFlip )(void);
void (near fStkLodRealAbs )(void);
void (near fStkLodRealMul )(void);
void (near fStkLodRealAdd )(void);
void (near fStkLodRealSub )(void);
void (near fStkLodImagFlip )(void);
void (near fStkLodImagAbs )(void);
void (near fStkLodConj )(void);
void (near fStkLodAdd )(void);
void (near fStkLodSub )(void);
void (near fStkLodSubMod )(void);
void (near fStkLodMul )(void);
void (near fStkPLodAdd )(void);
void (near fStkPLodSub )(void);
void (near Img_Setup )(void);
static void (near *prevfptr )(void);
static int stkcnt, prevstkcnt, cvtptrx, prevlodptr, lastsqrused;
static void CvtFptr(void (near * ffptr)(void), int MinStk, int MaxStk,
int Delta )
/* (MinStk <= 4, MaxStk >= TWO_FREE) */
{
char testconst = 0;
if (stkcnt < MinStk ) { /* not enough operands on fpu stack */
#ifdef TESTFP
stopmsg(0, "Inserted pull." );
#endif
opp(cvtptrx) = NO_OPERAND;
fgf(cvtptrx++) = fStkPull2; /* so adjust the stack, pull operand */
stkcnt += 2;
}
else if (stkcnt > MaxStk ) { /* too many operands */
#ifdef TESTFP
stopmsg(0, "Inserted push." );
#endif
opp(cvtptrx) = NO_OPERAND;
fgf(cvtptrx++) = fStkPush2; /* push operand to adjust stack */
stkcnt -= 2;
}
/* set t