diff options
Diffstat (limited to 'kicker-applets/math/parser.h')
-rw-r--r-- | kicker-applets/math/parser.h | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/kicker-applets/math/parser.h b/kicker-applets/math/parser.h new file mode 100644 index 0000000..44e82ba --- /dev/null +++ b/kicker-applets/math/parser.h @@ -0,0 +1,241 @@ +/* +* Code based on parser from KmPlot - a math. function plotter for the KDE-Desktop +* +* Original code +* Copyright (C) 1998, 1999 Klaus-Dieter Möller +* 2000, 2002 kd.moeller@t-online.de +* +* Modifications: 2004 Andrew Coles (andrew_coles@yahoo.co.uk) +* +* This file is part of the KDE Project. +* KmPlot is part of the KDE-EDU Project. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +* +*/ + +/** @file parser.h + * \brief Contains the parser core class Parser. */ + +// Qt includes +#include <qstring.h> +#include <qvaluevector.h> + +#ifndef parser_included +#define parser_included + +// Voreinstellungen bei Verwendung des Standardkonstruktors : + + +#define UFANZ 10 ///< max. count of user defined functions +#define MEMSIZE 200 ///< memory size for tokens +#define STACKSIZE 50 ///< stack depth + +//@{ +/** Token type. */ +#define KONST 0 // double value follows +#define XWERT 1 // get x value +#define KWERT 2 // get function parameter +#define PUSH 3 // push value to stack +#define PLUS 4 // add +#define MINUS 5 // subtract +#define MULT 6 // multiply +#define DIV 7 // divide +#define POW 8 // exponentiate +#define NEG 9 // negate +#define FKT 10 // address to function followes +#define UFKT 11 // address to user defined function follows +#define ENDE 12 // end of function +#define YWERT 13 // get y value +#define FANZ 31 // number of mathematical functions in mfkttab[] +//@} + +//@{ +/** Predefined mathematical function. */ +double sign(double x); +double sqr(double x); +double arsinh(double x); +double arcosh(double x); +double artanh(double x); + +double sec(double x); +double cosec(double x); +double cot(double x); +double arcsec(double x); +double arccosec(double x); +double arccot(double x); + +double sech(double x); +double cosech(double x); +double coth(double x); +double arsech(double x); +double arcosech(double x); +double arcoth(double x); + +double lcos(double x); +double lsin(double x); +double ltan(double x); + +double lcosh(double x); +double lsinh(double x); +double ltanh(double x); + +double arccos(double x); +double arcsin(double x); +double arctan(double x); + +//@} + +class Constant +{ +public: + Constant( char c='A', double v=0) + { + constant = c; + value = v; + } + + char constant; + double value; +}; + +/** @short Parser. + * + * Tokenizes a function equation to be evaluated. + */ +class Parser +{ +public: + + Parser(); + Parser(int, int, int); + + ~Parser(); + + /// Evaluates the given expression. + double eval(QString); + /// Evaluates the function with the given name at the position. + double fkt(QString, double); + /// Evaluates the function with the given index at the position. + double fkt(int ix, double x) {return ufkt[ix].fkt(x);} + /// Adds a user defined function with the given equation. + int addfkt(QString); + /// Removes the function with the given name. + int delfkt(QString); + /// Removes the function with the given index. + int delfkt(int); + /// Returns name and expression of the function with the given index. + int getfkt(int, QString&, QString&); + /// Checks, if at the given index a function is stored. + int chkfix(int); + /// Returns the index of the function with the given name. + int getfix(QString); + /// Returns the lowest index in the array of user defined functions which is empty, + /// or -1, if the array is full. + int getNextIndex(); + /// Shows an error message box. + int errmsg(); + /// ? + void setparameter(int ix, double k) {ufkt[ix].k=k;} + /// return the angletype + static double anglemode(); + /// sets the angletype. TRUE is radians and FALSE degrees + void setAngleMode(int); + + QValueVector<Constant> constant; + + /// Error codes. + /** + * The values have following meanings: + * \li 0 => parse success + * \li 1 => syntax error + * \li 2 => missing bracket + * \li 3 => function unknown + * \li 4 => function variable not valid + * \li 5 => too much functions + * \li 6 => memory overflow + * \li 7 => stack overflow + * \li 8 => function name allready used + * \li 9 => recursive function call + * \li 10 => didn't found the wanted constant + * \li 11 => emtpy function + */ + int err, + errpos, ///< Position where the error occured. + ufanz; ///< Max. count of user defined functions. + + + /** User function. */ + class Ufkt + { + public: + Ufkt(); + ~Ufkt(); + double fkt(double); ///< User defined function. + + unsigned char *mem; ///< Pointer to the allocated memory for the tokens. + unsigned char *mptr; ///< Pointer to the token. + QString fname; ///< Name of the function. + QString fvar; ///< Dummy variable. + QString fpar; ///< Parameter. + QString fstr; ///< Function expression. + int memsize; ///< Size of token memory + int stacksize; ///< Size of the stack. + double k, ///< Function parameter. + oldy; ///< The last y-value needed for Euler's method + } + *ufkt; ///< Points to the array of user defined functions. + +protected: + /** Mathematical function. */ + struct Mfkt + { + const char *mfstr; + double (*mfadr)(double); + }; + static Mfkt mfkttab[FANZ]; + +//private: +public: + + void ps_init(int, int, int), + heir1(), + heir2(), + heir3(), + heir4(), + primary(), + addtoken(unsigned char), + addwert(double), + addfptr(double(*)(double)), + addfptr(Ufkt*); + int match(const char*); + + unsigned + char evalflg, // 0 => String wird tokenisiert + // 1 => String wird direkt ausgewertet + *mem, // Zeiger auf Speicher fr Token + *mptr; // Zeiger fr Token + const + char *lptr; // Zeiger fr Funktions-String + int memsize, // Gr�e des Tokenspeichers + stacksize, // Gr�e des Stack + ixa; // Index der aktuellen Funktion + double *stack, // Zeiger auf Stackanfang + *stkptr; // Stackpointer + static double m_anglemode; + +}; + +#endif // parser_included |