ごとけんです。

bigendian で float と double を読み書きする必要が出たので、
pack/unpack のテンプレート文字に対して以下のような拡張を
考えました。

  F   bigendian の単精度浮動小数点数(機種依存)
  D   bigendian の倍精度浮動小数点数(機種依存)

pack.c をみると、 F と D はそれぞれ f と d と同じ
扱いになっているにもかかわらず、これらの文字は
文書に書かれていないのに目を付けたわけです。
このような拡張を取り込んでもらえますか??

んで、 F のほうはとりあえず動くのを書いてみたのですが 
D のほうがなかなか書けません。どなたか教えていただけ
ませんか??

# 関係ないけど FreeBSD の machine/endian.h をみたら
# PDP_ENDIAN ってのも定義されてました。その順番は
# 3,4,1,2 つまり LSB first in word, MSW first in long 
# なんだそうです @_@

-- gotoken

--- ruby-1.3/pack.c.orig Wed Dec 23 01:22:26 1998 +++ ruby-1.3/pack.c Sat Jan 23 02:21:00 1999 @@ -6 +6 @@ - $Date: 1998/12/16 07:30:32 $ + $Date: 1998/12/25 04:35:41 $ @@ -21,0 +22,9 @@ +#define swapf(x) swapl(x) +#define swapd(x) ((((x)&0xFF)<<56) \ + +(((x)>>56)&0xFF) \ + +(((x)&0x000000000000FF00)<<40) \ + +(((x)&0x00FF000000000000)>>40) \ + +(((x)&0x0000000000FF0000)<<24) \ + +(((x)&0x0000FF0000000000)>>24) \ + +(((x)&0x00000000FF000000)<<8) \ + +(((x)&0x000000FF00000000)>>8) ) @@ -50,0 +60,4 @@ +#define ntohf(x) (endian()?(x):swapl(x)) +#define ntohd(x) (endian()?(x):swapd(x)) +#define htonf(x) (endian()?swapl(x):(x)) +#define htond(x) (endian()?swapd(x):(x)) @@ -58,0 +72,4 @@ +#define ntohf(x) (x) +#define ntohd(x) (x) +#define htonf(x) (x) +#define htond(x) (x) @@ -69,0 +87,4 @@ +#define ntohf(x) swapl(x) +#define ntohd(x) swapd(x) +#define htonf(x) swapf(x) +#define htond(x) swapd(x) @@ -382,0 +404,18 @@ + while (len-- > 0) { + float f; + + from = NEXTFROM; + switch (TYPE(from)) { + case T_FLOAT: + f = RFLOAT(from)->value; + break; + case T_STRING: + f = atof(RSTRING(from)->ptr); + default: + f = (float)NUM2INT(from); + break; + } + rb_str_cat(res, (char*)&f, sizeof(float)); + } + break; + @@ -385,0 +425 @@ + unsigned long ultemp; @@ -397,0 +438,3 @@ + memcpy(&ultemp,&f,sizeof(float)); + ultemp = htonf((unsigned long)ultemp); + memcpy(&f,&ultemp,sizeof(float)); @@ -904 +946,0 @@ - case 'F': @@ -914,0 +957,16 @@ + case 'F': + if (len >= (send - s) / sizeof(float)) + len = (send - s) / sizeof(float); + while (len-- > 0) { + float tmp; + unsigned long ultemp; + + memcpy(&tmp, s, sizeof(float)); + memcpy(&ultemp,&tmp,sizeof(float)); + ultemp = ntohf((unsigned long)ultemp); + memcpy(&tmp,&ultemp,sizeof(float)); + s += sizeof(float); + rb_ary_push(ary, rb_float_new((double)tmp)); + } + break; +