GNU catを読む - 全体的な流れ
GNU catのソース読んでます。長くなってきたので分割しました。
小さな関数
- usageの処理はGNU定番の超絶テク。必見。
- 行番号の処理が凄い。写経しよう。
main()
- getopt_longは定番の処理。
- fstat (STDOUT_FILENO, &stat_buf)の意味がイマイチわからん。STDOUTのfstat??何が出てくる??
- /* main loop */直後に-(標準入力)の処理がある。
- STREQは、strcmpのマクロ。
- isatty - ディスクリプタが端末かどうか。
- fropen()はストリームを指定してファイルを開く。
- O_BINARYは
にない。lib/fcntl_.hで定義されてる。たぶん非標準。 - Gauche:Windows/VC++:log:detail_2005を読むと、Windowsへの移植の再に問題が起こるっぽい。
- おごちゃんのホームページ | Linuxプログラミング入門(4)ファイルモードの所がわかりやすい。
- Manpage of CATのDOS用記述。
- Windowsダメ過ぎ。
- O_BINARYの場合、freopen (NULL, "rb", stdin)としてファイルを開き直してる。
- check_redirectionフラグを見て、インプットとアウトプットが同じファイルだとエラーを吐く。頭良いデス。
% cat hoge.txt > hoge.txt cat: hoge.txt: input file is output file
- ptr_alignはsystem.hにある。system.hは便利関数&マクロ詰まりまくり。必見。
- ST_BLKSIZEマクロは基本的にstat.st_blksizeを返す。取得出来ない場合は、# define DEV_BSIZE 4096辺りを返すみたい。system.h参照。
- pageがイマイチわかってない。
- manから引用。getpagesize() 関数はページの大きさをバイト数で返す。ここでの「ページ」は mmap(2) の説明の中で使用されているもので 、mmap() はこのページサイズの単位でファイルをマップする。
- 移植性が必要なアプリケーションでは、このシステムコールの代わりに sysconf(_SC_PAGESIZE) を利用すべきである。 えぇぇぇ。
- 全然わからん。うぅぅぅ。
- お!プログラミングLinux 12.2メモリマッピングに書いてあった。買って正解だったぜ980円やるな!!しかし・・・長い・・・。
- ふむふむ。むじぃ。
- P201 map_cat.c!!グレイト!!mmapでcatを作るサンプルあり。
- おぉ。コンピューター:C言語講座:mmapについて素晴らしいサンプルアリ。
- xmalloc (insize + page_size - 1)とメモリを確保すれば充分なメモリサイズの目安になりそうだ(違うかも)
- ptr_align (inbuf, page_size)で、バッファメモリの先頭を出してる。複雑・・・。
cat()
- cat()で処理されるフラグはこれだけ。フラグが立ってない時はsimple_cat()へGO!
- bool show_nonprinting
- bool show_tabs
- bool number
- bool number_nonblank
- bool show_ends
- bool squeeze_blank -sオプション。連続した空白行をまとめる。かなり有用。
ソースから見たcatの役割
- ファイルを連結する。
- 連続空白行をまとめる。(空白行は1つだけになる)
- 行番号を見る。
- 可視化。
あぁ・・・catのソースだけでも知らないことだらけだ・・・。思った以上に収穫が大きい。
GNU cat侮るなかれ。読むべし。