[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:7961] Re: Doesn't build on Alpha

From: matz@... (Yukihiro Matsumoto)
Date: 1999-10-03 15:10:57 UTC
List: ruby-dev #7961
まつもと ゆきひろです

In message "[ruby-dev:7959] Re: Doesn't build on Alpha"
    on 99/10/03, Shugo Maeda <shugo@netlab.co.jp> writes:

|前田です。

|> これって浮動小数点がらみだから文字列に変換したときに違う値に
|> なっちゃう処理系があっても不思議じゃないですよね.
|
|そっちの方なんですかね。

浮動小数点数の方はビットパターンを直接読み書きしてるんで、違
う値になる処理系はないだろうと推測します。むしろ、

|		rb_str_cat(res, (char*)&l, NATINT_LEN(long,4));
|
|というのがあやしいかなと思ったりしたのですが。

の方でしょう。Perlはちゃんと調整してました。

Alphaってbig/little両方のエンディアンが選択できる石だったと
思うんですが、Linux/Alphaってどっちなんですかね。littleだと
「間違いなく」問題が起きます。

パッチはこんな感じかなあ。
# むつみさんに試してもらうように頼んでもらえません? > やまださん

--- /tmp/pack.c	Mon Oct  4 00:06:57 1999
+++ pack.c	Mon Oct  4 00:01:48 1999
@@ -24,8 +24,17 @@
 #ifdef NATINT_PACK
 # define NATINT_LEN(type,len) (natint?sizeof(type):(len))
+# ifndef WORDS_BIGENDIAN
+#   define OFF16(p) ((char*)(p) + (natint?(sizeof(short) - 2):0))
+#   define OFF32(p) ((char*)(p) + (natint?(sizeof(long) - 4):0))
+# endif
 #else
 # define NATINT_LEN(type,len) sizeof(type)
 #endif
 
+#ifndef OFF16
+# define OFF16(p) (char*)(p)
+# define OFF32(p) (char*)(p)
+#endif
+
 #define define_swapx(x, xtype)		\
 static xtype				\
@@ -547,5 +556,5 @@
 		    s = NUM2INT(from);
 		}
-		rb_str_cat(res, (char*)&s, NATINT_LEN(short,2));
+		rb_str_cat(res, OFF16(&s), NATINT_LEN(short,2));
 	    }
 	    break;
@@ -575,5 +584,5 @@
 		    l = NUM2ULONG(from);
 		}
-		rb_str_cat(res, (char*)&l, NATINT_LEN(long,4));
+		rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4));
 	    }
 	    break;
@@ -589,5 +598,5 @@
 		}
 		s = htons(s);
-		rb_str_cat(res, (char*)&s, NATINT_LEN(short,2));
+		rb_str_cat(res, OFF16(&s), NATINT_LEN(short,2));
 	    }
 	    break;
@@ -603,5 +612,5 @@
 		}
 		l = htonl(l);
-		rb_str_cat(res, (char*)&l, NATINT_LEN(long,4));
+		rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4));
 	    }
 	    break;
@@ -617,5 +626,5 @@
 		}
 		s = htovs(s);
-		rb_str_cat(res, (char*)&s, NATINT_LEN(short,2));
+		rb_str_cat(res, OFF16(&s), NATINT_LEN(short,2));
 	    }
 	    break;
@@ -631,5 +640,5 @@
 		}
 		l = htovl(l);
-		rb_str_cat(res, (char*)&l, NATINT_LEN(long,4));
+		rb_str_cat(res, OFF32(&l), NATINT_LEN(long,4));
 	    }
 	    break;
@@ -1205,6 +1214,6 @@
 	    PACK_LENGTH_ADJUST(short,2);
 	    while (len-- > 0) {
-		short tmp;
-		memcpy(&tmp, s, NATINT_LEN(short,2));
+		short tmp = 0;
+		memcpy(OFF16(&tmp), s, NATINT_LEN(short,2));
 		s += NATINT_LEN(short,2);
 		rb_ary_push(ary, INT2FIX(tmp));
@@ -1216,6 +1225,6 @@
 	    PACK_LENGTH_ADJUST(unsigned short,2);
 	    while (len-- > 0) {
-		unsigned short tmp;
-		memcpy(&tmp, s, NATINT_LEN(unsigned short,2));
+		unsigned short tmp = 0;
+		memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2));
 		s += NATINT_LEN(unsigned short,2);
 		rb_ary_push(ary, INT2FIX(tmp));
