Not only is the Internet dead, it's starting to smell really bad.:2007年05月25日分

2007/05/25(Fri)

[OpenBSD] http://www.openbsd.org/

アクセスすると403 Forbiddenになてる、謹んでご生前の(以下略)
cvswebは生きてるんだけど一部のソース消えてるげ、何かアナウンスあったっけ?

[NetBSD] u_int32_t vs uint32_t

@きっかけは

Citrusのコードで両者が混在してるのでちょっとお掃除しようかと思ったのだが
どっちを使うのが正しいのか判らんので調べてみる。

@調査結果

NetBSDが移植性の為にu_int32_tを導入したのが1994年。
<machine/types.h> rev1.3

んでhtonl(3)の引数がunsigned longに変わってu_int32_tに変更されたのが1996年。
<machine/endian.h> rev1.17*1

その後、htonl(3)はSUSv2(Single UNIX Specification version 2)に 取り込まれる
この時インタフェースが<sys/types.h> u_int32_tではなく、<inttypes.h> uint32_t に変更されている *2、1997年頃なのかなぁ。

ちなみにPOSIX(IEEE Std 1003.1-2004)/C99(ISO/IEC 9899:1999)ではuint32_tは
<stdint.h>に移されて<inttypes.h>は<stdint.h>をincludeすると改められる、変更の

NetBSDがPOSIX/C99対応の為に<inttypes.h>および<stdint.h>そしてuint32_tを導入したのが 2001年。
<sys/types.h> rev1.49

そして同時期にntohl(3)のSUSv2でのインタフェース変更をNetBSDに取り込んでいる。
<sys/endian.h> rev1.4
これはPOSIX互換(_POSIX_SOURCE)の場合のみで、それ以外はu_int32_tがこれまで通り使われている。

しかしこれは後に完全にuint32_tに置き換えられる、2005年の出来事。
<sys/endian.h> rev1.19
つまりPOSIX互換やC99互換(__STDC__ && __STDC_VERSION__ >= 199904L)のどちらでもない
ソースの場合でも、<sys/types.h>をインクルードすればuint32_tを使って構わないつーこと。

これを私は「u_int32_tからuint32_tへの置換を推奨する」と読んだんだけどどうだろう。
NetBSDの場合

typedef uint32_t	u_int32_t;

となっててu_int32_tはuint32_tの別名扱いだし、そもそもu_int32_tおよびuint32_tに対応するsigned型は
どちらもint32_tになってしまうので別物として扱うと話がややこしくなりそうだし。

一方FreeBSDでは

/*
 * XXX POSIX sized integrals that should appear only in <sys/stdint.h>.
 */
...
#ifndef _UINT32_T_DECLARED
typedef __uint32_t      uint32_t;
#define _UINT32_T_DECLARED
#endif
...
typedef __uint32_t      u_int32_t;

と、u_int32_tとuint32_tは別定義になってるし(まあ実体はどちらも<machine/_types.h> __uint32_tだけどさ)
ご丁寧にuint32_tには「XXX」なコメントまでつけてある。
なのでuint32_tとu_int32_tはちゃんと使い分けろといってるように見えるんだよね。

@結論

カレーとカリーぐらいの違いなので気にするだけ無駄だおwwwwwwwwwwwwwww
ちょっとemacs -e doctorしてきますね。

*1:この後backoutされたり、XPG4(X/Open Portability Guide Issue 4)に合わせてin_addr_tに変更された時期もある模様。
*2:OpenBSDの<sys/endian.h>やmanpageは未だにu_int32_tのままですな。