POSIX: C99との共通ヘッダ の1
というわけで、POSIXのうち、C99と共通するヘッダから入力を進めていくことにする。
POSIXは基本的にC99のスーパーセットになっているが、一部、C99から規格を制限する形でサブセットになっている部分が有る。例えば、POSIXのintは最低でも32bit必要となっているが、C99では16bit有れば良い(その代わりlongはどちらも最低32bit必要)。
assert
早速インスタンシエートできないマクロが。。assertはマクロであることが要求されている。
通常の関数と異なり、assertは任意のスカラ値を取る。このため引数に型が無く、yuniFFIでは表現できない。
今回はスキップする。POSIX固有の拡張は無い。
complex
ctype
文字タイプ。やっと入力できるヘッダが来た。。
POSIXではlocale_tを取る*_l関数が追加され、廃止予定としてisascii(_l)が有る。
errno
言わずと知れたerrno。如何にもPOSIXっぽいが、実はC99でもEDOM、EILSEQ、ERANGEを要求している。逆にEINVALとかEFAULTのような超メジャーerrnoはC99規格に無い。
errno.hで、インスタンシエートされるマクロ変数としてerrnoが登場する。多くの実装で、errnoはTLSへの参照に展開される。
errnoはmodifiable lvalueとして展開されるべきとなっているので、値のセットも合法となっている。このため、"errnoの値を取得する関数"だけでなく、"errnoの値をセットする関数"も生成してやる必要がある。
The symbol errno shall expand to a modifiable lvalue of type int.
普通errnoの値とかセットしないだろと思いきや、POSIXはerrnoの値でエラーを検出したい場合はゼロにリセットしろと推奨している。
An application that needs to examine the value of errno to determine the error should set it to 0 before a function call, then inspect it before a subsequent function call.
でもerrnoの正しい用法は、関数がエラーを返したときに初めて値をチェックすることなので、通常の人間はやっぱりerrnoに値をセットする必要は無い。
fenv
float
コンパイル環境の浮動小数点演算環境を定義する定数群。ただのマクロなので取り敢えず宣言はしておく。。
浮動小数点(scheme的に言うとinexact)な値をエクスポートする珍しいヘッダ。他にはmath.hくらいしか無い。
inttypes
実は機械的にコンパイラがサポートしているintNN_tを列挙する良い方法は無い。常識的には8 16 32 64くらいで十分。UNIXはoctalな文化圏が有るが12bitや36bit整数はPOSIXでは特に言及されない。
このヘッダで、文字列をエクスポートするマクロが初出現する。
iso646
お誕生日のサプライズくらいにしか用途が無いヘッダ。スキップ。