(* 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; import cstdlib, cstring, common; type CommandLine* = record input: ^Char; output: ^Char; lex: Bool; parse: Bool end; proc parse_command_line*(argc: Int, argv: ^^Char) -> ^CommandLine; var parameter: ^Char; i: Int; result: ^CommandLine; parsed: Bool; begin i := 1; result := cast(malloc(#size(CommandLine)): ^CommandLine); result^.lex := false; result^.parse := false; result^.input := nil; result^.output := nil; while i < argc & result <> nil do parameter := (argv + i)^; parsed := false; if strcmp(parameter, "--lex\0".ptr) = 0 then parsed := true; result^.lex := true end; if strcmp(parameter, "--parse\0".ptr) = 0 then parsed := true; result^.parse := true end; if strcmp(parameter, "-o\0".ptr) = 0 then i := i + 1; if i = argc then write_s("Fatal error: expecting a file name following -o."); result := nil end; if i < argc then parameter := (argv + i)^; result^.output := parameter end; parsed := true end; if (parameter[1] <> '-') & ~parsed then parsed := true; if result^.input <> nil then write_s("Fatal error: only one source file can be compiled at once. First given \""); write_z(result^.input); write_s("\", then \""); write_z(parameter); write_s("\".\n"); result := nil end; if result <> nil then result^.input := parameter end end; if ~parsed then write_s("Fatal error: unknown command line options: "); write_z(parameter); write_s(".\n"); result := nil end; i := i + 1 end; if result <> nil & result^.input = nil then write_s("Fatal error: no input files.\n"); result := nil end; return result end; end.