あ伊藤です.最近他のことにかまけていて,ruby関係の開発が... (^_^;

In article <19990405015447P.nnakamur / mxq.mesh.ne.jp>,
	Noritsugu Nakamura  <ruby-ext / netlab.co.jp> writes:

> gcc -fpic -I/usr/local/lib/ruby/i686-linux -I/usr/local/include -g -O2     -c extutil.c -o extutil.o
> extutil.c: In function `file_new':
> extutil.c:10: structure has no member named `_flag'
> extutil.c:10: `_IORW' undeclared (first use this function)
> extutil.c:10: (Each undeclared identifier is reported only once
> extutil.c:10: for each function it appears in.)
> extutil.c:12: structure has no member named `_flag'
> extutil.c:12: `_IOREAD' undeclared (first use this function)
> extutil.c:14: structure has no member named `_flag'
> extutil.c:14: `_IOWRT' undeclared (first use this function)
> make: *** [extutil.o] Error 1
> 
> てな具合です。Linux で動作させている方はおられますか?

手元にある linux box (2.2.0-pre7, ディストリビューション不明)で
動くようにしてみました.どうでしょうか?

ちなみにこの部分は(見ればわかると思いますが) C の FILE* を ruby の
IO オブジェクトに変換する部分です.この部分で FILE* のモード(read,write)
を取得しなければならないのですが,これをやるのに移植性のある一般的な
方法はあるのでしょうか?どなたかご存知ですか?

--
aito

--- extutil.c.org	Mon Apr  5 12:43:24 1999
+++ extutil.c	Mon Apr  5 12:50:58 1999
@@ -7,12 +7,21 @@
   OBJSETUP(fo,cFile,T_FILE);
   MakeOpenFile(fo,o);
   o->f = f;
+#ifdef linux
+  if (!(f->_flags & _IO_NO_READS) && !(f->_flags & _IO_NO_WRITES))
+    o->mode = io_mode_flags("r+");
+  else if (!(f->_flags & _IO_NO_READS))
+    o->mode = io_mode_flags("r");
+  else if (!(f->_flags & _IO_NO_WRITES))
+    o->mode = io_mode_flags("w");
+#else
   if (f->_flag & _IORW)
     o->mode = io_mode_flags("r+");
   else if (f->_flag & _IOREAD)
     o->mode = io_mode_flags("r");
   else if (f->_flag & _IOWRT)
     o->mode = io_mode_flags("w");
+#endif
   else
     fail("Can't decide IO mode");
   return (VALUE)fo;