99 lines
2.4 KiB
Plaintext
99 lines
2.4 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;
|
|
|
|
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.
|