#! /usr/bin/env perl
use strict;
use warnings;
my $prev_return;
while (<>) {
# assume letter in first column introduces a function return type
if (my($return_type) = /^([^\W\d]\w*)/) {
if ($return_type eq "void" && defined $prev_return) {
print $prev_return;
}
undef $prev_return; # reset after each function definition
}
elsif (/\\return\b/) {
$prev_return = "$ARGV:$.: $_";
}
}
continue {
close ARGV if eof; # reset $. at the end of each named file
}
注: このパターン[^\W\d]
は、二重否定技法を使用して、数字ではない「単語文字」、つまり文字やアンダースコアに一致させます。
出力例:
$ cat file.c
/*!
* \brief foo 関数
* \成功した場合は OK を返し、それ以外の場合は ERROR を返します
*/
void foo(ボイド)
{
...
}
\return fdsklj
ボイドバー(void)
ボイドバズ
$ ./doxygen-return-void file.c
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj
ダイヤモンド演算子としても知られるPerl の<>
を使用すると、Unix スタイルのフィルターを簡単に作成できます。これは、好きなだけパスに名前を付けることができることを意味します。
$ ./doxygen-return-void file.c file.c
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj
file.c:3: * \return 成功した場合は OK、それ以外の場合は ERROR
file.c:10: \return fdsklj
上記のプログラムも標準入力を消費しますが、出力はあまり役に立ちません。
$ cat file.c | ./doxygen-return-void
-:3: * \成功した場合は OK を返し、それ以外の場合は ERROR を返します
-:10: \return fdsklj