ファイル入出力に関する共通領域の初期化は、initfile()で行っていましたが、 これをdata文で静的に初期化することとします。
Ratofr版のfiles.riは以下の通りです。
# files.ri -- file interface common valiables common /files/finuse,fbuf,flastcr,flastcw,fmode,fnew integer finuse(MAXFILES) # inuse flag character fbuf(MAXFILES,MAXLINE) # I/O buffer integer flastcr(MAXFILES) # characters in read buffer integer flastcw(MAXFILES) # characters in write buffer character fmode(MAXFILES) # READ/WIRTE flag integer fnew(MAXFILES) # NEWLINE flag data finuse/MAXFILES*NOUSE/ data flastcr/MAXFILES*0/ data flastcw/MAXFILES*MAXLINE/ data fmode/MAXFILES*READ/ data fnew/MAXFILES*NO/ data finuse(STDIN)/INUSE/ data flastcr(STDIN)/MAXLINE/ data fmode(STDIN)/READ/ data finuse(STDOUT)/INUSE/ data flastcw(STDOUT)/0/ data fmode(STDOUT)/WRITE/
WATCOM fotran77版のfiles.fiは以下の通りです。
c files.fi -- file interface common valiables common /files/finuse,fbuf,flastcr,flastcw,fmode,fnew integer finuse(MAXFILES) ! inuse flag integer*1 fbuf(MAXFILES,MAXLINE) ! I/O buffer integer flastcr(MAXFILES) ! characters in read buffer integer flastcw(MAXFILES) ! characters in write buffer integer*1 fmode(MAXFILES) ! READ/WIRTE flag integer fnew(MAXFILES) ! NEWLINE flag data finuse/MAXFILES*NOUSE/ data flastcr/MAXFILES*0/ data flastcw/MAXFILES*MAXLINE/ data fmode/MAXFILES*READ/ data fnew/MAXFILES*NO/ data finuse(STDIN)/INUSE/ data flastcr(STDIN)/MAXLINE/ data fmode(STDIN)/READ/ data finuse(STDOUT)/INUSE/ data flastcw(STDOUT)/0/ data fmode(STDOUT)/WRITE/
files.ri、files.fiの変更により再コンパイルが必要になるファイルは、以下の通りです。
fopen.for fclose.for fgetc.for fputc.for
これらは、macroが動き出す前のファイルですので、macroを使用する版を再掲します。
fopen()のRatofor版は以下の通りです。
# fopen.r4 -- connect internal file descripter and external file include ratfor.def integer function fopen(uid, fn, act) integer uid character fn(ARB), act integer i character*MAXLINE cfn character*9 cact # for 'READ'/'WRITE'/'READWRITE' include files.fi if (act == READ) cact = 'READ' else if (act == WRITE) cact = 'WRITE' else if (act == READWRITE) cact = 'READWRITE' else { # error uid = ERR fopen = ERR return } end if call is2cs(fn,cfn,MAXNAME) for (i = 1; i <= MAXFILES; i = i + 1) if (finuse(i) == NOUSE) { open(unit=i, file=cfn, action=cact, err=99) finuse(i) = INUSE uid = i fopen = i if (act == READ) { flastcr(i) = MAXLINE fbuf(i,MAXLINE) = NEWLINE fnew(i) = NO fmode(i) = act } else if (act .eq. WRITE) { flastcw(i) = 0 fmode(i) = act } else if (act .eq. READWIRTE) { flastcr(i) = MAXLINE flastcw(i) = 0 fbuf(i,MAXLINE) = NEWLINE fnew(i) = NO fmode(i) = act } return } 99 continue uid = ERR fopen = ERR return end
fopen()のWATCOM fortran77版は以下の通りです。
※コメントの受付件数を超えているため、この記事にコメントすることができません。