指定された文字列を 指定されたファイルの中から探し出すプログラム find を紹介します。 このように使います。
C0#find
arguments>GetLine *.def *.mod
C:STDFILEI.DEF 6: GetLine;
C:STDFILEI.DEF 8:PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;
C:STDFILEI.MOD 10:PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;
C:STDFILEI.MOD 36:END GetLine;
C:FIND.MOD 8:FROM StdFileIO IMPORT GetLine;
C:FIND.MOD 71: Chars := GetLine(pFileIO,Line);
63K QP/M VER 2.7 (BIOS VER 1.0)
(C) 1988.12.1. K.YOSHIDA
2018.10.28. MODEFIED BY H.KIDA
C0#find
arguments>GetChar *.def *.mod
C:BASICFIL.DEF 7: ReadFile,GetChar;
C:BASICFIL.DEF 28:PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;
C:STDFILEI.MOD 3: pFileIOStruct,GetChar;
C:STDFILEI.MOD 20: C := GetChar(pFileIO);
C:BASICFIL.MOD 65:PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;
C:BASICFIL.MOD 89:END GetChar;
63K QP/M VER 2.7 (BIOS VER 1.0)
(C) 1988.12.1. K.YOSHIDA
2018.10.28. MODEFIED BY H.KIDA
C0#
find は、ファイルを読みますので、ファイルアクセスのルーチンが必要になります。 Bdosを直接使うことができるので、かんたんなファイル読み込みモジュール BasicFileIO を作成しました。 更に、行単位のファイル読み出しが必要なので、上位のモジュール StdFileIO を作成しました。StdFileIOは、 Bdosとは、独立しています。
まず、 BasicFileIO です。基本的なファイルアクセスルーチンの集まりです。 今回は、読み出せれば良いので、書き込み関係のルーチンは作成していません。基本的なファイルのアクセスは、 一文字単位です、 定義モジュールは、以下のとおりです。
DEFINITION MODULE BasicFileIO;
FROM OpSys IMPORT FCB,FCBFileName;
EXPORT QUALIFIED
FileIOStatus,FileIOStruct,pFileIOStruct,
OpenFile,CloseFile,EOFFile,
ReadFile,GetChar;
CONST
DMASize = 128;
TYPE
FileIOStatus = (Success,InvalidFileName,
OpenError,CloseError,IOError);
DMA = ARRAY [0..DMASize-1] OF CHAR;
pFileIOStruct = POINTER TO FileIOStruct;
FileIOStruct = RECORD
FCBBuf: FCB;
DMABuf: DMA;
ReadPos: CARDINAL;
WritePos: CARDINAL;
EOFFlag: BOOLEAN;
END;
PROCEDURE OpenFile(FileName: ARRAY OF CHAR;
VAR pFileIO: pFileIOStruct): FileIOStatus;
PROCEDURE CloseFile(VAR pFileIO: pFileIOStruct): FileIOStatus;
PROCEDURE ReadFile(VAR pFileIO: pFileIOStruct): FileIOStatus;
PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;
PROCEDURE EOFFile(pFileIO: pFileIOStruct): BOOLEAN;
END BasicFileIO.
実装モジュールは、以下のとおりです。手続き GetChar では、CR LF と連続した場合、 LF を読み飛ばします。
セコメントをする