Subversion Repositories Scribus

Rev

Rev 2969 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
137 Franz 1
/***************************************************************************\
4078 fschmid 2
|* Function parser v2.8 by Warp                                            *|
638 fschmid 3
|* ----------------------------                                            *|
137 Franz 4
|* Parses and evaluates the given function with the given variable values. *|
4078 fschmid 5
|* See fparser.txt for details.                                            *|
137 Franz 6
|*                                                                         *|
7
\***************************************************************************/
8
 
9
#ifndef ONCE_FPARSER_H_
10
#define ONCE_FPARSER_H_
11
 
12
#include <string>
13
#include <map>
14
#include <vector>
638 fschmid 15
 
16
#ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT
137 Franz 17
#include <iostream>
638 fschmid 18
#endif
137 Franz 19
 
4078 fschmid 20
class FunctionParser
137 Franz 21
{
22
public:
23
    enum ParseErrorType
24
    {
25
        SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,
26
        EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS,
27
        ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC,
28
        FP_NO_ERROR
29
    };
30
 
31
 
32
    int Parse(const std::string& Function, const std::string& Vars,
33
              bool useDegrees = false);
34
    const char* ErrorMsg() const;
35
    inline ParseErrorType GetParseErrorType() const { return parseErrorType; }
36
 
37
    double Eval(const double* Vars);
38
    inline int EvalError() const { return evalErrorType; }
39
 
40
    bool AddConstant(const std::string& name, double value);
41
 
42
    typedef double (*FunctionPtr)(const double*);
43
 
44
    bool AddFunction(const std::string& name,
45
                     FunctionPtr, unsigned paramsAmount);
46
    bool AddFunction(const std::string& name, FunctionParser&);
47
 
48
    void Optimize();
49
 
50
 
51
    FunctionParser();
52
    ~FunctionParser();
53
 
54
    // Copy constructor and assignment operator (implemented using the
55
    // copy-on-write technique for efficiency):
56
    FunctionParser(const FunctionParser&);
57
    FunctionParser& operator=(const FunctionParser&);
58
 
59
 
638 fschmid 60
#ifdef FUNCTIONPARSER_SUPPORT_DEBUG_OUTPUT
137 Franz 61
    // For debugging purposes only:
62
    void PrintByteCode(std::ostream& dest) const;
638 fschmid 63
#endif
137 Franz 64
 
65
 
66
 
67
//========================================================================
68
private:
69
//========================================================================
70
 
71
// Private data:
72
// ------------
73
    ParseErrorType parseErrorType;
74
    int evalErrorType;
75
 
76
    struct Data
77
    {
78
        unsigned referenceCounter;
79
 
80
        int varAmount;
81
        bool useDegreeConversion;
82
 
83
        typedef std::map<std::string, unsigned> VarMap_t;
84
        VarMap_t Variables;
85
 
86
        typedef std::map<std::string, double> ConstMap_t;
87
        ConstMap_t Constants;
88
 
89
        VarMap_t FuncPtrNames;
90
        struct FuncPtrData
91
        {
92
            FunctionPtr ptr; unsigned params;
93
            FuncPtrData(FunctionPtr p, unsigned par): ptr(p), params(par) {}
94
        };
95
        std::vector<FuncPtrData> FuncPtrs;
96
 
97
        VarMap_t FuncParserNames;
98
        std::vector<FunctionParser*> FuncParsers;
99
 
100
        unsigned* ByteCode;
101
        unsigned ByteCodeSize;
102
        double* Immed;
103
        unsigned ImmedSize;
104
        double* Stack;
105
        unsigned StackSize;
106
 
107
        Data();
108
        ~Data();
109
        Data(const Data&);
110
 
111
        Data& operator=(const Data&); // not implemented on purpose
112
    };
113
 
114
    Data* data;
4078 fschmid 115
    unsigned evalRecursionLevel;
137 Franz 116
 
117
    // Temp data needed in Compile():
118
    unsigned StackPtr;
119
    std::vector<unsigned>* tempByteCode;
120
    std::vector<double>* tempImmed;
121
 
122
 
123
// Private methods:
124
// ---------------
4078 fschmid 125
    void copyOnWrite();
137 Franz 126
 
127
 
128
    bool checkRecursiveLinking(const FunctionParser*) const;
129
 
130
    bool isValidName(const std::string&) const;
131
    Data::VarMap_t::const_iterator FindVariable(const char*,
132
                                                const Data::VarMap_t&) const;
133
    Data::ConstMap_t::const_iterator FindConstant(const char*) const;
134
    int CheckSyntax(const char*);
135
    bool Compile(const char*);
136
    bool IsVariable(int);
137
    void AddCompiledByte(unsigned);
138
    void AddImmediate(double);
139
    void AddFunctionOpcode(unsigned);
140
    inline void incStackPtr();
141
    int CompileIf(const char*, int);
142
    int CompileFunctionParams(const char*, int, unsigned);
143
    int CompileElement(const char*, int);
144
    int CompilePow(const char*, int);
638 fschmid 145
    int CompileUnaryMinus(const char*, int);
137 Franz 146
    int CompileMult(const char*, int);
147
    int CompileAddition(const char*, int);
148
    int CompileComparison(const char*, int);
149
    int CompileAnd(const char*, int);
150
    int CompileOr(const char*, int);
151
    int CompileExpression(const char*, int, bool=false);
152
 
153
 
154
    void MakeTree(void*) const;
155
};
156
 
157
#endif