C のソースからマクロの定義を 取り出す。(継続行を考慮する。でもコメントは気にしない)
Enumerable#chunk を使う。
% ruby -rpp -e ' s = cont = false ARGF.chunk {|line| [cont, (cont = /\\\n/ =~ line)][0] ? s : s = /\A\#\s*define\s/ =~ line ? $. : :_separator }.each {|_, lines| pp lines } ' array.c ["# define NDEBUG\n"] ["#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))\n"] ["#define ARY_DEFAULT_SIZE 16\n"] ["#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))\n"] ["# define ARY_SHARED_P(ary) \\\n", " (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \\\n", " FL_TEST((ary),ELTS_SHARED)!=0)\n"] ["# define ARY_EMBED_P(ary) \\\n", " (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \\\n", " FL_TEST((ary), RARRAY_EMBED_FLAG)!=0)\n"] ...
ファイル名・行番号も出すならこうか
% ruby -rpp -e ' s = cont = false ARGF.chunk {|line| [cont, (cont = /\\\n/ =~ line)][0] ? [ARGF.filename, s[1]] : s = /\A\#\s*define\s/ =~ line ? [ARGF.filename, ARGF.file.lineno] : :_separator }.each {|pos, lines| pp [pos, lines] } ' array.c [["array.c", 19], ["# define NDEBUG\n"]] [["array.c", 23], ["#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))\n"]] [["array.c", 29], ["#define ARY_DEFAULT_SIZE 16\n"]] [["array.c", 30], ["#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))\n"]] [["array.c", 48], ["# define ARY_SHARED_P(ary) \\\n", " (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \\\n", " FL_TEST((ary),ELTS_SHARED)!=0)\n"]] ...
ARGF に [ファイル名, 行番号, 行] を yield するイテレータがあっても良い気がする
csvtool を試す。
ふむ。コマンドになっているのはいいな。だが、カラムを番号で指定するのが基本なのはちょっとな。
あと、join の仕様はどういう意図なのだろう。
[latest]