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言語を勘で読んでみても、それなりに雰囲気は分かるってこと。これは大発見です。