照合パターンを作りこみは、 getpat()で行います。実際には、makpat()が照合パターンの作成を行う。
findでは、この文型照合パターンpatに特別な記号を挿入し、管理します。
getpat()は、findとmakpat()のつなぎこみをするだけである。
RATFOR版は、下記の通り。
# getpat.r4 -- convert arguments into pattern integer function getpat(arg,pat) character arg(MAXARG),pat(MAXPAT) integer makpat getpat = makpat(arg,1,EOS,pat) return endWATCOM Fortran 77版は下記の通り。
c getpat.for -- convert arguments into pattern integer function getpat(arg,pat) integer*1 arg(81),pat(81) ! MAXARG(81) MAXPAT(81) integer makpat getpat = makpat(arg,1,-2,pat) ! EOS(-2) return end
makpat()では、照合パターンの先頭以外に出てきた"%"は、そのものを表すことにします。 同様に、文型の末尾以外に出現した"$"、文型の先頭に出てきた"*"を特別扱いしないで、 その文字そのものとして扱う ようにします。そうすれば、エスケープ"@"を使って文字そのものの意味にする必要がなくなり、 使い勝手が向上します。
makpat()では、patに照合パターンをaddset()を使って設定していきます。 これを使うことでpatからあふれ出すことなく 安全に照合パターンを作りことができます。
文字の類が出現した場合、getccl()使って文字の類の符号化をします。 また、stclos()を使って閉包の処理に必要な情報をセットします。 これを使うことにより閉包の情報構造を隠ぺいすることができます。
RATFOR版は下記の通り。
# makpat.r4 -- make pattern from arg(from), teminate delim integer function makpat(arg,from,delim,pat) character arg(MAXARG),delim,pat(MAXPAT) integer from character esc integer stclos,addset,getccl integer i,j,junk,lastcl,lastj,lj j = 1 lastj = 1 lastcl = 0 for (i = from; arg(i) != delim & arg(i) != EOS; i = i + 1) { lj = j if (arg(i) == ANY) junk = addset(ANY,pat,j,MAXPAT) else if (arg(i) == BOL & i == from) junk = addset(BOL,pat,j,MAXPAT) else if (arg(i) == EOL & arg(i+1) == delim) junk = addset(EOL,pat,j,MAXPAT) else if (arg(i) == CCL) { if (getccl(arg,i,pat,j) == ERR) then exit end if junk = addset(COLEND,pat,j,MAXPAT) } else if (arg(i) == CLOSURE & i > from) { lj = lastj if (pat(lj) == BOL | pat(lj) == EOL | pat(lj) == CLOSURE) break lastcl = stclos(pat,j,lastj,lastcl) } else { junk = addset(CHAR,pat,j,MAXPAT) junk = addset(esc(arg,i),pat,j,MAXPAT) } lastj = lj } if (arg(i) .ne. delim) then # terminated erarly makpat = ERR else if (addset(EOS,pat,j,MAXPAT) == NO) # no room makpat = ERR else makpat = i end if return end
WATCOM Fortran77版は下記の通り。
※コメントの受付件数を超えているため、この記事にコメントすることができません。