Приемы профессиональной работы в UNIX


Ctags - создание файла признаков исходного кода проекта - часть 5


4. $ find /usr/src -type f -print | sort | > while read FILE > do > ctags $FILE > done >> tags

Используя преимущество множественных каталогов, находит и сортирует все файлы из каталога /usr/src и печатает их маршрутные имена в стандартный вывод. Затем они сортируются и поступают по конвейеру в цикл while. Цикл while используется для обслуживания сколь угодно большого числа файлов без переполнения буферов. Выход цикла while добавляется к одному файлу - tags. Этот цикл громоздкий и медленный, но он выполняет свою работу.

5. $ find /usr/src -print | ctags

Это неправильный способ использования ctags. Выходом команды find являются маршрутные имена. Ctags читает стандартный ввод, поскольку в командной строке нет файлов. Получается, что данные, которые читает awk, являются маршрутными именами от find, которые не имеют корректных полей для соответствия шаблонам функций. Никакого сопоставления не происходит.

Аналогичную проблему могла бы вызвать такая командная строка:

find /usr -print | wc -l

Вы могли бы интерпретировать это так: "посчитать, сколько строк имеется во всех файлах каталога /usr". Но в действительности здесь сказано: "сколько имен файлов имеется в древовидной структуре /usr". Для подсчета общего количества строк в этих файлах нужен такой синтаксис:

find /usr -exec cat {} \; | wc -l

который гласит: "найти все файлы в /usr, распечатать каждый из них, затем посчитать, сколько строк в них имеется". Чтобы так же поступить с ctags, нужен такой синтаксис:

find /usr/src -name "*.c" -exec cat {} \; | ctags

В отличие от результата, который мы получили бы в предыдущих примерах:

func1 /usr/russ/src/program.c /^func1(arg1,arg2)$/ func2 /usr/russ/src/program.c /^func2(arg1,arg2)$/

теперь выход будет выглядеть так:

func1 - /^func1(arg1,arg2)$/ func2 - /^func2(arg1,arg2)$/

ПОЯСНЕНИЯ

Символы "-" вместо имени файла появляются из-за того, что ctags читает из стандартного ввода. Awk автоматически присваивает своей внутренней переменной FILENAME значение "-", так как знает, что в командной строке не было файлов.

Весь командный файл есть программа awk. Входом для командного файла утилиты awk является $@, что представляет все позиционные параметры. Каждый параметр считается именем исходного файла на Си. Если никакие файлы не передаются в командной строке, awk ищет данные в стандартном входном потоке, но это создает некорректный выход, так как переменная FILENAME в awk имеет по умолчанию значение "-". Поскольку awk требует имена файлов, мы должны вызывать ctags с именами файлов, а не передавать ему данные по конвейеру через стандартный ввод, как показано в предыдущем примере.

Awk читает каждый раз одну строку из файла данных и сверяет ее с шаблоном, пытаясь установить соответствие. Для каждой строки, соответствующей шаблону, awk выполняет заданную программу. Первое, что делает ctags,- изменяет подразумеваемый разделитель полей утилиты awk с пробела на левую скобку. Благодаря использованию этого символа в качестве разделителя полей, строка определения функции разбивается на два поля: имя функции и остаток строки.

Шаблон поиска утилиты awk соответствует синтаксису имени Си-функции. Оно может начинаться с символов a-z, A-Z или символа подчеркивания. Далее в имени могут быть любые символы из набора a-z, A-Z, 0-9 и _. Между именем и скобкой нельзя использовать пробелы. Поиск начинается от начала строки (^), за которым следует последовательность допустимых символов (a-z, A-Z, 0-9), а затем левая скобка.

Когда строка соответствует данному шаблону, генерируется выход с помощью оператора printf. Первое поле - строка, представленная обозначением $1. В данном случае $1 - это только имя функции, исключая левую скобку. Печатается символ табуляции, затем следующая строка, которая является переменной FILENAME из утилиты awk. Эта переменная должна быть получена из командной строки, иначе awk не будет знать имя файла, в котором размещена данная функция, и файл признаков потеряет информацию, необходимую для доступа к файлу, содержащему функцию. Печатается еще одна табуляция, затем строка поиска. Строкой поиска является $0, что представляет всю строку, с которой работает awk. Строке предшествует символ ^, а за строкой следует символ $.

Выход пропускается по конвейеру через sort с той целью, чтобы все признаки шли в отсортированном порядке. Опции сортировки указывают утилите sort проверять только первое поле и печатать только одно появление строки, если имеется несколько записей.

МОДИФИКАЦИИ ДЛЯ ctags




Начало  Назад  Вперед



Книжный магазин