関数の宣言のを自動化したい。
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);
うまくいってる様子。
では、Vimから使う。#include の後位にカーソル持ってきて、
:r !header %
うは、便利。
todo
- あんまりprelわかってない。
- staticを除くオプションを付けたい。
- staticだけのオプションも付けたい。
参考
- Super Technique 講座〜マクロの技
- 改造させてもらいました。
- 複数ファイル対応。makeに入れて使。
- ほぼコピペ(笑