Subject | : g95サポート |
Date | : 2008/02/29(Fri) 02:05:41 |
Contributor | : Akio Morita |
正確には、FGETC intrinsicが無い Fortran環境のサポートですが SADの 入力で使われている基本関数は o src/itfgetbuf*.*で実装されている itfgetbuf_(テキストの一行入力) o src/tfwrtite.fの binary Read[]で使い FGETC intrinsic(ベンダー拡張) の2種が有ります で、itfgetbuf_は FGETCで実装可能ですが、FGETCが無い環境の場合 どうしてもFGETCの代替品が必要になります 現在、手持ちの実装だと 1. read(2) system callを使った itfgetbuf_と FGETCもどき - Write[]/SeekFile[]と組み合わせた動作の整合性を保証できない(*) - Read[]の動作がとても遅い(**) - Read[]に限れば、テキスト・バイナリともに動く 2. Fortran90の停留入力を使った itfgetbuf_と FGETCもどき - Fortran90の標準I/Oなので Write[]/SeekFile[]と組み合わせても正しく動く - read(2)での実装よりもだいぶ早い - 読み込み時に CR(0x0d)を正しく取り扱えない(*) が、ありますがどちらも欠陥(*)を抱えています。 また、(**)は実用には大きな影響があります。 この場合、どちらの実装の方がより被害が少ないと思われますか? # つまり、正しい実装はそもそも無理(Fortran I/Oはユーザーが # 再定義できない)ので FGETCが存在しない環境で、どちらの # 動作をデフォルトにした方がユーザーへの影響が少ないかという問題です # (Write[]/SeekFile[]/Read[]を組み合わせるユーザー数と # バイナリやCR(0x0d)入りのストリームを扱うユーザー数とどちらが多いか?) PS. 実際には、問題の根はさらに深く FGETCが CR-LFな入力列に対して LFのみを返す実装が実在します...