Conference Room SAD
[thread display] [new arrival display] [word search] [past log] [管理用]

Subject g95サポート
Date: 2008/02/29(Fri) 02:05:41
ContributorAkio 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のみを返す実装が実在します...