grepを読む(その3)

続きです。

1315       /* Print the group separator unless the output is adjacent to
1316          the previous output in the file.  */
1317       if ((0 <= out_before || 0 <= out_after) && used
1318           && p != lastout && group_separator)
1319         {
1320           pr_sgr_start_if (sep_color);
1321           fputs_errno (group_separator);
1322           pr_sgr_end_if (sep_color);
1323           putchar_errno ('\n');
1324         }

1317,1318行目のif文から読み取ることが難しいので、コメント文が頼りです。
出力が前の出力と隣接しない限りはグループセパレータをPrintする、とありますね。

グループセパレータとはgroup_separatorで、このように定義されています。

 182 /* The group separator used when context is requested. */
 183 static const char *group_separator = SEP_STR_GROUP;

SEP_STR_GROUPは前にも見ましたが、このような定義でしたね。

  54 enum { SEP_CHAR_SELECTED = ':' };
  55 enum { SEP_CHAR_REJECTED = '-' };
  56 static char const SEP_STR_GROUP[] = "--";

grepの結果を仕切る文字列で、これ(緑色)のことです。

グループセパレータを引数にしている、この関数は何をしているのでしょう。

1321           fputs_errno (group_separator);

errnoのfputs?
よくわかりません。関数定義を見てみます。

 382 static void
 383 fputs_errno (char const *s)
 384 {
 385   if (fputs (s, stdout) < 0)
 386     stdout_errno = errno;
 387 }

ううっ、これはっ。引数をfputsした後、エラーが発生した場合に、errnoを記憶する処理のようですが、ん~。関数名が分かりにくいっ。
なるべくなら関数の内部を読まずに、ソースが読めることが理想なので、fputs_holding_errnoとかだったら中身見なかったかもしれません。まあholding errnoが正しい英語か分かりませんが。
まあそもそも関数化が必要だったのだろうかと思います。使用箇所は多くないので。

takk@deb9:~/tmp/grep-3.1/src$ grep fputs_errno grep.c
fputs_errno (char const *s)
  fputs_errno (input_filename ());
          fputs_errno (group_separator);
takk@deb9:~/tmp/grep-3.1/src$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA