FarEditor::FarEditor(PluginStartupInfo *info, ParserFactory *pf) { parserFactory = pf; baseEditor = new BaseEditor(parserFactory, this); this->info = info; info->EditorControl(ECTL_GETINFO, &ei); cursorRegion = nullptr; prevLinePosition = 0; blockTopPosition = -1; inRedraw = false; idleCount = 0; ret_str = nullptr; ret_strNumber = -1; maxLineLength = 0; fullBackground = true; drawCross = 2; showHorizontalCross = showVerticalCross = false; crossZOrder = 0; horzCrossColor = color(); //0x0E; vertCrossColor = color(); //0x0E; drawPairs = drawSyntax = true; oldOutline = false; newback = newfore = -1; rdBackground = nullptr; visibleLevel = 100; DString dso("def:Outlined"); DString dse("def:Error"); const Region *def_Outlined = pf->getHRCParser()->getRegion(&dso); const Region *def_Error = pf->getHRCParser()->getRegion(&dse); structOutliner = new Outliner(baseEditor, def_Outlined); errorOutliner = new Outliner(baseEditor, def_Error); TrueMod=true; }
void MainApp::onPipeDisconnect() { if (!m_bLoggedIn) return; gcTrace(""); DesuraServiceError dse(getMainWindow()); dse.ShowModal(); }
void EditStaff::editDrumsetClicked() { EditDrumset dse(staff->part()->instr()->drumset(), this); dse.exec(); }
void MainApp::onPipeDisconnect() { DesuraServiceError dse(getMainWindow()); dse.ShowModal(); }
EError CRegExp::setStructs(SRegInfo *&re, const String &expr, int &retPos) { SRegInfo *next, *temp; retPos = 0; if (!expr.length()) return EOK; retPos = -1; next = re; for(int i = 0; i < expr.length(); i++){ // simple character if (extend && Character::isWhitespace(expr[i])) continue; // context return if (expr[i] == ')'){ retPos = i; break; }; // next element if (i != 0){ next->next = new SRegInfo; next->next->parent = next->parent; next->next->prev = next; next = next->next; }; // Escape symbol if (expr[i] == '\\'){ String *br_name; int blen; switch (expr[i+1]){ case 'd': next->op = ReMetaSymb; next->un.metaSymbol = ReDigit; break; case 'D': next->op = ReMetaSymb; next->un.metaSymbol = ReNDigit; break; case 'w': next->op = ReMetaSymb; next->un.metaSymbol = ReWordSymb; break; case 'W': next->op = ReMetaSymb; next->un.metaSymbol = ReNWordSymb; break; case 's': next->op = ReMetaSymb; next->un.metaSymbol = ReWSpace; break; case 'S': next->op = ReMetaSymb; next->un.metaSymbol = ReNWSpace; break; case 'u': next->op = ReMetaSymb; next->un.metaSymbol = ReUCase; break; case 'l': next->op = ReMetaSymb; next->un.metaSymbol = ReNUCase; break; case 't': next->op = ReSymb; next->un.symbol = '\t'; break; case 'n': next->op = ReSymb; next->un.symbol = '\n'; break; case 'r': next->op = ReSymb; next->un.symbol = '\r'; break; case 'b': next->op = ReMetaSymb; next->un.metaSymbol = ReWBound; break; case 'B': next->op = ReMetaSymb; next->un.metaSymbol = ReNWBound; break; case 'c': next->op = ReMetaSymb; next->un.metaSymbol = RePreNW; break; #ifdef COLORERMODE case 'm': next->op = ReMetaSymb; next->un.metaSymbol = ReStart; break; case 'M': next->op = ReMetaSymb; next->un.metaSymbol = ReEnd; break; #ifndef NAMED_MATCHES_IN_HASH case 'y': case 'Y': next->op = (expr[i+1] =='y'?ReBkTrace:ReBkTraceN); next->param0 = UnicodeTools::getHex(expr[i+2]); if (next->param0 != -1){ i++; }else{ next->op = (expr[i+1] =='y'?ReBkTraceName:ReBkTraceNName); br_name = UnicodeTools::getCurlyContent(expr, i+2); if (br_name == null) return ESYNTAX; if (!backRE){ delete br_name; return EERROR; } next->param0 = backRE->getBracketNo(br_name); blen = br_name->length(); delete br_name; if (next->param0 == -1) return ESYNTAX; i += blen+2; }; break; #endif // COLORERMODE #endif // NAMED_MATCHES_IN_HASH case 'p': // \p{name} next->op = ReBkBrackName; br_name = UnicodeTools::getCurlyContent(expr, i+2); if (br_name == null) return ESYNTAX; blen = br_name->length(); #ifndef NAMED_MATCHES_IN_HASH next->param0 = getBracketNo(br_name); delete br_name; if (next->param0 == -1) return ESYNTAX; #else if(br_name->length() && namedMatches && !namedMatches->getItem(br_name)){ delete br_name; return EBRACKETS; }; next->param0 = 0; next->namedata = new SString(br_name); delete br_name; #endif i += blen+2; break; default: next->op = ReBkBrack; next->param0 = UnicodeTools::getHex(expr[i+1]); if (next->param0 < 0 || next->param0 > 9){ int retEnd; next->op = ReSymb; next->un.symbol = UnicodeTools::getEscapedChar(expr, i, retEnd); if (next->un.symbol == BAD_WCHAR) return ESYNTAX; i = retEnd-1; }; break; }; i++; continue; }; if (expr[i] == '.'){ next->op = ReMetaSymb; next->un.metaSymbol = ReAnyChr; continue; }; if (expr[i] == '^'){ next->op = ReMetaSymb; next->un.metaSymbol = ReSoL; continue; }; if (expr[i] == '$'){ next->op = ReMetaSymb; next->un.metaSymbol = ReEoL; continue; }; #ifdef COLORERMODE if (expr[i] == '~'){ next->op = ReMetaSymb; next->un.metaSymbol = ReSoScheme; continue; }; #endif next->un.param = 0; next->param0 = 0; if (expr.length() > i+2){ if (expr[i] == '?' && expr[i+1] == '#' && expr[i+2] >= '0' && expr[i+2] <= '9'){ next->op = ReBehind; next->param0 = UnicodeTools::getHex(expr[i+2]); i += 2; continue; }; if (expr[i] == '?' && expr[i+1] == '~' && expr[i+2]>='0' && expr[i+2]<='9'){ next->op = ReNBehind; next->param0 = UnicodeTools::getHex(expr[i+2]); i += 2; continue; }; }; if (expr.length() > i+1){ if (expr[i] == '*' && expr[i+1] == '?'){ next->op = ReNGRangeN; next->s = 0; i++; continue; }; if (expr[i] == '+' && expr[i+1] == '?'){ next->op = ReNGRangeN; next->s = 1; i++; continue; }; if (expr[i] == '?' && expr[i+1] == '='){ next->op = ReAhead; i++; continue; }; if (expr[i] == '?' && expr[i+1] == '!'){ next->op = ReNAhead; i++; continue; }; if (expr[i] == '?' && expr[i+1] == '?'){ next->op = ReNGRangeNM; next->s = 0; next->e = 1; i++; continue; }; }; if (expr[i] == '*'){ next->op = ReRangeN; next->s = 0; continue; }; if (expr[i] == '+'){ next->op = ReRangeN; next->s = 1; continue; }; if (expr[i] == '?'){ next->op = ReRangeNM; next->s = 0; next->e = 1; continue; }; if (expr[i] == '|'){ next->op = ReOr; continue; }; // {n,m} if (expr[i] == '{'){ int st = i+1; int en = -1; int comma = -1; bool nonGreedy = false; int j; for (j = i; j < expr.length(); j++){ if (expr.length() > j+1 && expr[j] == '}' && expr[j+1] == '?'){ en = j; nonGreedy = true; j++; break; }; if (expr[j] == '}'){ en = j; break; }; if (expr[j] == ',') comma = j; }; if (en == -1) return EBRACKETS; if (comma == -1) comma = en; DString dse(&expr, st, comma-st); next->s = UnicodeTools::getNumber(&dse); if (comma != en) { DString dse2(&expr, comma+1, en-comma-1); next->e = UnicodeTools::getNumber(&dse2); } else next->e = next->s; if (next->e == -1) return EOP; next->un.param = 0; if (en - comma == 1) next->e = -1; if (next->e == -1) next->op = nonGreedy ? ReNGRangeN : ReRangeN; else next->op = nonGreedy ? ReNGRangeNM : ReRangeNM; i = j; continue; }; // ( ... ) if (expr[i] == '('){ bool namedBracket = false; // perl-like "uncaptured" brackets if (expr.length() >= i+2 && expr[i+1] == '?' && expr[i+2] == ':'){ next->op = ReNamedBrackets; next->param0 = -1; namedBracket = true; i += 3; } else if (expr.length() > i+2 && expr[i+1] == '?' && expr[i+2] == '{'){ // named bracket next->op = ReNamedBrackets; namedBracket = true; String *s_curly = UnicodeTools::getCurlyContent(expr, i+2); if (s_curly == null) return EBRACKETS; SString *br_name = new SString(s_curly); delete s_curly; int blen = br_name->length(); if (blen == 0){ next->param0 = -1; delete br_name; }else{ #ifndef NAMED_MATCHES_IN_HASH #ifdef CHECKNAMES if (getBracketNo(br_name) != -1){ delete br_name; return EBRACKETS; }; #endif if (cnMatch < NAMED_MATCHES_NUM){ next->param0 = cnMatch; brnames[cnMatch] = br_name; cnMatch++; }else delete br_name; #else #ifdef CHECKNAMES if(br_name->length() && namedMatches && namedMatches->getItem(br_name)){ delete br_name; return EBRACKETS; }; #endif next->param0 = 0; next->namedata = br_name; if (namedMatches){ SMatch mt = {-1, -1}; namedMatches->setItem(br_name, mt); }; #endif }; i += blen+4; }else{ next->op = ReBrackets; if (cMatch < MATCHES_NUM){ next->param0 = cMatch; cMatch++; }; i += 1; }; next->un.param = new SRegInfo; next->un.param->parent = next; int endPos; EError err = setStructs(next->un.param, DString(&expr, i), endPos); if (endPos == expr.length()-i) return EBRACKETS; if (err) return err; i += endPos; continue; }; // [] [^] if (expr[i] == '['){ int endPos; CharacterClass *cc = CharacterClass::createCharClass(expr, i, &endPos); if (cc == null) return EENUM; // next->op = (exprn[i] == ReEnumS) ? ReEnum : ReNEnum; next->op = ReEnum; next->un.charclass = cc; i = endPos; continue; }; if (expr[i] == ')' || expr[i] == ']' || expr[i] == '}') return EBRACKETS; next->op = ReSymb; next->un.symbol = expr[i]; }; // operators fixes for(next = re; next; next = next->next){ // makes words from symbols SRegInfo *reword = next; SRegInfo *reafterword = next; SRegInfo *resymb; int wsize = 0; for (resymb = next;resymb && resymb->op == ReSymb; resymb = resymb->next, wsize++); if (resymb && resymb->op > ReBlockOps && resymb->op < ReSymbolOps){ wsize--; resymb = resymb->prev; }; if (wsize > 1){ reafterword = resymb; resymb = reword; wchar *wcword = new wchar[wsize]; for(int idx = 0; idx < wsize; idx++){ wcword[idx] = resymb->un.symbol; SRegInfo *retmp = resymb; resymb = resymb->next; retmp->next = null; if (idx > 0) delete retmp; }; reword->op = ReWord; reword->un.word = new SString(DString(wcword, 0, wsize)); delete[] wcword; reword->next = reafterword; if (reafterword) reafterword->prev = reword; next = reword; continue; }; // adds empty alternative while (next->op == ReOr){ temp = new SRegInfo; temp->parent = next->parent; // |foo|bar if (!next->prev){ temp->next = next; next->prev = temp; continue; }; // foo||bar if (next->next && next->next->op == ReOr){ temp->prev = next; temp->next = next->next; if (next->next) next->next->prev = temp; next->next = temp; continue; }; // foo|bar| if (!next->next){ temp->prev = next; temp->next = 0; next->next = temp; continue; }; // foo|bar|* if (next->next->op > ReBlockOps && next->next->op < ReSymbolOps){ temp->prev = next; temp->next = next->next; next->next->prev = temp; next->next = temp; continue; }; delete temp; break; }; }; // op's generating... next = re; SRegInfo *realFirst; while(next){ if (next->op > ReBlockOps && next->op < ReSymbolOps){ if (!next->prev) return EOP; realFirst = next->prev; realFirst->next = 0; realFirst->parent = next; while(next->op == ReOr && realFirst->prev && realFirst->prev->op != ReOr){ realFirst->parent = next; realFirst = realFirst->prev; }; if (!realFirst->prev){ re = next; next->un.param = realFirst; next->prev = 0; }else{ next->un.param = realFirst; next->prev = realFirst->prev; realFirst->prev->next = next; }; realFirst->prev = 0; }; next = next->next; }; if (retPos == -1) retPos = expr.length(); return EOK; };