diff --git a/bazaar/Functions4U/Functions4U.cpp b/bazaar/Functions4U/Functions4U.cpp index ca6951216..3207d819e 100644 --- a/bazaar/Functions4U/Functions4U.cpp +++ b/bazaar/Functions4U/Functions4U.cpp @@ -492,7 +492,6 @@ bool TrashBinClear() { #include #include -// This system files are like pipes: it is not possible to get the length to size the buffer String LoadFile_Safe(const String fileName) { #ifdef PLATFORM_POSIX @@ -501,7 +500,7 @@ String LoadFile_Safe(const String fileName) int fid = _wopen(fileName.ToWString(), O_RDONLY|O_BINARY); #endif if (fid < 0) - return String(""); + return String(); const int size = 1024; int nsize; StringBuffer s; @@ -514,6 +513,35 @@ String LoadFile_Safe(const String fileName) return s; } +String LoadFile(const char *fileName, off_t from, size_t len) +{ +#ifdef PLATFORM_POSIX + int fid = open(fileName, O_RDONLY); +#else + int fid = _wopen(String(fileName).ToWString(), O_RDONLY|O_BINARY); +#endif + if (fid < 0) + return String(); + if (0 > lseek(fid, from, SEEK_SET)) + return String(); + size_t size = 1024; + if (len != 0 && size > len) + size = len; + int nsize; + StringBuffer s; + Buffer buf(size); + size_t loaded; + for (loaded = 0; (nsize = read(fid, buf, size)) == size && (len == 0 || loaded < len); loaded += nsize) { + if (len != 0 && loaded + size > len) + size = len - loaded; + s.Cat(buf, size); + } + if (nsize > 1 && (len == 0 || loaded < len)) + s.Cat(buf, nsize-1); + close(fid); + return s; +} + String GetExtExecutable(const String _ext) { String ext = _ext; diff --git a/bazaar/Functions4U/Functions4U.h b/bazaar/Functions4U/Functions4U.h index ad11fbf59..b839c7aae 100644 --- a/bazaar/Functions4U/Functions4U.h +++ b/bazaar/Functions4U/Functions4U.h @@ -71,6 +71,7 @@ bool SetReadOnly(const char *path, bool usr, bool grp, bool oth); bool IsReadOnly(const char *path, bool &usr, bool &grp, bool &oth); String LoadFile_Safe(const String fileName); +String LoadFile(const char *fileName, off_t from, size_t len = 0); int64 GetLength(const char *fileDirName); int64 GetDirectoryLength(const char *directoryName); diff --git a/bazaar/Functions4U/Functions4U_Gui.h b/bazaar/Functions4U/Functions4U_Gui.h index 7d5092261..8714ff71d 100644 --- a/bazaar/Functions4U/Functions4U_Gui.h +++ b/bazaar/Functions4U/Functions4U_Gui.h @@ -34,18 +34,24 @@ QtfRichObject QtfEquation(const String &str); Image NativePathIconX(const char *path, bool folder, int flags = 0); +class CParserPlus : public CParser { +public: + CParserPlus(const char *ptr) : CParser(ptr) {} + String ReadIdPlus() throw(Error); +}; + class EquationDraw { public: EquationDraw(); - Drawing Exp(CParser& p); + Drawing Exp(CParserPlus& p); static Drawing Text(String text, bool italic = true, int offsetX=0, int offsetY=0, double betw = 1); private: String ReplaceSymbols(String var); - Drawing Term(CParser& p, bool noBracket = false); - String TermTrig(CParser& p); - Drawing Mul(CParser& p); + Drawing Term(CParserPlus& p, bool noBracket = false); + String TermTrig(CParserPlus& p); + Drawing Mul(CParserPlus& p); private: static Drawing Bracket(Drawing &data); diff --git a/bazaar/Functions4U/QtfEquation.cpp b/bazaar/Functions4U/QtfEquation.cpp index 15bbbef82..bf683a24f 100644 --- a/bazaar/Functions4U/QtfEquation.cpp +++ b/bazaar/Functions4U/QtfEquation.cpp @@ -7,8 +7,24 @@ NAMESPACE_UPP -Drawing EquationDraw::Text(String text, bool italic, int offsetX, int offsetY, double betw) -{ +inline bool iscidplus(int c) { + return iscib(c) || c == '.' || c >= '0' && c <= '9'; +} + +String CParserPlus::ReadIdPlus() throw(Error) { + if(!IsId()) + ThrowError("missing id"); + String result; + const char *b = term; + const char *p = b; + while(iscidplus(*p)) + p++; + term = p; + DoSpaces(); + return String(b, (int)(uintptr_t)(p - b)); +} + +Drawing EquationDraw::Text(String text, bool italic, int offsetX, int offsetY, double betw) { Font fnt; int _pos1, _pos2; @@ -40,8 +56,7 @@ Drawing EquationDraw::Text(String text, bool italic, int offsetX, int offsetY, d return dw; } -Drawing EquationDraw::SubSup(Drawing &drwText, Drawing &drwSub, Drawing &drwSup) -{ +Drawing EquationDraw::SubSup(Drawing &drwText, Drawing &drwSub, Drawing &drwSup) { Size szText = drwText.GetSize(); Size szSub = (2/3.)*drwSub.GetSize(); Size szSup = (2/3.)*drwSup.GetSize(); @@ -58,8 +73,7 @@ Drawing EquationDraw::SubSup(Drawing &drwText, Drawing &drwSub, Drawing &drwSup) return dw; } -Drawing EquationDraw::SubSup(String text, String sub, String sup) -{ +Drawing EquationDraw::SubSup(String text, String sub, String sup) { Drawing textdraw = Text(text, true); Drawing subdraw = Text(sub, true); Drawing supdraw = Text(sup, true); @@ -67,8 +81,7 @@ Drawing EquationDraw::SubSup(String text, String sub, String sup) return SubSup(textdraw, subdraw, supdraw); } -Drawing EquationDraw::SubSup(Drawing &drwText, String sub, String sup) -{ +Drawing EquationDraw::SubSup(Drawing &drwText, String sub, String sup) { Drawing subdraw = Text(sub, true); Drawing supdraw = Text(sup, true); @@ -95,8 +108,7 @@ Drawing EquationDraw::SubSupInv(Drawing &drwText, Drawing &drwSub, Drawing &drwS return dw; } -Drawing EquationDraw::SubSupInv(String text, String sub, String sup) -{ +Drawing EquationDraw::SubSupInv(String text, String sub, String sup) { Drawing textdraw = Text(text, true); Drawing subdraw = Text(sub, true); Drawing supdraw = Text(sup, true); @@ -104,16 +116,14 @@ Drawing EquationDraw::SubSupInv(String text, String sub, String sup) return SubSupInv(textdraw, subdraw, supdraw); } -Drawing EquationDraw::SubSupInv(Drawing &drwText, String sub, String sup) -{ +Drawing EquationDraw::SubSupInv(Drawing &drwText, String sub, String sup) { Drawing subdraw = Text(sub, true); Drawing supdraw = Text(sup, true); return SubSupInv(drwText, subdraw, supdraw); } -Drawing EquationDraw::JoinCenter(Drawing &left, Drawing &right) -{ +Drawing EquationDraw::JoinCenter(Drawing &left, Drawing &right) { Size szLeft = left.GetSize(); Size szRight = right.GetSize(); @@ -128,8 +138,7 @@ Drawing EquationDraw::JoinCenter(Drawing &left, Drawing &right) return dw; } -Drawing EquationDraw::JoinFlex(Drawing &left, double betw1, Drawing &right, double betw2) -{ +Drawing EquationDraw::JoinFlex(Drawing &left, double betw1, Drawing &right, double betw2) { Size szLeft = left.GetSize(); Size szRight = right.GetSize(); @@ -144,8 +153,7 @@ Drawing EquationDraw::JoinFlex(Drawing &left, double betw1, Drawing &right, doub return dw; } -Drawing EquationDraw::NumDenom(Drawing &num, Drawing &denom) -{ +Drawing EquationDraw::NumDenom(Drawing &num, Drawing &denom) { Size szNum = num.GetSize(); Size szDenom = denom.GetSize(); @@ -161,8 +169,7 @@ Drawing EquationDraw::NumDenom(Drawing &num, Drawing &denom) return dw; } -Drawing EquationDraw::Bracket(Drawing &data) -{ +Drawing EquationDraw::Bracket(Drawing &data) { Drawing pizq = Text("(", true, 0, 0, 1.3); Drawing pder = Text(")"); Drawing parizq = JoinFlex(pizq, 1, data, 1); @@ -170,8 +177,7 @@ Drawing EquationDraw::Bracket(Drawing &data) return JoinFlex(parizq, 1, pder, 1); } -Drawing EquationDraw::Sqrt(Drawing &right) -{ +Drawing EquationDraw::Sqrt(Drawing &right) { Drawing left = Text("√"); Size szLeft = left.GetSize(); @@ -189,20 +195,17 @@ Drawing EquationDraw::Sqrt(Drawing &right) return dw; } -Drawing EquationDraw::Exponent(Drawing &right) -{ +Drawing EquationDraw::Exponent(Drawing &right) { Drawing left = Text("e"); return EquationDraw::Exp(left, right); } -Drawing EquationDraw::Der(Drawing &data) -{ +Drawing EquationDraw::Der(Drawing &data) { return EquationDraw::Function("d", data); } -Drawing EquationDraw::Abs(Drawing &data) -{ +Drawing EquationDraw::Abs(Drawing &data) { Drawing pizq = Text("|", true, 0, 0, 1.3); Drawing pder = Text("|"); Drawing parizq = JoinFlex(pizq, 1, data, 1); @@ -210,8 +213,7 @@ Drawing EquationDraw::Abs(Drawing &data) return JoinFlex(parizq, 1, pder, 1); } -Drawing EquationDraw::Integral(Drawing &data, Drawing &sub, Drawing &sup) -{ +Drawing EquationDraw::Integral(Drawing &data, Drawing &sub, Drawing &sup) { Drawing left = Text("∫"); Drawing right = SubSupInv(data, sub, sup); @@ -230,8 +232,7 @@ Drawing EquationDraw::Integral(Drawing &data, Drawing &sub, Drawing &sup) return dw; } -Drawing EquationDraw::Summat(Drawing &data, Drawing &sub, Drawing &sup) -{ +Drawing EquationDraw::Summat(Drawing &data, Drawing &sub, Drawing &sup) { Drawing left = Text("∑", true, 0, -20); Drawing right = SubSupInv(data, sub, sup); @@ -249,31 +250,27 @@ Drawing EquationDraw::Summat(Drawing &data, Drawing &sub, Drawing &sup) return dw; } -Drawing EquationDraw::Exp(Drawing &data, Drawing &exp) -{ +Drawing EquationDraw::Exp(Drawing &data, Drawing &exp) { Drawing foo = Text(""); return SubSup(data, foo, exp); } -Drawing EquationDraw::Function(String function, Drawing &content) -{ +Drawing EquationDraw::Function(String function, Drawing &content) { Drawing fundraw = Text(function); Drawing pardraw = Bracket(content); return JoinCenter(fundraw, pardraw); } -Drawing EquationDraw::Equal(Drawing &left, Drawing &right) -{ +Drawing EquationDraw::Equal(Drawing &left, Drawing &right) { Drawing equal = Text(" = "); Drawing leftdraw = JoinCenter(left, equal); return JoinCenter(leftdraw, right); } -String EquationDraw::ReplaceSymbols(String var) -{ +String EquationDraw::ReplaceSymbols(String var) { for (int i = 0; i < symbols.GetCount(); ++i) { String letter = ToLower(symbols.GetKey(i)); if (var.Find(letter) >= 0) @@ -285,7 +282,7 @@ String EquationDraw::ReplaceSymbols(String var) return var; } -String EquationDraw::TermTrig(CParser& p) { +String EquationDraw::TermTrig(CParserPlus& p) { if (p.Id("sin")) return "sin"; if (p.Id("cos")) return "cos"; if (p.Id("tan")) return "tan"; @@ -298,8 +295,7 @@ String EquationDraw::TermTrig(CParser& p) { return Null; } -Drawing EquationDraw::Term(CParser& p, bool noBracket) -{ +Drawing EquationDraw::Term(CParserPlus& p, bool noBracket) { if(p.Id("integral")) { p.PassChar('('); Drawing data = Exp(p); @@ -369,8 +365,7 @@ Drawing EquationDraw::Term(CParser& p, bool noBracket) return EquationDraw::Text(FormatDouble(p.ReadDouble())); } -Drawing EquationDraw::Mul(CParser& p) -{ +Drawing EquationDraw::Mul(CParserPlus& p) { Drawing x = Term(p); for(;;) { if(p.Char('*')) { @@ -389,8 +384,7 @@ Drawing EquationDraw::Mul(CParser& p) } } -Drawing EquationDraw::Exp(CParser& p) -{ +Drawing EquationDraw::Exp(CParserPlus& p) { Drawing x = Mul(p); for(;;) { if(p.Char('+')) { @@ -411,8 +405,7 @@ Drawing EquationDraw::Exp(CParser& p) } } -EquationDraw::EquationDraw() -{ +EquationDraw::EquationDraw() { symbols.GetAdd("alpha") = "Αα"; symbols.GetAdd("nu") = "Νν"; symbols.GetAdd("beta") = "Ββ"; @@ -439,11 +432,10 @@ EquationDraw::EquationDraw() symbols.GetAdd("omega") = "Ωω"; } -Drawing DrawEquation(const String &str) -{ +Drawing DrawEquation(const String &str) { EquationDraw equation; - CParser p(str); + CParserPlus p(str); try { if(p.IsId()) { String id; @@ -461,8 +453,7 @@ Drawing DrawEquation(const String &str) } } -QtfRichObject QtfEquation(const String &str) -{ +QtfRichObject QtfEquation(const String &str) { Drawing drw = DrawEquation(str); Size sz = drw.GetSize();