Exemple #1
0
void SaveCode(code c, char* path)
{
    ofstream out(path);
    for(unsigned int i = 0; i < c.size(); i++)
        out<<c[i]<<endl;
    out.close();
}
Exemple #2
0
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);
        }
    }
}
Exemple #3
0
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;
        }
    }
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}