コードの改修 -- 名前付き共通領域の初期化の改善 先読み入出力バッファー ― 2017年07月26日 09:31
先読み入出力に関する共通領域の初期化は、initbuf()で行っていましたが、 これをdata文で静的に初期化することとします。
Ratfor版のcdefio.riは以下の通りです。
# cdefio.ri
common /cdefio/bp,buf
integer bp # next available character; init = 0
character buf(BUFSIZE) # pushed back character
data bp/0/
WATCOM fotran77版のfiles.fiは以下の通りです。
c cdefio.fi
common /cdefio/bp,buf
integer bp ! next available character; init = 0
integer*1 buf(BUFSIZE) ! pushed back character
data bp/0/
files.ri、files.fiの変更により再コンパイルが必要になるファイルは、以下の通りです。
ngetc.f
putbak.f
これらは、macroが動き出す前のファイルですので、macroを使用する版を再掲します。
ngetc()のRatfor版は以下の通りです。
# ngetc.r4 -- get a (possibly pushed back) character
character function ngetc( c )
character c
character getc
include cdefio.ri
if (bp > 0)
c = buf(bp)
else {
bp = 1
buf(bp) = getc(c)
}
if (c != EOF)
bp = bp - 1
ngetc = c
return
end
ngetc()のWATCOM fortran77版は以下の通りです。
c ngetc.f -- get a (possibly pushed back) character
include ratfor.def
integer*1 function ngetc( c )
integer*1 c
integer*1 getc
include cdefio.fi
if (bp .gt. 0) then
c = buf(bp)
else
bp = 1
buf(bp) = getc(c)
end if
if (c .ne. EOF) then
bp = bp - 1
end if
ngetc = c
return
end
putbak()のRatfor版は以下の通りです。
# putbak.r4 -- push character back onto input
subroutine putbak(c)
character c
include cdefio.ri
bp = bp + 1
if (bp > BUFSIZE)
call error('too many character pushed back.')
buf(bp) = c
return
end
putbak()のWATCOM fortran77版は以下の通りです。
c putbak.f -- push character back onto input
include ratfor.def
subroutine putbak(c)
integer*1 c
include cdefio.fi
bp = bp + 1
if (bp .gt. BUFSIZE) then
call putdec(bp,1)
call putc(NEWLINE)
call error('too many character pushed back.')
end if
buf(bp) = c
return
end
また、initbuf()が不要になることで再コンパイルが必要になるファイルは、以下の通りです。
define.f
macro.f
実際の変更点については割愛します。
最近のコメント