grepの色の仕組み(その3)

続きです。

pr_sgr_startを実行している箇所を探します。

takk@deb9:~/tmp/grep-3.1/src$ grep -n pr_sgr_start grep.c
303:pr_sgr_start (char const *s)
316:pr_sgr_start_if (char const *s)
319:    pr_sgr_start (s);
1055:  pr_sgr_start_if (filename_color);
1064:  pr_sgr_start_if (sep_color);
1073:  pr_sgr_start_if (color);
1179:              pr_sgr_start (line_color);
1188:          pr_sgr_start_if (match_color);
1216:      pr_sgr_start (line_color);
1321:          pr_sgr_start_if (sep_color);
takk@deb9:~/tmp/grep-3.1/src$

それほど多くないですね。pr_sgr_start_ifが混ざっているので、pr_sgr_startに限定しましょう。

takk@deb9:~/tmp/grep-3.1/src$ grep -n 'pr_sgr_start\>' grep.c
303:pr_sgr_start (char const *s)
319:    pr_sgr_start (s);
1179:              pr_sgr_start (line_color);
1216:      pr_sgr_start (line_color);
takk@deb9:~/tmp/grep-3.1/src$

各前5行を見てみましょう。各検索結果を見やすくするため空行も挿入します。

takk@deb9:~/tmp/grep-3.1/src$ grep -nB5 'pr_sgr_start\>' grep.c | perl -pe '$_.="\n\n\n" if /^\d+:/'
298-static const char *sgr_start = "\33[%sm\33[K";
299-static const char *sgr_end   = "\33[m\33[K";
300-
301-/* SGR utility functions.  */
302-static void
303:pr_sgr_start (char const *s)



--
314-}
315-static void
316-pr_sgr_start_if (char const *s)
317-{
318-  if (color_option)
319:    pr_sgr_start (s);



--
1174-              if (! print_line_head (b, match_size, lim, sep))
1175-                return NULL;
1176-            }
1177-          else
1178-            {
1179:              pr_sgr_start (line_color);



--
1211-  eol_size  += (lim - eol_size > beg && lim[-(1 + eol_size)] == '\r');
1212-  tail_size  =  lim - eol_size - beg;
1213-
1214-  if (tail_size > 0)
1215-    {
1216:      pr_sgr_start (line_color);



takk@deb9:~/tmp/grep-3.1/src$

切り分けするため、1つ1つ埋め込み確認をしていきたいと思います。
まずは、上の結果の318行目。color_option次第で、pr_sgr_startの実施を決めています。
pr_sgr_start_ifにprintfを埋め込んで確認したいと思います。

 315 static void
 316 pr_sgr_start_if (char const *s)
 317 {
 318   printf("[COLOR]=%d",color_option);
 319   if (color_option)
 320     pr_sgr_start (s);
 321 }

こんな感じにします。

では、makeして確認。

takk@deb9:~/tmp/grep-3.1/src$ make
takk@deb9:~/tmp/grep-3.1/src$ ./grep --color colorize grep.c
takk@deb9:~/tmp/grep-3.1/src$ ./grep --color colorize grep.c | tail

パイプ後は、埋め込んだ文字列は表示されていません。pr_sgr_start_ifからごっそり実行されていないんですね。

つづく

Leave a Reply

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

CAPTCHA