change -- 文書ファイルの書き換え
2015-09-06


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版は下記の通り。



続きを読む

[コンピューター]
[RATFOR]

コメント(全50件)
※コメントの受付件数を超えているため、この記事にコメントすることができません。


記事を書く
powered by ASAHIネット