機能を2つ追加します。定義してあるマクロを取り消す--undef と簡単な条件判断を 行う--ifdef です。
undefは、以下のように使います。定義していないマクロ名を指定しても無視されます。
define(EOF,-1) # マクロEOFの定義 : : : undef(EOF) # マクロEOFの削除
ifdefは、以下のように使います。
define(CPU1,1) : : : ifdef(CPU1,define(WORD,4)) # CPU1が定義されていれば、WORDは、4 ifdef(CPU2,define(WORD,8)) # CPU2が定義されていれば、WORDは、8
これらの機能を組み込むには、defineの変更が必要です。undef,ifdefを マクロテーブルに登録することと、undefルーチンuninst()の呼び出し、 ifdefの処理ロジックの追加が必要です。
RATFOR版は、
# define.r4 -- simple string replacement macro processor program define integer gettok character defn(MAXDEF),t,token(MAXTOK) integer lookup string defnam "define" string udenam "undef" string ifdnam "ifdef" character deftyp(2) data deftyp(1)/DEFTYPE/,deftyp(2)/EOS/ character udftyp(2) data udftyp(1)/UDFTYPE/,udftyp(2)/EOS/ character ifdtyp(2) data ifdtyp(1)/IFDTYPE/,ifdtyp(2)/EOS/ call initfile call inittbl call initbuf call instal(defnam,deftyp) call instal(udfnam,udftyp) call instal(ifdnam,ifdtyp) for(t = gettok(token,MAXTOK);t != EOF;t = gettok(token,MAXTOK)) if (t != ALPHA) # output non-alpha tokens call putlin(token,STDOUT) else if (lookup(token,defn) == NO) call putlin(token,STDOUT) else if (defn(1) == DEFTYPE) { # get definition call getdef(token,MAXTOK,defn,MAXTOK) call instal(token,defn) } else if (defn(1) == UDFTYPE ) { call getnam(token,MAXTOK) if (lookup(token,defn) == YES) # and defined call uninst(token) } else if (defn(1) == IFDTYPE) { call getdef(token,MAXTOK,defn,MAXDEF)) if (lookup(token,junk) == YES) call pbstr(defn) } else call pbstr(defn) # push replacement stop end
WATCOM fortran 77版は、
※コメントの受付件数を超えているため、この記事にコメントすることができません。