grepを読む(その2)

続きです。

1299   if (!out_quiet && pending > 0)
1300     prpending (beg);

out_quietは、outは出力、quietは静かな、なので、「静かな出力」。。。ん~。色を付けないってことでしょうか。

pendingは、日本語でも使いますね。保留って意味でしょう。

prependingは、prependの名詞ですね。prependは先頭に追加するという意味です。

各変数定義の説明を読んでみます。

1027 static intmax_t pending;        /* Pending lines of output.
1028                                    Always kept 0 if out_quiet is true.  */

Pending linesとあるので、pendingは、出力保留行の行数のようですね。
次行きます。

1301
1302   char *p = beg;
1303
1304   if (!out_quiet)
1305     {
1306       /* Deal with leading context.  */
1307       char const *bp = lastout ? lastout : bufbeg;
1308       intmax_t i;
1309       for (i = 0; i < out_before; ++i)
1310         if (p > bp)
1311           do
1312             --p;
1313           while (p[-1] != eol);
1314

コメントのDeal withは~対応する、で、contextは文脈、
先頭の文脈に対応する、でしょうか。

lastoutの定義を読んでみます。

1023 static char *lastout;           /* Pointer after last character output;
1024                                    NULL if no character has been output
1025                                    or if it's conceptually before bufbeg. *

lastoutはそのままっぽいです。最後に出力した文字の後のポインタですね。

1309行目でout_beforeという変数も使われているので、定義箇所を見てみます。beforeもあればafterもあるようです。

1010 static intmax_t out_before;     /* Lines of leading context. */
1011 static intmax_t out_after;      /* Lines of trailing context. */

こうして読んでいくと、意外にグローバル変数が多く使われていますね。

で、いろんなポインタやら行数やらを使って何をしているかというと、
この3行で、begポインタをEOLの位置まで戻しているだけのようです。

1311           do
1312             --p;
1313           while (p[-1] != eol);

すっきりした書き方の参考になります。

前の2行を合わせてみると、一切{}を使っていないのが、美しい。

1309       for (i = 0; i < out_before; ++i)
1310         if (p > bp)
1311           do
1312             --p;
1313           while (p[-1] != eol);

まあ、私の好みってだけかもしれません。

つづく

Leave a Reply

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

CAPTCHA