続きです。
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って、どんな意味なんでしょう。
つづく
コメント