changeは、指定された文字列"原型"を 別の文字列"更新型"に置換します。
change 原型 更新型
更新型には繰り返し記号"#"を含ませることができる。"#"は原型を表す。
change foo #barとすれば、出現した"foo"は、"foobar"に置き換えられる。
changeはfindで使用したルーチンを利用して作成してある。まずは、メインルーチンから。
RATFOR版は以下の通り。
# change -- change "from" into "to" character lin(MAXLINE+1),new(MAXLINE+1),pat(MAXPAT),sub(MAXPAT) character arg(MAXARG) integer amatch,addset,getarg,getlin,getpat,getsub integer i,junk,k,lastm,m if (getarg(1,arg,MAXARG) == EOF) call error('usage: change from to.') if (getpat(arg,pat) == ERR) call error('illigal from pattern.') if (getarg(2,arg,MAXARG)) arg(1) = EOS if ( getsub(arg,sub) == ERR) call error('illigal to.') while (getlin(lin,STDIN) .ne. EOF) { k = 1 lastm = 0 for (i = 1; lin(i) != EOS; ) { m = amatch(lin,i,pat) if (m > 0 & lastm != m) # replace matched text call catsub(lin,i,m,sub,new,k,MAXLINE+1) lastm = m } if (m == 0 | m == i) { junk = addset(lin(i),new,k,MAXLINE+1) i = i + 1 } else i = m } if (addset(EOS,new,k,MAXLINE+1) == NO) { k = MAXLINE + 1 junk = addset(EOS,new,k,MAXLINE+1) call remark('line truncated.') call putlin(new,ERROUT) call fputc(ERROUT,NEWLINE) } call putlin(new,STDOUT) } stop end
WATCOM Fortran77版は下記の通り。
c change -- change "from" into "to" integer*1 lin(81+1),new(81+1),pat(81),sub(256) ! MAXLINE(81) MAXPAT(81) integer*1 arg(81) ! MAXARG(81) integer amatch,addset,getarg,getlin,getpat,getsub integer i,junk,k,lastm,m call initfile() if (getarg(1,arg,81) .eq. -1) then ! MAXARG(81) EOF(-1) call error('usage: change from to.') end if if (getpat(arg,pat) .eq. -1 ) then ! EOF(-1) call error('illigal from pattern.') end if if (getarg(2,arg,81) .eq. -1) then ! MAXLARG(81) EOF(-1) arg(1) = -2 ! EOS(-2) end if if ( getsub(arg,sub) .eq. -1) then ! ERR(-1) call error('illigal to.') end if while (getlin(lin,5) .ne. -1) do ! STDIN(5) EOF(-1) k = 1 lastm = 0 i = 1 while (lin(i) .ne. -2) do ! EOS(-2) m = amatch(lin,i,pat) if ((m .gt. 0) .and. (lastm .ne. m)) then ! replace matched text call catsub(lin,i,m,sub,new,k,81+1) ! MAXLINE(81) lastm = m end if if ((m .eq. 0) .or. (m .eq. i)) then junk = addset(lin(i),new,k,81+1) ! MAXLINE(81) i = i + 1 else i = m end if end while if (addset(-2,new,k,81+1) .eq. 0) then ! EOS(-2) NAXLINE(81) NO(0) k = 81+1 ! MAXLINE(81) junk = addset(-2,new,k,81+1) ! EOS(-2) NAXLINE(81) call remark('line truncated.') call putlin(new,6) ! ERROUT(6) call fputc(6,10) ! ERROUT(6) NEWLINE(10) end if call putlin(new,6) end while stop end
下請けルーチンgetsub()は、置き換え文型を組み立てる。
RATFOR版は下記の通り。
# getsub -- get substitution pattern into sub integer function getsub(arg,sub) character arg(MAXARG),sub(MAXPAT) integer maksub getsub = maksub(arg,1,EOS,sub) return end
WATCOM Fortran77版は下記の通り。
c getsub -- get substitution pattern into sub integer function getsub(arg,sub) integer*1 arg(81),sub(81) ! MAXARG(81) MAXPAT(81) integer maksub getsub = maksub(arg,1,-2,sub) ! EOS(-2) return end
maksub()は、置き換え文字列を作成します。繰り返し記号"#"は、特別な記号に置き換えられます。
RATFOR版は下記の通り。
※コメントの受付件数を超えているため、この記事にコメントすることができません。