void SaveCode(code c, char* path) { ofstream out(path); for(unsigned int i = 0; i < c.size(); i++) out<<c[i]<<endl; out.close(); }
void SealCode(code& c) { for(unsigned int i = 0; i < c.size(); i++) //Перебираем строки { if(c[i].find("#code#")!=string::npos) { c.erase(c.begin()+i); } } }
void PushCode(code& c,code subc) { for(unsigned int i = 0; i < c.size(); i++) //Перебираем строки { if(c[i].find("#code#")!=string::npos) { //c.erase(c.begin()+i); c.insert (c.begin()+i,subc.begin(),subc.end()); break; } } }
int operator%(const code &lhs, const vector<int> &rhs) // Overloaded operator that returns the number of digits in the code // in the lhs that match the vector rhs. { int count = 0; if (lhs.size() != rhs.size()) throw rangeError(); for (int i = 0; i < rhs.size(); i++) if (lhs.seq[i] == rhs[i]) count++; return count; }
void PushArguments(code &c, int block_type, arglist a) { int state = 0; int b,e; string ins_str; c = template_base[block_type].lines; vector<Var> var_table; for(unsigned int i = 0; i < a.size(); i++) { Var temp; temp.Value = a[i]; temp.Name =""; var_table.push_back(temp); } for(unsigned int k = 0;k<c.size();k++) for(unsigned int i = 0;i<c[k].length();i++) { switch(state) { case 0 ://Начало новой переменной if(c[k][i]=='$') { state = 1; b = i; } break; case 1 ://Конец новой переменной if(c[k][i]=='$') { state = 2; e = i; } break; case 2 ://Поиск переменной в списке и подстановка аргумента ins_str = c[k].substr(b+1,e-b-1); //Копируем подстроку, заключенную в $...$ c[k].erase(b,e-b+1); //Удаляем скопированную подстроку вместе с $...$ i -= e-b; //Мы удалили e-b+1 символов,так что возвращаем счетчик назад на эту величину unsigned int j = 0; bool isAddV = false;//Если мы найдем переменную, то добавлять новую будет не надо for(j = 0; j < var_table.size()&&var_table[j].Name!=""; j++ ) if(var_table[j].Name == ins_str) //Если переменная с таким именем уже есть { c[k].insert(b,var_table[j].Value);//Вставляем аргумент в код isAddV = true; break; } state = 0; //Возвращаемся в состояние поиска начала новой переменной if(isAddV)//Если мы найдем переменную, то добавлять новую будет не надо break; //Если дошли сюда, то данной переменной в списке найдено не было if(j>var_table.size())//Если значение счетчика больше размера списка переменных return; //Возвращаемся, не хватило параметров //Если дошли сюда, то //теперь нужно добавить переменную в список и подставить значение var_table[j].Name = ins_str; //Регистрируем переменную c[k].insert(b,var_table[j].Value); //Вставляем аргумент в код break; } } return; }