lsのソースコードを少しだけ眺めてみました
C言語は苦手なbonlifeです。ls -l などの出力の日付項目の表現方法が6ヶ月を境に変わることに苛立ちを覚え、lsのソースコードを少しだけ眺めてみました。
まずは ls.c。lオプションが指定された場合、f_longform が 1 になって、その結果 printfcn に printlong がセットされる。フムフム。
続いて print.c。printlong の中では printtime が呼び出される。printtime の中には以下のようなマクロ定義が!
#define SIXMONTHS ((365 / 2) * 86400)
こいつを条件につかって format を変更していましたよ。犯人はコイツか。近くに f_sectime ってのがある場合は秒まで表示させちゃうぜ的なコードがあったので再び ls.c をチェック。オプションとしてTが(lと共に)指定されいる場合には、詳細情報を表示するっぽい。ほほう、便利っぽいじゃないか、と思って会社のAIXで試してみると…
ls: 認識できないフラグ: T
使用方法: ls [-1ACFLNRabcdefgilmnopqrstux] [File...]
やっぱりね…。
ガッカリついでにぐにゃぐにゃした処理をしてそうなGNUのlsもチェック。coreutils をダウンロードして関係しそうなファイルを斜め読み。
予想以上にぐにゃぐにゃしてました。脱線しながら人間にやさしい表示をするhオプションまわりを調べてたら、human.c に結構面白いコードがありましたよ。
static const char power_letter[] = { 0, /* not used */ 'K', /* kibi ('k' for kilo is a special case) */ 'M', /* mega or mebi */ 'G', /* giga or gibi */ 'T', /* tera or tebi */ 'P', /* peta or pebi */ 'E', /* exa or exbi */ 'Z', /* zetta or 2**70 */ 'Y' /* yotta or 2**80 */ };
なんと yotta まで用意されているのです!当たり前な気もするけど、なんとなく感動しました。PowerShellなんてTB時代にKB、MB、GBにしか対応していないのにね。そうそう、yotta はイタリア語で 8 を意味する otto からキてるらしいです。8ottoってバンド名は近未来のGeekにウケそうな予感。
ひとつ分かったのは、苦手なC言語を勘で読んでみても、それなりに雰囲気は分かるってこと。これは大発見です。