特定の文字列を含むセクションだけを抜き出す (続き)
きむらさんのこういう部分はいろいろためになります。
1. ある大きさをまとめて読んでくる 2. 読んできた中にRSにマッチする文字列があれば 1. RSにマッチした位置より前の部分を今回読み込んだレコードとして設定する 2. RSにマッチした部分文字列をRTに設定する 3. RSにマッチするものがなければ、ストリームから読み足してくる 3. 読み込んだレコードのフィールド分割を行う 4. ルールの適用
gawk 自体で Cygwin で分岐している部分もあります。
io.c で以下のようになっていて、
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__EMX__) || defined(__CYGWIN__) /* binmode --- convert BINMODE to string for fopen */ static const char * binmode(const char *mode) { switch (mode[0]) { case 'r': if ((BINMODE & 1) != 0) mode = "rb"; break; case 'w': case 'a': if ((BINMODE & 2) != 0) mode = (mode[0] == 'w' ? "wb" : "ab"); break; } return mode; }
awk.h で以下のような設定になっています。
#if ! defined(MSDOS) && ! defined(OS2) && ! defined(WIN32) && ! defined(__EMX__) && ! defined(__CYGWIN__) && ! defined(O_BINARY) /*duh*/ #define O_BINARY 0 #endif
なんとなく、gawk の BINMODE と絡んできそうです。
このへんを元に (時間があったら) 会社で挙動を調べてみます。