#ifndef __COMPLEXTYPES_H #define __COMPLEXTYPES_H #include #include #include #include #include #include "globals.h" #include "../libskindesignerapi/tokencontainer.h" class cLoopInfo; class cFunction; /****************************************************************** * helpers ******************************************************************/ char *RemoveSpace(char *e); void ReplaceDecimalpoint(char *e); void ReplaceStart(char *e, int num); void ReplaceEnd(char *e, int num); /****************************************************************** * cCondition ******************************************************************/ enum class eCondOp { tAnd, tOr }; enum class eCondType { token, negtoken, lowerInt, equalInt, greaterInt, isset, empty, equalString, notEqualString, contains, notContains }; enum class eCondTokenType { inttoken, stringtoken, looptoken }; class cCond : public cListObject { public: cCond(const char *expression); cCond(const cCond &other); virtual ~cCond(void); void Debug(void); char *expr; eCondOp operation; eCondType type; eCondTokenType tokenType; bool constant; bool isTrue; int tokenIndex; int compareValue; char *compareStrValue; }; class cCondition { private: char *expr; cGlobals *globals; skindesignerapi::cTokenContainer *tokenContainer; cLoopInfo *loopInfo; cList conds; void Tokenize(void); void PrepareTokens(void); void SetTokenCond(cCond *c); void SetIntegerCond(cCond *c); void SetStringCond(cCond *c); void SetStringCompareCond(cCond *c); void SetTokenIndex(cCond *c, const char *token); public: cCondition(const char *expression); cCondition(const cCondition &other); virtual ~cCondition(void); void SetGlobals(cGlobals *globals) { this->globals = globals; }; void SetTokenContainer(skindesignerapi::cTokenContainer *tokenContainer) {this->tokenContainer = tokenContainer; }; void SetLoopInfo(cLoopInfo *loopInfo) { this->loopInfo = loopInfo; }; void Prepare(void); bool True(void); void Debug(void); }; /****************************************************************** * cNumericExpr ******************************************************************/ enum class eFactorType { constant = 0, stringtoken, inttoken, looptoken, xref, yref, widthref, heightref, areawidth, areaheight, columnwidth, rowheight }; class cFactor: public cListObject { public: cFactor(void) { multiplication = true; type = eFactorType::constant; constValue = 1.0f; tokenIndex = -1; funcRefName = NULL; funcRef = NULL; }; cFactor(const cFactor &other) { multiplication = other.multiplication; type = other.type; constValue = other.constValue; tokenIndex = other.tokenIndex; funcRefName = NULL; if (other.funcRefName) funcRefName = strdup(other.funcRefName); funcRef = other.funcRef; } ~cFactor(void) { free(funcRefName); }; bool multiplication; eFactorType type; double constValue; int tokenIndex; char *funcRefName; cFunction *funcRef; }; class cSummand : public cListObject { public: cSummand(const char *summand); cSummand(const cSummand &other); ~cSummand(void); void Debug(void); char *summand; bool positive; cList factors; }; class cNumericExpr { private: cGlobals *globals; cRect *container; skindesignerapi::cTokenContainer *tokenContainer; cLoopInfo *loopInfo; char *expr; cList summands; bool horizontal; int value; bool dynamic; //common string functions bool IsNumeric(const char *e); bool IsNumericExpression(const char *e); bool PercentValue(const char *e); char *ReplacePercentValue(char *e); char *ReplaceToken(char *e, const char* token, int value); char *ReplaceTokens(char *e, const char* token, int value); //calculate numeric expressions int EvaluateExpression(char *e); double EvaluateExpressionDouble(char *e); double ParseAtom(char*& e); double ParseFactors(char*& e); double ParseSummands(char*& e); //prepare expressions with tokens void CreateSummands(void); void CreateFactors(void); bool SetTokenFactor(cFactor *f, char *tokenName); bool SetReferenceFactor(cFactor *f, char *tokenName); bool SetGeometryFactor(cFactor *f, char *tokenName); void ConsolidateSummand(void); void ConsolidateFactors(void); public: cNumericExpr(const char *expression); cNumericExpr(const cNumericExpr &other); virtual ~cNumericExpr(void); void SetContainer(cRect *container) { this->container = container; }; void SetGlobals(cGlobals *globals) { this->globals = globals; }; void SetTokenContainer(skindesignerapi::cTokenContainer *tokenContainer) { this->tokenContainer = tokenContainer; }; void SetLoopInfo(cLoopInfo *loopInfo) { this->loopInfo = loopInfo; }; void SetVertical(void) { horizontal = false; }; bool CacheStatic(void); void PrepareTokens(void); vector GetRefFactors(void); int GetValue(void) { return value; }; bool Dynamic(void) { return dynamic; }; int Calculate(void); void Debug(void); }; /****************************************************************** * cColor ******************************************************************/ class cColor { private: cGlobals *globals; char *expr; tColor value; public: cColor(const char *expression); cColor(const cColor &other); virtual ~cColor(void); void SetGlobals(cGlobals *globals) { this->globals = globals; }; void Cache(void); tColor Color(void); void Debug(void); }; /****************************************************************** * cTextExpr ******************************************************************/ enum class eTexttokenType { constant = 0, stringtoken, inttoken, looptoken, printftoken, condstringtoken, condinttoken, }; enum class ePrintfVarType { stringtoken, inttoken, looptoken }; struct sPrintfInfo { ePrintfVarType type; int index; }; class cTextToken: public cListObject { public: cTextToken(void) { type = eTexttokenType::constant; constValue = NULL; printfExpr = NULL; printfResult = NULL; tokenIndex = -1; condStart = NULL; condEnd = NULL; }; cTextToken(const cTextToken &other) { type = other.type; constValue = NULL; if (other.constValue) constValue = strdup(other.constValue); printfExpr = NULL; if (other.printfExpr) printfExpr = strdup(other.printfExpr); printfVarIndices = other.printfVarIndices; printfResult = NULL; if (other.printfResult) printfResult = strdup(other.printfResult); tokenIndex = other.tokenIndex; condStart = NULL; if (other.condStart) condStart = strdup(other.condStart); condEnd = NULL; if (other.condEnd) condEnd = strdup(other.condEnd); }; ~cTextToken(void) { free(constValue); free(printfExpr); }; eTexttokenType type; char *constValue; int tokenIndex; char *printfExpr; vector printfVarIndices; char *printfResult; char *condStart; char *condEnd; }; class cTextExpr { private: cGlobals *globals; skindesignerapi::cTokenContainer *tokenContainer; cLoopInfo *loopInfo; char *expr; cList textTokens; void Translate(void); void Tokenize(void); void PrepareTokens(void); bool CheckGlobals(cTextToken *t); bool ParsePrintfToken(cTextToken *t); void DeterminatePrintfToken(cTextToken *t); void ParseCondToken(cTextToken *t); char *CopyTextPart(char *start, char *stop, bool incLastChar= true); public: cTextExpr(const char *expression); cTextExpr(const cTextExpr &other); virtual ~cTextExpr(void); void SetGlobals(cGlobals *globals) { this->globals = globals; }; void SetTokenContainer(skindesignerapi::cTokenContainer *tokenContainer) { this->tokenContainer = tokenContainer; }; void SetLoopInfo(cLoopInfo *loopInfo) { this->loopInfo = loopInfo; }; void CorrectImagePath(void); void Cache(void); char *DeterminateText(void); void Debug(const char *exprName); }; #endif //__COMPLEXTYPES_H