POSIX: C99との共通ヘッダ の1

というわけで、POSIXのうち、C99と共通するヘッダから入力を進めていくことにする。
POSIXは基本的にC99のスーパーセットになっているが、一部、C99から規格を制限する形でサブセットになっている部分が有る。例えば、POSIXのintは最低でも32bit必要となっているが、C99では16bit有れば良い(その代わりlongはどちらも最低32bit必要)。

assert

早速インスタンシエートできないマクロが。。assertはマクロであることが要求されている。
通常の関数と異なり、assertは任意のスカラ値を取る。このため引数に型が無く、yuniFFIでは表現できない。
今回はスキップする。POSIX固有の拡張は無い。

complex

C99複素数型。これは言語要素でコンパイル時に検出することができないのでスキップする。POSIX固有の拡張は無い。

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

浮動小数点演算環境の設定。FFIと統合する良い方法が思いつかないのでスキップ。

float

コンパイル環境の浮動小数点演算環境を定義する定数群。ただのマクロなので取り敢えず宣言はしておく。。
浮動小数点(scheme的に言うとinexact)な値をエクスポートする珍しいヘッダ。他にはmath.hくらいしか無い。

inttypes

実は機械的コンパイラがサポートしているintNN_tを列挙する良い方法は無い。常識的には8 16 32 64くらいで十分。UNIXはoctalな文化圏が有るが12bitや36bit整数はPOSIXでは特に言及されない。
このヘッダで、文字列をエクスポートするマクロが初出現する。

iso646

お誕生日のサプライズくらいにしか用途が無いヘッダ。スキップ。

limits

hoge_MAX等を定義するマクロを提供している。これはC99にも有るが、POSIXではOSの各種要素のlimitsを表現するために大幅に提供シンボルを増やしている。何故。。
POSIXはcharが8bitであることを要求しているが、char単体はsignedでもunsignedでも構わない。

11/26 = 42 %

ヘッダの数だけで言うと42 %終っているが、実際には殆どのAPI定義が集中するstd系のヘッダが未だなので1/4も行っていないと思う。
これらの値を実際に比較するためのコンパイル環境は現在準備中。