1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
--
-- Preprocessor to handle library source metacomments
--
-- Limitations:
-- - line metacomments must occur at end of line with no trailing space before the line break
-- - block metacomments must start in column 1
--
-- Supported line metacomments:
--
-- --!V87
-- --V87
-- --V93
-- --V08
--
-- Supported block metacomments:
--
-- --START-!V87
-- --END-!V87
--
-- --START-V93
-- --END-V93
--
-- --START-V08
-- --END-V08
--
--
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;
procedure Ghdlfilter is
type Mode_Kind is (Mode_93, Mode_87, Mode_08);
Mode : Mode_Kind;
Line : String (1 .. 128);
Len : Natural;
Comment : Boolean;
Block_Comment : Boolean;
begin
if Argument_Count /= 1 then
Put_Line (Standard_Error, "usage: " & Command_Name & " -v93|-v87|-v08");
return;
end if;
if Argument (1) = "-v93" then
Mode := Mode_93;
elsif Argument (1) = "-v87" then
Mode := Mode_87;
elsif Argument (1) = "-v08" then
Mode := Mode_08;
else
Put_Line (Standard_Error, "bad mode");
return;
end if;
Block_Comment := False;
loop
exit when End_Of_File;
Get_Line (Line, Len);
Comment := Block_Comment;
--
-- look for line metacomments
--
if Len > 6 then
if Mode = Mode_87 and ( Line (Len - 5 .. Len) = "--!V87" ) then
Comment := True;
end if;
end if;
if Len > 5 then
if Mode = Mode_87 and ( (Line (Len - 4 .. Len) = "--V93") or (Line (Len - 4 .. Len) = "--V08") ) then
Comment := True;
elsif Mode = Mode_93 and ( (Line (Len - 4 .. Len) = "--V87") or (Line (Len - 4 .. Len) = "--V08") ) then
Comment := True;
elsif Mode = Mode_08 and ( (Line (Len - 4 .. Len) = "--V87") or (Line (Len - 4 .. Len) = "--V93") ) then
Comment := True;
end if;
end if;
--
-- look for block metacomment start
--
if Len = 12
and then Mode /= Mode_93
and then Line (1 .. 12) = "--START-!V87" then
Block_Comment := True;
end if;
if Len = 11
and then Mode /= Mode_93
and then Line (1 .. 11) = "--START-V93" then
Block_Comment := True;
end if;
if Len = 11
and then Mode /= Mode_08
and then Line (1 .. 11) = "--START-V08" then
Block_Comment := True;
end if;
--
-- look for block metacomment end
--
if Len = 9 and then ( (Line (1 .. 9) = "--END-V93") or (Line (1 .. 9) = "--END-V08") ) then
Block_Comment := False;
end if;
if Len = 10 and then ( Line (1 .. 10) = "--END-!V87" ) then
Block_Comment := False;
end if;
--
-- comment output lines as needed
--
if Comment then
Put ("-- ");
end if;
Put_Line (Line (1 .. Len));
end loop;
end Ghdlfilter;
|