/usr/include/gmsh/mathex.h is in libgmsh-dev 2.8.5+dfsg-1.1+b1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | ///////////////////////////////////////////////////////////////////////////
// mathex 0.2.3 (beta) - Copyright (C) 2000-2003, by Sadao Massago //
// file: mathex.h (math expression evaluator header file) //
// requires: none //
// project web page: http://sscilib.sourceforge.net/ //
//-----------------------------------------------------------------------//
// The mathex library and related files is licensed under the term of //
// GNU LGPL (Lesser General Public License) version 2.1 or latter //
// with exceptions that allow for static linking. //
// See license.txt for detail. //
// For GNU LGPL, see lesser.txt. //
// For information over GNU or GNU compatible license, visit the site //
// http://www.gnu.org. //
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// references:
//-------------------------------------------------------------------------
// title: Algoritms and Data Structures
// author: Niklaus Wirth
// publisher: Prentice-Hall
// year: 1989
//-------------------------------------------------------------------------
// title: The C++ programming language
// edition: thrird
// author: Bjarne Stroustrup
// publisher: Addilson-Wesley
// year: 1997
//-------------------------------------------------------------------------
// title: building your own C interpreter
// author: Schildt, Helbert
// journal: Dr. Dobb's Jornal (http://www.ddj.com)
// number: August/1989
// pages: 38-49, 110-122
///////////////////////////////////////////////////////////////////////////
// example file listing for doxygen
/// \example inttest.cpp
/// integration test using Trapezoidal rule
/// \example userfunctest.cpp
/// user defined function testing
/// \example tabletest.cpp
/// making table of function
/// \example curvetest.cpp
/// making table of parametric curve
// #define _DEBUG_
#ifndef _MATHEX_H
#define _MATHEX_H
#include <string>
#include <vector>
#include <cmath>
// #include <cctype>
// debug purpose
#ifdef _DEBUG_
#include <iostream>
#endif
namespace smlib {
using namespace std;
/////////////////////////////////////
// mathex main class
// it contain several sub classes
// to handle expressions
/////////////////////////////////////
class mathex {
/////////////////////////
// private sub calsses
////////////////////////
// code token used by evaluator
class CODETOKEN {
public:
// token type (code token type)
enum type {
VALUE=0, // numerical value stack
VARIABLE, // variable stack
FUNCTION, // internal C function with one parameters (include unary operators)
BINOP, // internal C binary opeartors (function with two parameters)
USERFUNC, // user defined functions
LASTTYPE=USERFUNC};
type state; // state of Token
unsigned numargs;
// The user defined function use it to pop values from stack
// In the undefined number of arguments case, it will not eliminated
double value; // numerical value
unsigned idx; // index of variable, function or user defined function on table
CODETOKEN(double x=0.0) // construct VALUE token
{
state = VALUE;
value = x;
}
CODETOKEN(type toktype, unsigned index, unsigned NumArgs=1) // construct token except VALUE
// in the used defined function case, num args need to set
{
state = toktype;
idx = index;
numargs = NumArgs;
}
}; // CODETOKEN
// parse token used by parser
class PARSERTOKEN {
public:
enum type {
VALUE, VARIABLE, FUNCTION, USERFUNC,
PLUS, MINUS, TIMES, DIVIDE, MODULE, POWER,
OPAREN, CPAREN, COMMA, END, INVALID, // invalid character on token
LASTTYPE=INVALID
};
type state;
int numargs; // number of parameters of functions
double value;
int idx; // it are signed because receive func/var search index that will be -1
// atom parsing cede optimization
}; // parsetoken
// function record
// Record for user defined functions
class FUNCREC {
public:
string name;
double (*f)(vector<double> const &x); // generic number of parameters
int numargs; // number of arguments
FUNCREC() // only for table (vector) operation
{name = ""; f = 0;}
FUNCREC(string const &funcname, double (*func)(vector<double> const &), int NumArgs)
{name = funcname; f = func; numargs = NumArgs; }
}; // FUNCREC
// variable record
class VARREC {
public:
string name;
double *var;
VARREC()
{name = ""; var = 0;}
VARREC(string const &varname, double *x)
{
if(x == NULL) throw error("Error [VARREC()]: variable without reference");
name = varname; var = x; }
}; // VARREC
/////////////////////
// evalmath start here
/////////////////////
vector<FUNCREC> functable; // used defined function table
vector<VARREC> vartable; // used defined variable table
vector<CODETOKEN> bytecode; // parsed code
vector<double> evalstack; // stack memory used by evaluator
string expr; // expression string
enum {invalid, notparsed, parsed} status; // prse status
// used by addvar/addfunc to validate new variable/functions name
bool isnewvalidname(string const &name); // check if new valid name
// table look up
int getconst(string const &name); // get index of constant
int getvar(string const &name); // get index of variable
int getcfunc(string const &name); // get index of one parameter internal C function
int getunaryop(string const &name); // get index of unary operator
int getbinop(char name); // get index of binary operator
int getuserfunc(string const &name); // get index of user defined functions
void addstdfunc(); // add standard user defined functions to table
// token operators
bool getnumber(double &x); // get number from input string
bool getidentifier(string &name); // get identifier from input string
PARSERTOKEN::type nexttoken(); // get next token from input string
vector<PARSERTOKEN> parserstack; // stack used by parser
PARSERTOKEN curtok; // current token. Used by parser
unsigned long pos; // expression parsing position
#ifdef _DEBUG_
void printcoderec(CODETOKEN const &token); // used by printbytecode()
#endif
// parser methods
// aritmethic operators
void parsearithmetic1(void); // binary plus/minus
void parsearithmetic2(void); // timed, divide, modulo
void parsearithmetic3(void); // power
void parsearithmetic4(void); // unary minus
void parseatom(void); // atom: functions, variables, numbers...
public:
///////////////////////
// public sub classes
///////////////////////
/// error class to hamdle exceptions
class error : public std::exception {
private:
string msg;
public:
/// with message only
error(string const &message)
{ msg = "Error [eval]: " + message; }
/// error with identifier and messages
error(string const &id, string const &message)
{ msg = "Error [mathex::" + id + "]: " + message; }
/// unkone error
error()
{ msg = "Error [mathex]: unkonw error"; }
/// return error message
const char * what() const throw()
{
return msg.c_str(); }
~error() throw() {}
}; // error
////////////////////////////////////////////////////
// mathex public constants, variables and methods
#ifdef _DEBUG_
void printbytecode(); // output byte code to cout
#endif
// add/delete variables
bool addvar(string const &name, double *x); /// < add new variable
bool delvar(string const &name); /// < delete variable
void delvar() /// < delete all variables
{vartable.clear(); status = notparsed; }
/// undefined number of arguments (for user defined functions
static const int UNDEFARGS; // for user function arguments
// add/delete used defined functions
bool addfunc(string const &name, double (*f)(vector<double> const &), int NumArgs); /// < add new function
bool delfunc(string const &name); /// < delete variable
void delfunc() /// < delete all variable
{functable.clear(); addstdfunc(); status=notparsed; }
// expression string
string const &expression() /// < return expression string
{
return expr;}
void expression(string const &formula) /// < set expression string
{ expr = formula; status = notparsed; pos=0; }
unsigned long stopposition() /// < return parser stoped position
{
return pos; }
void parse(); /// < parse expression
double eval(); /// < eval expression
void reset(); /// < reset all
mathex() /// < default constructor
{reset();}
mathex(string const &formula) /// < constructor that assign expression string
{reset(); expr = formula;}
}; /// mathex
} // namespace smlib {
#endif // #ifndef _MATHEX_H
// end of mathex.c
|