grepを読む(その11)

続きです。

mainを読んでいきます。
mainなので、switch caseのかさばるオプション処理がほとんどだと思いますが。まあ、最初から見ていきましょう。

2413 int
2414 main (int argc, char **argv)
2415 {
2416   char *keys = NULL;
2417   size_t keycc = 0, oldcc, keyalloc = 0;

まずはkeys、keycc、oldcc、keyallocというローカル変数の登場。
ソースを読む時に楽しいことの一つが、変数の名前から処理を想像するってのがあります。
で、これらの変数名から、想像できるかというと・・・ちょっと敷居が高かったです。

さらに他のローカル変数も見てみましょう。

2418   int matcher = -1;
2419   bool with_filenames = false;
2420   size_t cc;
2421   int opt, prepended;
2422   int prev_optind, last_recursive;
2423   int fread_errno;
2424   intmax_t default_context;
2425   FILE *fp;

matcher。-1が初期値で代入されてるってことは、0以上の数が有効な数値に違いないです。マッチした数でしょうか。マッチ数を英語的にmatcherというかは謎です。

with_filenamesは、たぶんそのままですね。検索結果にファイル名を含めるかのフラグでしょう。
ccは、まったく分かりません。
optは、オプション関連かと思います。intなのでoptの数とかでしょうか。
FILE *fpは、grepをする対象のファイルをオープンするためのファイルポインタですね。
まあ、こんな風に、変数名で、いろいろ想像します。大半は間違っていますが。

さらに読み進めます。

2426   exit_failure = EXIT_TROUBLE;
2427   initialize_main (&argc, &argv);
2428
2429   eolbyte = '\n';
2430   filename_mask = ~0;
2431
2432   max_count = INTMAX_MAX;
2433

グローバル変数の初期化ですね。exit_failureは、grepのプログラムが終了した時のエラーコードでしょう。

initialize_main。main処理の初期化ってよく分かりません。この処理が何をやっているか覚えたらステップアップできそうです。

eolbyte。当然End Of Lineの略ですね。改行コードで初期化されていますが、EOLのキャラクタが改行以外にも、変化するのでグローバル変数なんでしょう。

filename_mask。 0を反転。ん? ~って反転でしたっけ? 忘れたなら、プログラミングして即確認。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>
int main()
{
        printf("~0 = %x\n",~0);
}
takk@deb9:~/tmp$
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out
~0 = ffffffff
takk@deb9:~/tmp$

~0は、bit反転で、合ってました。

filename_maskなのに、オール1のbitって、どんな意味なんでしょう。

つづく

Leave a Reply

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

CAPTCHA