90 lines
2.0 KiB
Plaintext
90 lines
2.0 KiB
Plaintext
(* 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.
|