関数の宣言のを自動化したい。

cで面倒なのが、関数を使う前に宣言されてないと使えないって所。関数名変えたり、引数変えたりすると面倒な作業が増えるので、自動化しちゃいたいなぁ・・・と思って、適当に作ってみた。

header

##!/usr/bin/perl

my $tags = "tag";

(system("ctags -o $tags $ARGV[0]") == 0) || die "cannot execute ctags";

open FH, $tags || die "cannot open tags";

while(<FH>) {
    chop;
    if (/^!/) { next; }
    my @cols = split(/\t/);
    unless ($cols[3] =~ /f/) { next; }
    if ($cols[2] =~ /\bmain\b/) { next; }
    $cols[2] =~ s/^\/\^//;  # 先頭
    $cols[2] =~ s/\$.*$//;  # 末尾
    $cols[2] =~ s/\s*{.*//; # 括弧
    print $cols[2] . ";\n";
}

close FH;

unlink $tags;

ctagsから引っ張ってきて要らないものを消す。ただし、関数宣言は1行に収まってないとマズイ。

使いかたは、パスの通った所にheaderで保存。chmod +rして。っと。

カーネル2.4のtime.cでも覗いてみる。

% header time.c
int do_adjtimex(struct timex *txc);
int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);
int pps_shift = PPS_SHIFT;;
long pps_stabil = MAXFREQ;;
asmlinkage long sys_adjtimex(struct timex *txc_p);
asmlinkage long sys_gettimeofday(struct timeval *tv, struct timezone *tz);
asmlinkage long sys_settimeofday(struct timeval *tv, struct timezone *tz);
asmlinkage long sys_stime(int * tptr);
asmlinkage long sys_time(int * tloc);
inline static void warp_clock(void);

うまくいってる様子。

K&R系なら、うまく引っ張ってこれる。GNU系は全然ダメ。

では、Vimから使う。#include の後位にカーソル持ってきて、

:r !header %

うは、便利。

todo

  • あんまりprelわかってない。
  • staticを除くオプションを付けたい。
  • staticだけのオプションも付けたい。

参考