NAMESPACE_UPP bool Painter::ReadBool(CParser& p) { while(p.Char(',')); if(p.Char('1')) return true; p.Char('0'); return false; }
Vector<String> ReadPatterns(CParser& p) { Vector<String> out; while(!p.IsEof() && !p.Char(';')) { out << ReadValue(p); p.Char(','); } return out; }
String EvalExpr::MulStr(CParser& p, int numDigits) { String x = PowStr(p, numDigits); for(;;) if(p.Char('*')) x = x + "*" + MulStr(p, numDigits); else if(p.Char('/')) x = x + "/" + PowStr(p, numDigits); else return x; }
String ReadId(CParser& p, String& rr) { String id = SchId(p, rr); p.Char(','); if(p.IsNumber()) p.ReadNumber(); p.Char(','); if(p.IsNumber()) p.ReadNumber(); p.Char(')'); return id; }
bool ReadCode(CParser& p, DocKey& key) { if(!p.IsString()) return false; key.nameing = p.ReadString(); if(!p.Char(',') || !p.IsString()) return false; key.nesting = p.ReadString(); if(!p.Char(',') || !p.IsString()) return false; key.item = p.ReadString(); if(!p.Char(',') || !p.IsString()) return false; key.lang = LNGFromText(p.ReadString()); return true; }
double EvalExpr::Exp(CParser& p) { double x = Mul(p); for(;;) { if(p.Char('+')) x = x + Mul(p); else if(p.Char('-')) x = x - Mul(p); else if(p.Char(':')) x = x*60 + Mul(p); else return x; } }
double EvalExpr::Mul(CParser& p) { double x = Pow(p); for(;;) { if(p.Char('*')) x = x * Mul(p); else if(p.Char('/')) { double y = Pow(p); if(y == 0) p.ThrowError(t_("Divide by zero")); x = x / y; } else return x; } }
String EvalExpr::ExpStr(CParser& p, int numDigits) { String x = MulStr(p, numDigits); for(;;) { if(p.Char('+')) x = x + " + " + MulStr(p, numDigits); else if(p.Char('-')) x = x + " - " + MulStr(p, numDigits); else if(p.Char(':')) x = x + ":" + MulStr(p, numDigits); else { x.Replace("+ -", "- "); return x; } } }
String SchId(CParser& p, String& rr) { p.Char('('); String id = p.ReadId(); rr << "SqlId " << id << "(\"" << id << "\");"; return id; }
String EvalExpr::TermStr(CParser& p, int numDigits) { if(p.IsId()) { String strId = p.ReadId(); if(functions.Find(strId) >= 0) { p.PassChar('('); String x = ExpStr(p, numDigits); p.PassChar(')'); return strId + "(" + x + ")"; } if (noCase) strId = ToUpper(strId); if (IsNull(numDigits)) { if (constants.Find(strId) < 0) variables.GetAdd(strId, 0); return strId; } else { if (constants.Find(strId) >= 0) return strId; else { double dat = variables.GetAdd(strId, 0); return FormatDoubleFix(dat, numDigits); } } } if(p.Char('(')) { String x = ExpStr(p, numDigits); p.PassChar(')'); return "(" + x + ")"; } return FormatDoubleFix(p.ReadDouble(), IsNull(numDigits) ? 3 : numDigits); }
String EvalExpr::PowStr(CParser& p, int numDigits) { String x = TermStr(p, numDigits); for(;;) if(p.Char('^')) x = x + "^" + TermStr(p, numDigits); else return x; }
double EvalExpr::Pow(CParser& p) { double x = Term(p); for(;;) { if(p.Char('^')) x = pow(x, Term(p)); else return x; } }
void ColorProperty::Read(CParser& p) { if(p.Id("Null")) { editor.SetData(Null); return; } p.Char(':'); editor.SetData(ReadColor(p)); }
NAMESPACE_UPP Value ParseJSON(CParser& p) { p.UnicodeEscape(); if(p.IsDouble()) return p.ReadDouble(); if(p.IsString()) { bool dt = p.IsChar2('\"', '\\'); String s = p.ReadString(); if(dt) { CParser p(s); if(p.Char('/') && p.Id("Date") && p.Char('(') && p.IsInt()) { int64 n = p.ReadInt64(); if(!IsNull(n)) return Time(1970, 1, 1) + n / 1000; } } return s; } if(p.Id("null")) return Null; if(p.Id("true")) return true; if(p.Id("false")) return false; if(p.Char('{')) { ValueMap m; while(!p.Char('}')) { String key = p.ReadString(); p.PassChar(':'); m.Add(key, ParseJSON(p)); if(p.Char('}')) // Stray ',' at the end of list is allowed... break; p.PassChar(','); } return m; } if(p.Char('[')) { ValueArray va; while(!p.Char(']')) { va.Add(ParseJSON(p)); if(p.Char(']')) // Stray ',' at the end of list is allowed... break; p.PassChar(','); } return va; } p.ThrowError("Unrecognized JSON element"); return Null; }
NAMESPACE_UPP Value ParseJSON(CParser& p) { p.UnicodeEscape(); if(p.IsNumber()) return p.ReadDouble(); if(p.IsString()) return p.ReadString(); if(p.Id("null")) return Null; if(p.Id("true")) return true; if(p.Id("false")) return false; if(p.Char('{')) { ValueMap m; if(!p.IsChar('}')) do { String key = p.ReadString(); p.PassChar(':'); m.Add(key, ParseJSON(p)); } while(p.Char(',')); p.PassChar('}'); return m; } if(p.Char('[')) { ValueArray va; if(!p.IsChar(']')) do va.Add(ParseJSON(p)); while(p.Char(',')); p.PassChar(']'); return va; } p.ThrowError("Unrecognized JSON element"); return Null; }
String ReadPropertyParam(CParser& p) { const char *b = p.GetPtr(); int level = 0; while(!p.IsEof()) { if(p.IsChar(';')) break; if(p.IsChar(')') && level == 0) break; if(p.Char(')')) { if(level == 0) break; level--; } else if(p.Char('(')) level++; else p.SkipTerm(); } return TrimLeft(TrimRight(String(b, p.GetPtr()))); }
static void ReadMacro(CParser& p) { IdeMacro macro; if(p.IsString()) { macro.menu = p.ReadString(); if(p.Char(':')) macro.submenu = p.ReadString(); } if(!p.IsChar('{')) macro.hotkey = ParseKeyDesc(p); EscLambda& l = macro.code.CreateLambda(); const char *t = p.GetPtr(); l.filename = p.GetFileName(); l.line = p.GetLine(); if(!p.Char('{')) p.ThrowError("missing '{'"); SkipBlock(p); l.code = String(t, p.GetPtr()); Array<IdeMacro>& mlist = UscMacros(); if(macro.hotkey) { int f = FindFieldIndex(mlist, &IdeMacro::hotkey, macro.hotkey); if(f >= 0) { PutConsole(NFormat("%s(%d): duplicate macro hotkey %s\n", l.filename, l.line, GetKeyDesc(macro.hotkey))); const EscLambda& lambda = UscMacros()[f].code.GetLambda(); PutConsole(NFormat("%s(%d): previously defined here\n", lambda.filename, lambda.line)); } } if(!IsNull(macro.menu)) { for(int i = 0; i < mlist.GetCount(); i++) if(mlist[i].menu == macro.menu && mlist[i].submenu == macro.submenu) { PutConsole(NFormat("%s(%d): duplicate macro menu item (%s:%s)\n", l.filename, l.line, macro.menu, macro.submenu)); const EscLambda& lambda = UscMacros()[i].code.GetLambda(); PutConsole(NFormat("%s(%d): previously defined here\n", lambda.filename, lambda.line)); break; } } mlist.Add(macro); }
double EvalExpr::Term(CParser& p) { if(p.IsId()) { String strId = p.ReadId(); if(double (*function)(double) = functions.Get(strId, 0)) { p.PassChar('('); double x = Exp(p); p.PassChar(')'); return function(x); } if (noCase) strId = ToUpper(strId); double ret = constants.Get(strId, Null); if (IsNull(ret)) ret = variables.GetAdd(strId, 0); return ret; } else if(p.Char('(')) { double x = Exp(p); p.PassChar(')'); return x; } else return p.ReadDouble(); }
void Pdb::ExpandTreeType(int parent, CParser& p) { for(;;) { String id; if(p.Char('*')) id = "*"; if(p.IsId()) id << p.ReadId(); else break; for(;;) if(p.Char('<')) id << '<'; else if(p.Char('>')) id << '>'; else if(p.Char(',')) id << ','; else if(p.IsInt()) id << AsString(p.ReadInt()); else if(p.IsString()) id << '\"' << AsCString(p.ReadString()) << '\"'; else if(p.IsId()) id << p.ReadId(); else break; int n = tree.GetChildCount(parent); for(int i = 0; i < n; i++) { int child = tree.GetChild(parent, i); const NamedVal& nv = ValueTo<NamedVal>(tree.Get(child)); if(nv.name == id) { tree.Open(child); if(p.Char('{')) { ExpandTreeType(child, p); p.PassChar('}'); } break; } } p.Char(';'); } }
void ScanIML(CParser& parser, Array<ImlImage>& out_images, VectorMap<String, String>& out_settings) { String name, bid; bool exp = false; while(!parser.IsEof()) { if((bid = parser.ReadId()) == "IMAGE_META") { parser.Char('('); if(parser.IsString()) name = parser.ReadString(); else name = parser.ReadId(); parser.PassChar(','); String value = parser.ReadString(); parser.PassChar(')'); out_settings.Add(name, value); if(value == "exp") exp = true; } else if(bid == "IMAGE_BEGIN" && parser.Char('(') && !IsNull(name = parser.ReadId()) && parser.Char(')')) { String encoded_data; out_settings.GetAdd("wince_16bit", "0"); String id; bool first = true; while((id = parser.ReadId()) == "IMAGE_SCAN" && parser.Char('(')) { bool first_in_row = true; while(parser.IsChar('\"')) { String scan = parser.ReadOneString(); if(!first && first_in_row) encoded_data.Cat('\x80'); first_in_row = first = false; encoded_data.Cat(scan); } if(!parser.Char(')')) break; } AlphaImageInfo image; bool accepted = false; if(parser.Char('(') && parser.ReadId() == name && parser.Char(',')) if(id == "IMAGE_END" && (image.size.cx = parser.ReadInt()) > 0 && parser.Char(',') && (image.size.cy = parser.ReadInt()) > 0 && parser.Char(')')) { accepted = true; } else if(id == "IMAGE_PACKED" && parser.IsChar('\"')) { String d = parser.ReadOneString(); if(parser.Char(')')) { StringStream ss(d); ss % image; if(!ss.IsError()) accepted = true; } } if(name.GetLength() >= 6 && !memcmp(name, "_java_", 6)) accepted = false; if(accepted) { if(name.GetLength() >= 4 && !memcmp(name, "im__", 4)) name = Null; Image m = RLEToAlpha(encoded_data, image.size); ImageBuffer ib(m); ib.SetHotSpot(image.hotspot); m = ib; ImlImage& c = out_images.Add(); c.name = name; c.image = m; c.exp = exp; exp = false; } } else if(bid == "IMAGE_BEGIN16" && parser.Char('(') && !IsNull(name = parser.ReadId()) && parser.Char(')')) { //TODO: FIX THESE!!! out_settings.GetAdd("wince_16bit", "1"); String encoded_data; String id; bool first = true; while((id = parser.ReadId()) == "IMAGE_SCAN16" && parser.Char('(') && parser.Char('L')) { bool first_in_row = true; while(parser.Char('\"')) { CParser::Pos pos = parser.GetPos(); const char *end; end = pos.ptr; // TODO - remove String scan; // TODO = GetUnicodeScan(pos.ptr, &end); pos.ptr = end; parser.SetPos(pos); if(!parser.Char('\"')) break; if(!first && first_in_row) encoded_data.Cat('\x80'); first_in_row = first = false; encoded_data.Cat(scan); } if(!parser.Char(')')) break; } AlphaImageInfo idata; bool accepted = false; if(id == "IMAGE_END16" && parser.Char('(') && parser.ReadId() == name && parser.Char(',') && (idata.size.cx = parser.ReadInt()) > 0 && parser.Char(',') && (idata.size.cy = parser.ReadInt()) > 0 && parser.Char(',') && !IsNull(idata.hotspot.x = parser.ReadInt()) && parser.Char(',') && !IsNull(idata.hotspot.y = parser.ReadInt()) && parser.Char(')')) { accepted = true; } if(accepted) { if(name.GetLength() >= 4 && !memcmp(name, "im__", 4)) name = Null; Image m = RLEToAlpha(encoded_data, idata.size); ImageBuffer ib(m); ib.SetHotSpot(idata.hotspot); m = ib; ImlImage& c = out_images.Add(); c.name = name; c.image = m; c.exp = exp; exp = false; } } else break; } }
double Painter::ReadDouble(CParser& p) { while(p.Char(',')); return p.IsDouble2() ? p.ReadDouble() : 0; }