Добавить автоматический заголовок комментария для всех исходных файлов - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть стандартизированный способ написания комментариев до и после функции.Например, перед объявлением любой функции, которую я пишу,

 !---------------------------
 !  NAME_OF_FUNC           (no)
 !---------------------------

, где no - это n-я функция в данном файле, содержащем несколько функций.Я знаю, что функция, например, начинается с (соглашение Фортрана) либо подпрограммы NAME_OF_SUB, либо функции NAME_OF_FUNC.Следовательно, мой конечный результат будет

 !---------------------------
 !  NAME_OF_FUNC           (no)
 !---------------------------
 function NAME_OF_FUNC(...)

 end function 
 !---------------------------

Может кто-нибудь показать пример того, как написать сценарий bash или на любом другом языке сценариев код, который может пройти через все мои исходные файлы и стандартное соглашение, которое я простопоказал пример?

1 Ответ

2 голосов
/ 28 апреля 2019

Вот пример на Perl. Перед перезаписью резервное копирование не выполняется (я бы порекомендовал вам попытаться улучшить этот сценарий и добавить функции резервного копирования). Это также не добавляет маркер конца подпрограммы. Но было бы легко добавить эту функциональность, пожалуйста, попробуйте. Также предполагается, что вы хотите изменить все *.f95 файлы в текущем каталоге и все его подкаталоги:

use feature qw(say state);
use strict;
use warnings;
use File::Find::Rule;

my @files = File::Find::Rule->new->name('*.f95')->in('.');

for my $fn (@files) {
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my $txt = do {local $/; <$fh>};
    close $fh;
    process_txt( \$txt );
    save_txt( $fn, \$txt );
}

sub save_txt {
    my ( $fn, $txt ) = @_;

    open ( my $fh, '>', $fn ) or die "Could not open file '$fn': $!";
    print $fh $$txt;
    close $fh;
}

sub process_txt {
    my ( $txt ) = @_;

    my $i = 1;
    $$txt =~ s/^(.*(?i:function|subroutine)\s+)([a-zA-Z_]+)(\s*\(.*$)/
      do_substitution($1, $2, $3, $i++)/egmx;
}

sub do_substitution {
    my ( $head, $name, $end, $i ) = @_;

    my $line = $head . $name . $end;
    $line =~ s/\s+$//;
    my $N = length $line;
    my $cline = '!' . '-' x $N;
    my $mline = '!  ' . $name;
    my $snum = "($i)";
    my $M = (length $mline) + (length $snum);
    my $mspc = ($N > $M) ? (' ' x ($N-$M)) : '  ';
    $mline = $mline . $mspc . $snum;
    my $new_txt = join "\n", $cline, $mline, $cline, $line;
    return $new_txt;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...