wxString COARnotes::AppendNotes( const wxString &sNotes, const wxString &_sAppend, const wxString &_sUser) { wxString sRtn; wxString sAppend(_sAppend); wxString sUser(_sUser); wxString sTime; wxDateTime dt; nwxString::Trim(&sAppend); nwxString::Trim(&sUser); if(sAppend.IsEmpty()) { sAppend = "<no new notes added>"; } sTime.Alloc(sUser.Len() + 64); sTime = "Edited "; dt.SetToCurrent(); sTime.Append(dt.Format(COARreview::TIME_FORMAT)); if(!sUser.IsEmpty()) { sTime.Append(" by "); sTime.Append(sUser); } sTime.Append("\n"); sRtn.Alloc(sNotes.Len() + sAppend.Len() + sTime.Len() + 4); if(!sNotes.IsEmpty()) { sRtn = sNotes; sRtn.Append("\n\n"); } sRtn.Append(sTime); sRtn.Append(sAppend); return sRtn; }
void ArrayOps::evaluate(SymTab & symTab, std::unique_ptr<FuncTab> &funcTab) { auto type = symTab.getValueFor(_id)->type(); if(_op == "append") { if(_test == nullptr) { std::cout << "ArrayOps::evaluate append, no element provided\n"; exit(1); } auto element = _test->evaluate(symTab, funcTab); if( type == TypeDescriptor::NUMBERARRAY ) { if(element->type() == TypeDescriptor::INTEGER) { auto nDesc = dynamic_cast<NumberDescriptor*>(element.get()); auto narray = dynamic_cast<NumberArray*> (symTab.getValueFor(_id).get()); narray->nAppend(nDesc->value.intValue); } else { std::cout << "ArrayOps::append error: members must be of "; std::cout << "the same type\n"; exit(1); } } else if(type == TypeDescriptor::STRINGARRAY) { if(element->type() == TypeDescriptor::STRING) { auto sDesc = dynamic_cast<StringDescriptor*>(element.get()); auto sarray = dynamic_cast<StringArray*> (symTab.getValueFor(_id).get()); sarray->sAppend(sDesc->value); } else { std::cout << "ArrayOps::append error: members must be of "; std::cout << "the same type\n"; exit(1); } } else if (type == TypeDescriptor::NULLARRAY) { if(element->type() == TypeDescriptor::INTEGER) { auto nDesc = dynamic_cast<NumberDescriptor*>(element.get()); if(nDesc == nullptr) { std::cout << "ArrayOps::evaluate error: invalid cast"; exit(1); } std::shared_ptr<NumberArray> narray = std::make_shared<NumberArray>(TypeDescriptor::NUMBERARRAY); narray->nAppend(nDesc->value.intValue); symTab.setValueFor(_id, narray); } else if(element->type() == TypeDescriptor::STRING) { auto sDesc = dynamic_cast<StringDescriptor*>(element.get()); if(sDesc == nullptr) { std::cout << "ArrayOps::evaluate error: invalid cast"; exit(1); } std::shared_ptr<StringArray> sarray = std::make_shared<StringArray>(TypeDescriptor::STRINGARRAY); sarray->sAppend(sDesc->value); symTab.setValueFor(_id, sarray); } else { std::cout << "append() is not supported for this type\n"; exit(1); } } else { std::cout << "append() is not supported for this type\n"; exit(1); } } else if (_op == "pop") { if( type == TypeDescriptor::NUMBERARRAY ) { auto narray = dynamic_cast<NumberArray*> (symTab.getValueFor(_id).get()); if(narray != nullptr) { if(_test == nullptr) narray->nPop(); else { auto element = _test->evaluate(symTab, funcTab); narray->nPopIndex(element.get()); } } } else if(type == TypeDescriptor::STRINGARRAY) { auto sarray = dynamic_cast<StringArray*> (symTab.getValueFor(_id).get()); if(sarray != nullptr) { if(_test == nullptr) sarray->sPop(); else { auto element = _test->evaluate(symTab, funcTab); sarray->sPopIndex(element.get()); } } } else { std::cout << "pop is not supported for this type\n"; exit(1); } } }