5.1 には atoll が無い

急遽、AIX 5.1 な環境で long long を使う必要が湧いて出た。値の範囲が long では足りなくなったためだ。
既存のソースでは atol を使っていたので、安直に atoll にすればよいかと思ったが、これがうまくない。無いみたいなのだ。

 AIX5100-09 % oslevel -r
 5100-09
 AIX5100-09 % lslpp -hac bos.rte.libc | sort | tail -1
 /usr/lib/objrepos:bos.rte.libc:5.1.0.69::COMMIT:COMPLETE:07/09/25:10;04;40
 AIX5100-09 % nm /usr/lib/libc.a | grep atol
 ../../../../../../../src/bos/usr/ccs/lib/libc/atol.c f           -
 .atol                T      319216
 .watol               T     1476716
 atol                 D      262148          12
 watol                D      280756          12

一方、AIX 5.2 の libc にはちゃんと装備されているようだ。

 AIX5200-10 # oslevel -r
 5200-10
 AIX5200-10 # lslpp -hac bos.rte.libc | sort | tail -1
 /usr/lib/objrepos:bos.rte.libc:5.2.0.107::COMMIT:COMPLETE:11/27/08:09;41;08
 AIX5200-10 # nm /usr/lib/libc.a | grep atol
 ../../../../../../../src/bos/usr/ccs/lib/libc/atol.c f           -
 ../../../../../../../src/bos/usr/ccs/lib/libc/atoll.c f           -
 .atol                T      305824
 .atoll               T      818548
 .watol               T     1473336
 atol                 D      274048          12
 atoll                D      274060          12
 watol                D      292824          12

AIX 5.1 は既に EOL なので、今さら libc が更新されるとは考えにくい*1。念のため最終FIX (Post ML9 Bundle) まで確認したが、やはり存在しないものは存在しない。仕方がないので strtoll を用いて書いた。書いてみてからいろいろ探ったら、手もとにあった FreeBSD の libc のソース*2によれば、atoll とは strtoll の wrapper のようだ。テストもうまく通った。

規格に照らしてみれば、atoll は C99 に含まれるようだ。逆に言えば C90 には含まれていない。

要するに 5.2 以上に上げなさい…ということで FA と言えよう。