summaryrefslogtreecommitdiff
path: root/dist/mcode/windows/ghdlfilter.adb
blob: d75526dbdedded0df69e05c8f39ae13d00ffda40 (plain)
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;