fread の戻り値について
Tremor の実験で発覚した fread の戻り値の問題。
Mona の fread はファイルが読めないときは -1 を返すが、手元の Linux の fread は 0 を返している。
こういうときは「man fread」
返り値 fread() と fwrite() は読み書きに成功した要素の個数を返す。エラーが生じた場合や、end-of-file(ファイルの最後)に達し た場合、返り値は指定した個数よりも小さい値(またはゼロ)となる。 fread() は end-of-file とエラーを区別しないので、どちらが生じたかを判断するためには、呼び出し側で feof(3) と fer‐ ror(3) とを使用しなければならない。 準拠 fread() 関数と fwrite() 関数は ANSI X3.159-1989 (‘‘ANSI C’’)に準拠する。
うーん。微妙だ。どちらともとれるな。
あ、戻り値が size_t なので非負でないとまずそう。
というわけで、以下のようにコードを変更しようと思うのですがどうでしょうか。
確認をお願いします。→ id:shotaro_tsuji
fread.c
--- mona/core/monalibc/stdio/fread.c.org 2007-08-29 00:30:08.000000000 +0900 +++ mona/core/monalibc/stdio/fread.c 2007-08-29 00:32:11.000000000 +0900 @@ -76,7 +76,7 @@ if( readsize == -1 ) { stream->_flags |= __SERR; - return (size_t)-1; + return 0; } if( readsize < size ) { @@ -130,7 +130,7 @@ if( readsize == -1 ) { stream->_flags |= __SERR; - return (size_t)-1; + return 0; } if( readsize < size ) { @@ -184,7 +184,7 @@ if( !(stream->_flags & __SRD) ) { errno = EBADF; - return -1; + return 0; } if( stream->_extra->stds == __STDIN ) {
fgetc
--- mona/core/monalibc/stdio/fgetc.c.org 2007-08-29 00:33:34.000000000 +0900 +++ mona/core/monalibc/stdio/fgetc.c 2007-08-29 00:33:51.000000000 +0900 @@ -11,7 +11,7 @@ int result; result = fread(&c, 1, 1, fp); - if( result < 0 ) return EOF; + if(0 == result) return EOF; return (int)c; }