module; from SYSTEM import ADR, TSIZE; from Args import GetArg, Narg; from FIO import WriteString, WriteChar, WriteLine, StdErr; from Storage import ALLOCATE; from Strings import CompareStr, Length; from MemUtils import MemZero; from Common import ShortString; proc parse_command_line() -> PCommandLine; var parameter: ShortString; i: CARDINAL; result: PCommandLine; parsed: BOOLEAN; begin i := 1; NEW(result); result^.lex := false; result^.parse := false; MemZero(ADR(result^.input), 256); result^.output[1] := CHAR(0); while (i < Narg()) & (result <> nil) do parsed := GetArg(parameter, i); parsed := false; if CompareStr(parameter, '--lex') = 0 then parsed := true; result^.lex := true end; if CompareStr(parameter, '--parse') = 0 then parsed := true; result^.parse := true end; if CompareStr(parameter, '-o') = 0 then INC(i); if i = Narg() then WriteString(StdErr, 'Fatal error: expecting a file name following -o.'); result := nil end; if i < Narg() then parsed := GetArg(parameter, i); result^.output := parameter end; parsed := true end; if (parameter[1] <> '-') & (parsed = false) then parsed := true; if Length(result^.input) > 0 then WriteString(StdErr, 'Fatal error: only one source file can be compiled at once. First given "'); WriteString(StdErr, result^.input); WriteString(StdErr, '", then "'); WriteString(StdErr, parameter); WriteString(StdErr, '".'); WriteLine(StdErr); result := nil end; if result <> nil then result^.input := parameter end end; if parsed = false then WriteString(StdErr, 'Fatal error: unknown command line options: '); WriteString(StdErr, parameter); WriteChar(StdErr, '.'); WriteLine(StdErr); result := nil end; i := i + 1 end; if (result <> nil) & (Length(result^.input) = 0) then WriteString(StdErr, 'Fatal error: no input files.'); WriteLine(StdErr); result := nil end; return result end; end.