lsコマンドのソース(FreeBSD版)
http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/
Rev.1.86のls.c
- 「-D」オプションが追加されている
- 関数はmain ⇒ traverse ⇒ displayの流れで実行
- 関数ポインタが使われている
- fts関数しらない
ls -a -l dir
と実行したとき
0 | 1 | 2 | 3 |
ls | -a | -l | dirname |
getoptの解析完了時にはoptindは3。
341 argc -= optind; 342 argv += optind;
argcは4-3で1
argvはdirname文字列を指す位置に移動
461 if (argc) 462 traverse(argc, argv, fts_options); 463 else 464 traverse(1, dotav, fts_options);
traverse(argc, argv, fts_options)を実行
dirnameが渡されてなかったらargcは3-3で0なのでtraverse(1, dotav, fts_options)を実行
日本の Vim ユーザのためのハブサイト
memo
構造体メンバの配置順序
そして次に、全てのオブジェクト構造体が最初にstruct RBasic型のメンバbasicを持っていることに注目してほしい。この結果として、 VALUEがどの構造体へのポインタだろうとstruct RBasic*にキャストすればbasicメンバの内容にアクセスできる
http://i.loveruby.net/ja/rhg/book/object.html
メンバの配置順序は保証されるんだっけ??
と、まあ、ここまでは建前です。数ある処理系の中には、独自拡張(というより非標準仕様)によって、境界調整に応じて、メンバを適切に入れ替えることで、構造体のサイズの縮小を図るものがあります。
http://japan.renesas.com/fmwk.jsp?cnt=/tool_faq_2001050999.jsp&fp=/support/faqs/faq_results/Q105701-Q105800&site=
Rubyが動く(とされている)処理系では保証されるということか・・