(* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. *) module; 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; type CommandLine = record input: ShortString; output: ShortString; lex: Bool; parse: Bool end; proc parse_command_line*() -> ^CommandLine; var parameter: ShortString; i: Word; result: ^CommandLine; parsed: Bool; begin i := 1u; NEW(result); result^.lex := false; result^.parse := false; MemZero(@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 i := i + 1u; 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.