続きです。
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$
コメント