2015-06-02 2 views
0

У меня есть сценарий, где у меня есть различные файлы C++ с определенным макросом:Подобрав определенную строку шаблона без регулярных выражений

__EXTERNALIZE(Name, File) 

Этот макрос пуст, он не делает ничего. Но я хочу написать внешний инструмент, который сканирует один или несколько входных файлов для этого макроса и что-то делать, когда он найдет это.

Чтобы уточнить, вот немного псевдо-с:

typedef struct { 
    char* varname; 
    char* filename; 
} MacroInfo_s; 
FILE* fh = fopen("./source.cpp",'r'); 
while(read_untill_macro(fh) && !feof(fh)) { 
    MacroInfo_s m; 
    fill_macro_info(&m, fh); 
    // Do something with m.varname and m.filename 
} 

C++ 11 не широко доступны. Например, VS 2010 не предоставляет его вообще, и это самый низкий показатель, который я хочу настроить на стороне Windows. На моей OS X 10.10 все в порядке. Вот почему я в основном не хочу использовать Regexp, так как мне нужна дополнительная библиотека. И это просто реагировать на один макрос в нескольких файлах кажется немного излишним.

Что было бы хорошим aproach, чтобы сделать это возможным?

+2

Я бы не использовать C++ для этого, но язык сценариев – P0W

+0

Я хотел бы использовать 'grep'. Можете ли вы объяснить, почему вы хотите написать инструмент для этого? Похоже, ваша основная цель - идентифицировать исходные файлы, содержащие этот макрос, и потенциально удалить его. – paddy

ответ

1

Простейший способ, которым я могу думать, - использовать std::getline, чтобы прочитать каждый открытый параграф (, а затем проверить эту строку для вашего макроса.

Затем еще один std::getline, чтобы прочитать до заключительного параграфа ) должен извлечь параметры вашего макроса.

Немного как это:

const std::string EXTERNALIZE = "__EXTERNALIZE"; 

int main(int, char* argv[]) 
{ 
    for(char** arg = argv + 1; *arg; ++arg) 
    { 
     std::cout << "Processing file: " << *arg << '\n'; 

     std::ifstream ifs(*arg); 

     std::string text; 
     while(std::getline(ifs, text, '(')) 
     { 
      // use rfind() to check the text leading up to the open paren (
      if(text.rfind(EXTERNALIZE) != text.size() - EXTERNALIZE.size()) 
       continue; 

      std::cout << "found macro:" << '\n'; 

      // now read the parameters up to the closing paren) 
      std::getline(ifs, text, ')'); 

      // here are the macro's parameters 
      std::cout << "parameters: " << text << '\n'; 
     } 
    } 
} 
+0

Уход! Я не знал, что «getline» обладает такими полномочиями. :) –

Смежные вопросы