続きです。
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$

コメント