(* * edlin32.dpr *) {$apptype console} program edlin32; uses Windows, SysUtils, Classes; const msgHelp: array[0..13] of string = ( '行編集 行番号', '追加 [行数]A', 'コピー [先頭行],[終了行],目的行[,回数]C', '削除 [先頭行][,終了行]D', '終了 (ファイル保存) E', '挿入 [行]I', 'リスト [先頭行][,終了行]L', '移動 [先頭行],[終了行],目的行M', 'ページ [先頭行][,終了行]P', '終了 (編集結果破棄) Q', '置換 [先頭行][,終了行][?]R[旧テキスト][CTRL+Z新テキスト]', '検索 [先頭行][,終了行][?]Sテキスト', '転送 [目的行]T[ドライブ名:][パス]ファイル名', '書き込み [行数]W'); const msgUsage: array[0..4] of string = ( '行単位のテキストエディタである, EDLIN を起動します.', '', 'EDLIN [ドライブ:][パス]ファイル名 [/B]', '', ' /B エンドオブファイル(EOF; CTRL+Z)キャラクタを無視します.'); const msgPrompt = '*'; msgLoaded = 'ファイルを終わりまで読み込みました.'; msgNewFile = '新しいファイルです.'; msgQueryQuit = '編集を中止しますか ?'; msgInputErr = '入力エラー'; msgNeedPath = 'ファイル名を指定してください.'; msgInvalid = '無効なパラメータです.'; function readLine : string; var st: string; begin readln(st); if length(st) = 0 then result := ' ' else result := st; end; procedure writeMsg(msg: array of string); var i: integer; begin for i := 0 to High(msg)-1 do writeln(msg[i]); end; var FileName: string; modify: boolean; WSL: TStringList; procedure init; var st: string; begin FileName := ''; modify := false; case ParamCount of 0: begin writeln(msgNeedPath); halt; end; 1: begin st := ParamStr(1); if st[2] = '?' then begin writeMsg(msgUsage); halt; end; if st[1] = '/' then begin writeln(msgInvalid); halt; end; FileName := ParamStr(1); end; 2: begin if UpperCase(ParamStr(1)) <> '/B' then begin writeln(msgInvalid); halt; end; FileName := ParamStr(2); end; else writeln(msgInvalid); halt; end; end; procedure Quit; var st: string; begin if not modify then halt; write(msgQueryQuit); st := readline; if Upcase(st[1]) <> 'Y' then halt; end; procedure readFile; begin if FileExists(FileName) then begin WSL.LoadFromFile(FileName); writeln(msgLoaded); end else begin WSL.Clear; writeln(msgNewFIle); end; end; procedure writeFile; begin writeln('wrote'); modify := false; end; procedure listFile; var i: integer; begin for i := 0 to WSL.Count-1 do writeln(WSL[i]); end; procedure main; var st: string; begin while true do begin write(msgPrompt); st := readLine; case Upcase(st[1]) of 'L': listFile; 'E': begin writeFile; Quit; end; 'W': writeFile; '?': writeMsg(msgHelp); 'Q': Quit; else writeln(msgInputErr); end; end; end; begin WSL := TStringList.Create; try init; readFile; main; finally WSL.Free; end; end.