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

続きです。
[pr 3] [pr 4] [pr 5] それぞれみてみましょう。

まずは[pr 3]から。

  1323        /* Print the group separator unless the output is adjacent to
  1324           the previous output in the file.  */
  1325        if ((0 <= out_before || 0 <= out_after) && used
  1326            && p != lastout && group_separator)
  1327          {
  1328  printf("[pr 3]");
  1329            pr_sgr_start_if (sep_color);
  1330            fputs_errno (group_separator);
  1331            pr_sgr_end_if (sep_color);
  1332            putchar_errno ('\n');
  1333          }
  1334

コメントが、まさにそれっぽいですね。ファイルに出力する前に調整すると。
ここを必ず出力するようにすれば色が付きそうです。

続いて[pr 4]です。

  1335        while (p < beg)
  1336          {
  1337  printf("[pr 4]");
  1338            char *nl = memchr (p, eol, beg - p);
  1339            nl++;
  1340            prline (p, nl, SEP_CHAR_REJECTED);
  1341            p = nl;
  1342          }
  1343      }
  1344

ん~。よくわかりません。

続いて[pr 5]。

  1345    intmax_t n;
  1346    if (out_invert)
  1347      {
  1348  printf("[pr 5]");
  1349        /* One or more lines are output.  */
  1350        for (n = 0; p < lim && n < outleft; n++)
  1351          {
  1352            char *nl = memchr (p, eol, lim - p);
  1353            nl++;
  1354            if (!out_quiet)
  1355              prline (p, nl, SEP_CHAR_SELECTED);
  1356            p = nl;
  1357          }
  1358      }

これもよくわかりません。

ということで、[pr 3]の分岐を必ず通るようにして、色がつくか確認してみましょう。

1323       /* Print the group separator unless the output is adjacent to
1324          the previous output in the file.  */
1325 //      if ((0 <= out_before || 0 <= out_after) && used
1326 //          && p != lastout && group_separator)
1327 //        {
1328 printf("[pr 3]");
1329           pr_sgr_start_if (sep_color);
1330           fputs_errno (group_separator);
1331           pr_sgr_end_if (sep_color);
1332           putchar_errno ('\n');
1333 //        }

ビルドして、

takk@deb9:~/tmp/grep-3.1/src$ make
  CC       grep.o
  CCLD     grep
takk@deb9:~/tmp/grep-3.1/src$

パイプするとどうなるか確認。

[pr 3]は、もちろん通り、[COLOR]も表示されました。

つづく

Leave a Reply

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

CAPTCHA