天泣記

2010-12-02 (Thu)

#1

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"]
...

2010-12-04 (Sat)

#1

ファイル名・行番号も出すならこうか

% 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 するイテレータがあっても良い気がする

2010-12-26 (Sun)

#1

Debian BTS #607979: The argument for IP_MULTICAST_IF socket option

2010-12-30 (Thu)

#1

csvtool を試す。

ふむ。コマンドになっているのはいいな。だが、カラムを番号で指定するのが基本なのはちょっとな。

あと、join の仕様はどういう意図なのだろう。


[latest]


田中哲