Простой скрипт для подсчета NLOC? - PullRequest
6 голосов
/ 27 ноября 2008

Знаете ли вы простой скрипт для подсчета NLOC (нетто-строк кода). Скрипт должен считать строки кода C. Он не должен считать пустые строки или строки только фигурными скобками Но это не должно быть слишком точным.

Ответы [ 14 ]

1 голос
/ 27 ноября 2008

Проверьте плагин DPack для Visual Studio. Имеется статистика для любого решения / проекта.

0 голосов
/ 14 декабря 2008

Не простой скрипт, но CCCC (C и C ++ Code Counter) существует уже некоторое время, и он прекрасно работает для меня.

0 голосов
/ 13 декабря 2008

Следующий скрипт получит счетчик всех файлов, соответствующих шаблону в данном каталоге.

# НАЧАЛО СКРИПТА

файлы var str
var str dir

set $ files = "* .cpp" # <===================== Установите здесь свой шаблон имени файла. <br> set $ dir = "C: / myproject" # <===================== Установите здесь каталог вашего проекта. </p>

# Получить список файлов в переменной fileList.
var str fileList
найти -rn файлы ($ files) dir ($ dir)> $ fileList

# Объявите переменные, в которые мы будем сохранять количество отдельных файлов.
var int c # все строки
var int nb # непустые строки

# Объявите переменные, в которых мы сохраним общее количество для всех файлов.
var int totalc # общая сумма всех строк
var int totalnb # сумма всех непустых строк

# Объявить переменную, в которой мы будем хранить количество файлов.
var int fileCount

# Мы будем хранить имя файла, над которым мы сейчас работаем, в следующем.
файл var str

# Перейдите по списку $ fileList один за другим.
while ($ fileList <> "")
делать
# Извлечь следующий файл.
lex "1" $ fileList> $ file

# Проверьте, является ли это плоским файлом. Мы не заинтересованы в каталогах.
af $ file> null # Мы не хотим видеть вывод.
# Мы хотим установить только переменную $ ftype.
if ($ ftype == "f")
делать
# Да, это плоский файл.

 # Increment file count.<br>
set $fileCount = $fileCount+1<br>

# Collect the content of $file in $content<br>
var str content # Content of one file at a time<br>
repro $file >$content<br>

# Get count and non-blank count.<br>
set $c={len -e $content}<br>
set $nb={len $content}<br>

echo -e "File: " $file ", Total Count: " $c ", Non-blank Count: " $nb<br>

# Update total counts.<br>
set $totalc = $totalc + $c<br>
set $totalnb = $totalnb + $nb<br>

сделано
ENDIF

сделано

Показать итоги

эхо "********************************************* ************************************************** *********************************** "
echo "Общее количество всех строк: \ t" $ totalc ", \ tTotal Количество непустых строк: \ t" $ totalnb ", Всего файлов:" $ fileCount
echo "************************************************ ************************************************** ******************************** "

# КОНЕЦ СКРИПТА

Если вы хотите, чтобы количество строк в файлах было изменено только в 2008 году, добавьте ($ fmtime> = "2008") и т. Д.

Если у вас нет бит-скриптинга, получите его от .com.

0 голосов
/ 28 ноября 2008

У меня есть программа под названием scc, которая удаляет комментарии C (и комментарии C ++, хотя с C99 они одинаковы). Примените это плюс фильтр для удаления пустых строк и, если необходимо, строк, содержащих только открытые и закрытые скобки, для генерации количества строк. Я использовал это на внутренних проектах - не нужно было скидывать скобки открытия / закрытия. Эти сценарии были более сложными, сравнивая исходный код для двух разных версий существенного проекта, хранящегося в ClearCase. Они также вели статистику по добавленным и удаленным файлам, а также по добавленным и удаленным строкам из общих файлов и т. Д.

Не считая фигурных скобок, имеет значение:

Black JL: co -q -p scc.c | scc | sed '/^[       ]*$/d' | wc -l
     208
Black JL: co -q -p scc.c | scc | sed '/^[       {}]*$/d' | wc -l
     144
Black JL: co -p -q scc.c | wc -l
     271
Black JL:

Итак, 144 строки под ваши правила; 208 считая открытых и закрытых фигурных скобок; 271, считая все.

Позвольте мне знать, если вы хотите код для scc (отправьте письмо на первую точку в последнюю очередь на gmail точка com). Это 13 килобайт сжатого tar-файла, включая man-страницу, тест на пытки и некоторые библиотечные файлы.


@ litb отметил, что 'cpp -fpreprocessed -P file' обрабатывает удаление Комментарии. В основном это так. Тем не менее, когда я запускаю его на стресс-тест для SCC он жалуется, когда (по моему мнению) он не должен:

SCC has been trained to handle 'q' single quotes in most of
the aberrant forms that can be used. '\0', '\', '\'', '\\
n' (a valid variant on '\n'), because the backslash followed
by newline is elided by the token scanning code in CPP before
any other processing occurs.

Когда CPP из GCC 4.3.2 обрабатывает это, он жалуется (предупреждает):

SCC has been trained to handle 'q' single quotes in most of
<stdin>:2:56: warning: missing terminating ' character
the aberrant forms that can be used. '\0', '\', '\'', '\\
<stdin>:3:27: warning: missing terminating ' character
n' (a valid variant on '\n'), because the backslash followed
by newline is elided by the token scanning code in CPP before
any other processing occurs.

Раздел 5.1.1.2 Фазы перевода стандарта C99 гласят:

Приоритет среди синтаксических правил перевода определяется следующими этапами. ( Сноска 5 )

  1. Отображаются многобайтовые символы физического исходного файла в определенной реализацией образом, к исходному набору символов (ввод символов новой строки для индикаторы конца строки) при необходимости. Триграф последовательности заменяются соответствующие односимвольные внутренние представления.

  2. Каждый экземпляр символа обратной косой черты () сразу же сопровождается новой строкой символ удаляется, объединяя физические исходные строки для формирования логических исходных строк. Только последняя обратная косая черта в любой строке физического источника имеет право быть частью такого сращивания. Исходный файл, который не является пустым, должен заканчиваться символом новой строки, которому не должен предшествовать символ обратной косой черты перед любым таким происходит сращивание.

Сноска 5:

(5) Реализации должны вести себя так, как будто эти отдельные фазы происходят, даже хотя на практике многие обычно складываются вместе.

Следовательно, на мой взгляд, CPP неправильно обрабатывает второй этап в тексте примера. Или, по крайней мере, предупреждение не то, что я хочу - конструкция является допустимой C, и это не самоочевидно, что предупреждение оправдано.

Конечно, это крайний случай, и допускаются дополнительные предупреждения. Но это раздражало бы живые дневные огни из меня. Если бы у меня не было своего собственного, возможно, лучшего инструмента для работы, тогда подойдет 'cpp -fpreprocessed -P' - это крайний крайний случай, на который я жалуюсь (и, возможно, было бы правомерно утверждать, что это более вероятно, что есть проблема, чем нет - хотя лучшая эвристика заметила бы, что линия была сращена, и результатом была допустимая константа из одного символа, и поэтому жалоба должна быть подавлена; если результат не был допустимой константой из одного символа, тогда должна быть подана жалоба. (В моем тестовом случае - по общему признанию, тест на пытки - CPP дает 13 проблем, в основном связанных с той, на которую я жалуюсь, где SCC правильно выдает 2.)

(Я заметил, что '-P' удается подавить директиву #line в выводе, который появляется, когда опция не указана.)

...