@@ -1249,6 +1258,6 @@
 	    PACK_LENGTH_ADJUST(long,4);
 	    while (len-- > 0) {
-		long tmp;
-		memcpy(&tmp, s, NATINT_LEN(long,4));
+		long tmp = 0;
+		memcpy(OFF32(&tmp), s, NATINT_LEN(long,4));
 		s += NATINT_LEN(long,4);
 		rb_ary_push(ary, rb_int2inum(tmp));
@@ -1260,6 +1269,6 @@
 	    PACK_LENGTH_ADJUST(unsigned long,4);
 	    while (len-- > 0) {
-		unsigned long tmp;
-		memcpy(&tmp, s, NATINT_LEN(unsigned long,4));
+		unsigned long tmp = 0;
+		memcpy(OFF32(&tmp), s, NATINT_LEN(unsigned long,4));
 		s += NATINT_LEN(unsigned long,4);
 		rb_ary_push(ary, rb_uint2inum(tmp));
@@ -1271,9 +1280,8 @@
 	    PACK_LENGTH_ADJUST(unsigned short,2);
 	    while (len-- > 0) {
-		unsigned short tmp;
-		memcpy(&tmp, s, NATINT_LEN(unsigned short,2));
+		unsigned short tmp = 0;
+		memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2));
 		s += NATINT_LEN(unsigned short,2);
-		tmp = ntohs(tmp);
-		rb_ary_push(ary, rb_uint2inum(tmp));
+		rb_ary_push(ary, rb_uint2inum(ntohs(tmp)));
 	    }
 	    PACK_ITEM_ADJUST();
@@ -1283,9 +1291,8 @@
 	    PACK_LENGTH_ADJUST(unsigned long,4);
 	    while (len-- > 0) {
-		unsigned long tmp;
-		memcpy(&tmp, s, NATINT_LEN(unsigned long,4));
+		unsigned long tmp = 0;
+		memcpy(OFF32(&tmp), s, NATINT_LEN(unsigned long,4));
 		s += NATINT_LEN(unsigned long,4);
-		tmp = ntohl(tmp);
-		rb_ary_push(ary, rb_uint2inum(tmp));
+		rb_ary_push(ary, rb_uint2inum(ntohl(tmp)));
 	    }
 	    PACK_ITEM_ADJUST();
@@ -1295,9 +1302,8 @@
 	    PACK_LENGTH_ADJUST(unsigned short,2);
 	    while (len-- > 0) {
-		unsigned short tmp;
-		memcpy(&tmp, s, NATINT_LEN(unsigned short,2));
+		unsigned short tmp = 0;
+		memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2));
 		s += NATINT_LEN(unsigned short,2);
-		tmp = vtohs(tmp);
-		rb_ary_push(ary, rb_uint2inum(tmp));
+		rb_ary_push(ary, rb_uint2inum(vtohs(tmp)));
 	    }
 	    PACK_ITEM_ADJUST();
@@ -1307,9 +1313,8 @@
 	    PACK_LENGTH_ADJUST(unsigned long,4);
 	    while (len-- > 0) {
-		unsigned long tmp;
-		memcpy(&tmp, s, NATINT_LEN(long,4));
+		unsigned long tmp = 0;
+		memcpy(OFF32(&tmp), s, NATINT_LEN(long,4));
 		s += NATINT_LEN(long,4);
-		tmp = vtohl(tmp);
-		rb_ary_push(ary, rb_uint2inum(tmp));
+		rb_ary_push(ary, rb_uint2inum(vtohl(tmp)));
 	    }
 	    PACK_ITEM_ADJUST();

In This Thread