Working argument parser

This commit is contained in:
Yannick Reiß 2024-02-03 11:30:00 +01:00
parent 3ee47e2a77
commit 322cf64183
No known key found for this signature in database
GPG Key ID: 5A3AF456F0A0338C
1 changed files with 38 additions and 33 deletions

View File

@ -10,19 +10,19 @@ with Ada.Strings.Unbounded;
-- @return
-- @description Main Function call
procedure Main is
type InstructionList is array(1..65536) of String(1..64);
type InstructionList is array (1 .. 65_536) of String (1 .. 64);
type ArgumentParserState is
(PSInit, PSFilename, PSLanguage, PSRecycle, PSFinish, PSError);
type FileList is array(1..128) of Unbounded.Unbounded_String;
ParserState : ArgumentParserState := Init;
Filename : Unbounded.Unbounded_String :=
Unbounded.To_Unbounded_String ("bin.out");
Language : Unbounded.Unbounded_String :=
Unbounded.To_Unbounded_String ("VHDL");
Recycle : Boolean := False;
InputFileList : FileList;
InputFileListIndex : Integer := 1;
Argument : String;
type FileList is array (1 .. 128) of Ada.Strings.Unbounded.Unbounded_String;
ParserState : ArgumentParserState := PSInit;
Filename : Ada.Strings.Unbounded.Unbounded_String :=
Ada.Strings.Unbounded.To_Unbounded_String ("bin.out");
Language : Ada.Strings.Unbounded.Unbounded_String :=
Ada.Strings.Unbounded.To_Unbounded_String ("VHDL");
Recycle : Boolean := False;
InputFileList : FileList;
InputFileListIndex : Integer := 1;
Argument : Ada.Strings.Unbounded.Unbounded_String;
Argumenterror : exception;
Languageoptionerror : exception;
@ -30,51 +30,56 @@ begin
-- Check input file limit for arguments and lowest argument
if Ada.Command_Line.Argument_Count > 128 then
Text_IO.Put_Line ("To many arguments!");
Ada.Text_IO.Put_Line ("To many arguments!");
elsif Ada.Command_Line.Argument_Count < 2 then
Text_IO.Put_Line ("Not enough arguments!");
Ada.Text_IO.Put_Line ("Not enough arguments!");
end if;
for Index in 1 .. Ada.Command_Line.Argument_Count loop
Argument := Command_Line.Argument(Index);
Argument :=
Ada.Strings.Unbounded.To_Unbounded_String
(Ada.Command_Line.Argument (Index));
case ParserState is
when Init =>
if Argument = "-o" then
when PSInit =>
if Ada.Strings.Unbounded.To_String (Argument) = "-o" then
ParserState := PSFilename;
elsif Argument = "-x" then
elsif Ada.Strings.Unbounded.To_String (Argument) = "-x" then
ParserState := PSLanguage;
elsif Argument = "-r" then
elsif Ada.Strings.Unbounded.To_String (Argument) = "-r" then
ParserState := PSRecycle;
else
ParserState := PSError;
end if;
when Filename =>
when PSFilename =>
ParserState := PSInit;
Filename := Unbounded.To_Unbounded_String (Argument);
when Language =>
Filename := Argument;
when PSLanguage =>
ParserState := PSInit;
Language := PSUnbounded.To_Unbounded_String (Argument);
when Recycle =>
Language := Argument;
when PSRecycle =>
ParserState := PSInit;
Recycle := True;
when PSError =>
ParserState := PSError;
raise Argumenterror;
when PSFinish =>
ParserState := PSFinish;
InputFileListIndex := InputFileListIndex + 1;
InputFileList(InputFileListIndex) := Argument;
when PSFinish =>
ParserState := PSFinish;
InputFileListIndex := InputFileListIndex + 1;
InputFileList (InputFileListIndex) := Argument;
when others =>
ParserState := PSFinish;
InputFileListIndex := 1;
InputFileList(InputFileListIndex) := Argument;
ParserState := PSFinish;
InputFileListIndex := 1;
InputFileList (InputFileListIndex) := Argument;
end case;
end loop;
-- Check the language for correct values
if not (Language = "VHDL" or Language = "C") then
Text_Io.Put_Line
("ERROR: The language " & Unbounded.To_String (Language) &
if not
(Ada.Strings.Unbounded.To_String (Language) = "VHDL" or
Ada.Strings.Unbounded.To_String (Language) = "C")
then
Ada.Text_IO.Put_Line
("ERROR: The language " & Ada.Strings.Unbounded.To_String (Language) &
" is not available!");
raise Languageoptionerror;
end if;