home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / switch.adb < prev    next >
Text File  |  1996-09-28  |  17KB  |  584 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                               S W I T C H                                --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.91 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  Option switch scanning for both the compiler and the binder
  26.  
  27. --  Note: this version of the package should be usable in both Unix and DOS
  28.  
  29. with Debug;  use Debug;
  30. with Osint;  use Osint;
  31. with Opt;    use Opt;
  32. with Output; use Output;
  33. with Types;  use Types;
  34.  
  35. with System.WCh_Con; use System.WCh_Con;
  36.  
  37. package body Switch is
  38.  
  39.    Bad_Switch : exception;
  40.    --  Exception raised if bad switch encountered
  41.  
  42.    Bad_Switch_Value : exception;
  43.    --  Exception raised if bad switch value encountered
  44.  
  45.    Switch_Max_Value : constant := 999;
  46.    --  Maximum value permitted in switches that take a value
  47.  
  48.    -------------------
  49.    -- Scan_Switches --
  50.    -------------------
  51.  
  52.    procedure Scan_Switches (Switch_Chars : String) is
  53.       Ptr : Integer := Switch_Chars'First;
  54.       Max : Integer := Switch_Chars'Last;
  55.       C   : Character := ' ';
  56.  
  57.       Switches : String (Switch_Chars'Range);
  58.       --  Copy of switches which is actually scanned. Switches in GNAT are
  59.       --  always case sensitive and therefore not folded to upper case since
  60.       --  that is the convention in GCC.
  61.  
  62.       function Scan_Int return Pos;
  63.       --  Scan positive integer parameter for switch. On entry, Ptr points
  64.       --  just past the switch character, on exit it points past the last
  65.       --  digit of the integer value.
  66.  
  67.       function Scan_Int return Pos is
  68.          Val : Int := 0;
  69.  
  70.       begin
  71.          if Ptr > Max or else Switches (Ptr) not in '0' .. '9' then
  72.             raise Bad_Switch_Value;
  73.          end if;
  74.  
  75.          while Ptr <= Max and then Switches (Ptr) in '0' .. '9' loop
  76.             Val := Val * 10 +
  77.               Character'Pos (Switches (Ptr)) - Character'Pos ('0');
  78.             Ptr := Ptr + 1;
  79.  
  80.             if Val > Switch_Max_Value then
  81.                raise Bad_Switch_Value;
  82.             end if;
  83.          end loop;
  84.  
  85.          return Val;
  86.       end Scan_Int;
  87.  
  88.    --  Start of processing for Scan_Switches
  89.  
  90.    begin
  91.       for J in Switches'Range loop
  92.          Switches (J) := Switch_Chars (J);
  93.       end loop;
  94.  
  95.       --  Skip past the initial character (must be the switch character)
  96.  
  97.       if Ptr = Max then
  98.          raise Bad_Switch;
  99.       else
  100.          Ptr := Ptr + 1;
  101.       end if;
  102.  
  103.       --  Loop to scan through switches given in switch string
  104.  
  105.       while Ptr <= Max loop
  106.          C := Switches (Ptr);
  107.  
  108.          --  Processing for -a switch
  109.  
  110.          if C = 'a' then
  111.             Ptr := Ptr + 1;
  112.  
  113.             if Program = Compiler then
  114.                Assertions_Enabled := True;
  115.             elsif Program = Make then
  116.                Check_Internal_Files := True;
  117.             else
  118.                raise Bad_Switch;
  119.             end if;
  120.  
  121.          --  Processing for -b switch
  122.  
  123.          elsif C = 'b' then
  124.             if Program = Compiler or else Program = Binder then
  125.                Ptr := Ptr + 1;
  126.                Brief_Output := True;
  127.             else
  128.                raise Bad_Switch;
  129.             end if;
  130.  
  131.          --  Processing for -c switch
  132.  
  133.          elsif C = 'c' then
  134.             Ptr := Ptr + 1;
  135.  
  136.             if Program = Compiler then
  137.                Operating_Mode := Check_Semantics;
  138.             elsif Program = Binder then
  139.                Check_Only := True;
  140.             elsif Program = Make then
  141.                Compile_Only := True;
  142.             else
  143.                raise Bad_Switch;
  144.             end if;
  145.  
  146.          --  Processing for -d switch
  147.  
  148.          elsif C = 'd' then
  149.  
  150.             if Program = Make then
  151.                raise Bad_Switch;
  152.             end if;
  153.  
  154.             --  Note: for the debug switch, the remaining characters in this
  155.             --  switch field must all be debug flags, since all valid switch
  156.             --  characters are also valid debug characters.
  157.  
  158.             --  Loop to scan out debug flags
  159.  
  160.             while Ptr < Max loop
  161.                Ptr := Ptr + 1;
  162.                C := Switches (Ptr);
  163.                exit when C = Ascii.NUL or else C = '/' or else C = '-';
  164.  
  165.                if C in '1' .. '9' or else C in 'a' .. 'z' then
  166.                   Set_Debug_Flag (C);
  167.                else
  168.                   raise Bad_Switch;
  169.                end if;
  170.             end loop;
  171.  
  172.             return;
  173.  
  174.          --  Processing for -e switch
  175.  
  176.          elsif C = 'e' then
  177.             Ptr := Ptr + 1;
  178.  
  179.             if Program = Compiler then
  180.                Immediate_Errors := True;
  181.             elsif Program = Binder then
  182.                Elab_Dependency_Output := True;
  183.             else
  184.                raise Bad_Switch;
  185.             end if;
  186.  
  187.          --  Processing for -f switch
  188.  
  189.          elsif C = 'f' then
  190.             Ptr := Ptr + 1;
  191.  
  192.             if Program = Compiler then
  193.                All_Errors_Mode := True;
  194.             elsif Program = Make then
  195.                Force_Compilations := True;
  196.             else
  197.                raise Bad_Switch;
  198.             end if;
  199.  
  200.          --  Processing for -g switch
  201.  
  202.          elsif C = 'g' then
  203.             Ptr := Ptr + 1;
  204.             GNAT_Mode := True;
  205.  
  206.             if Program = Compiler then
  207.                RM_Column_Check := True;
  208.                Style_Check := True;
  209.                Identifier_Character_Set := 'n';
  210.  
  211.             elsif Program = Make then
  212.                Generate_Debug := True;
  213.  
  214.             --  Is this right for the binder ???
  215.  
  216.             elsif Program = Binder then
  217.                null;
  218.             end if;
  219.  
  220.          --  Processing for -i switch
  221.  
  222.          elsif C = 'i' then
  223.             if Program = Compiler or else Program = Binder then
  224.                if Ptr = Max then
  225.                   raise Bad_Switch;
  226.                end if;
  227.  
  228.                Ptr := Ptr + 1;
  229.                C := Switches (Ptr);
  230.  
  231.                if C = '1' or else
  232.                   C = '2' or else
  233.                   C = '3' or else
  234.                   C = '4' or else
  235.                   C = '8' or else
  236.                   C = 'p' or else
  237.                   C = 'f' or else
  238.                   C = 'n' or else
  239.                   C = 'w'
  240.                then
  241.                   Identifier_Character_Set := C;
  242.                   Ptr := Ptr + 1;
  243.                else
  244.                   raise Bad_Switch;
  245.                end if;
  246.  
  247.             else
  248.                raise Bad_Switch;
  249.             end if;
  250.  
  251.          --  Processing for -j switch
  252.  
  253.          elsif C = 'j' then
  254.             Ptr := Ptr + 1;
  255.  
  256.             if Program = Compiler then
  257.  
  258.                for J in WC_Encoding_Method loop
  259.                   if Switches (Ptr) = WC_Encoding_Letters (J) then
  260.                      Wide_Character_Encoding_Method := J;
  261.                      exit;
  262.  
  263.                   elsif J = WC_Encoding_Method'Last then
  264.                      raise Bad_Switch;
  265.                   end if;
  266.                end loop;
  267.  
  268.                Upper_Half_Encoding :=
  269.                  Wide_Character_Encoding_Method in
  270.                    WC_Upper_Half_Encoding_Method;
  271.  
  272.                Ptr := Ptr + 1;
  273.  
  274.             else
  275.                raise Bad_Switch;
  276.             end if;
  277.  
  278.          --  Processing for -k switch
  279.  
  280.          elsif C = 'k' then
  281.             Ptr := Ptr + 1;
  282.  
  283.             if Program = Compiler then
  284.                Maximum_File_Name_Length := Scan_Int;
  285.             else
  286.                raise Bad_Switch;
  287.             end if;
  288.  
  289.          --  Processing for -l switch
  290.  
  291.          elsif C = 'l' then
  292.             Ptr := Ptr + 1;
  293.  
  294.             if Program = Compiler then
  295.                Full_List := True;
  296.             elsif Program = Binder then
  297.                Elab_Order_Output := True;
  298.             else
  299.                raise Bad_Switch;
  300.             end if;
  301.  
  302.          --  Processing for -m switch
  303.  
  304.          elsif C = 'm' then
  305.             Ptr := Ptr + 1;
  306.  
  307.             if Program = Compiler or else Program = Binder then
  308.                Maximum_Errors := Scan_Int;
  309.             else
  310.                raise Bad_Switch;
  311.             end if;
  312.  
  313.          --  Processing for -n switch
  314.  
  315.          elsif C = 'n' then
  316.             Ptr := Ptr + 1;
  317.  
  318.             if Program = Compiler then
  319.                Inline_Active := True;
  320.             elsif Program = Binder then
  321.                Bind_Main_Program := False;
  322.             elsif Program = Make then
  323.                Dont_Execute := True;
  324.             else
  325.                raise Bad_Switch;
  326.             end if;
  327.  
  328.          --  Processing for -o switch
  329.  
  330.          elsif C = 'o' then
  331.             Ptr := Ptr + 1;
  332.  
  333.             if Program = Compiler then
  334.                Suppress_Options.Overflow_Checks    := False;
  335.                Suppress_Options.Elaboration_Checks := False;
  336.             elsif Program = Binder then
  337.                Output_Filename_Present := True;
  338.             else
  339.                raise Bad_Switch;
  340.             end if;
  341.  
  342.          --  Processing for -p switch
  343.  
  344.          elsif C = 'p' then
  345.             Ptr := Ptr + 1;
  346.  
  347.             if Program = Compiler then
  348.                Suppress_Options.Access_Checks        := True;
  349.                Suppress_Options.Accessibility_Checks := True;
  350.                Suppress_Options.Discriminant_Checks  := True;
  351.                Suppress_Options.Division_Checks      := True;
  352.                Suppress_Options.Elaboration_Checks   := True;
  353.                Suppress_Options.Index_Checks         := True;
  354.                Suppress_Options.Length_Checks        := True;
  355.                Suppress_Options.Overflow_Checks      := True;
  356.                Suppress_Options.Range_Checks         := True;
  357.                Suppress_Options.Division_Checks      := True;
  358.                Suppress_Options.Length_Checks        := True;
  359.                Suppress_Options.Range_Checks         := True;
  360.                Suppress_Options.Storage_Checks       := True;
  361.                Suppress_Options.Tag_Checks           := True;
  362.             else
  363.                raise Bad_Switch;
  364.             end if;
  365.  
  366.          --  Processing for -q switch
  367.  
  368.          elsif C = 'q' then
  369.             Ptr := Ptr + 1;
  370.  
  371.             if Program = Compiler then
  372.                Try_Semantics := True;
  373.             elsif Program = Make then
  374.                Quiet_Output := True;
  375.             else
  376.                raise Bad_Switch;
  377.             end if;
  378.  
  379.          --  Processing for -r switch
  380.  
  381.          elsif C = 'r' then
  382.             Ptr := Ptr + 1;
  383.  
  384.             if Program = Compiler then
  385.                RM_Column_Check := True;
  386.             else
  387.                raise Bad_Switch;
  388.             end if;
  389.  
  390.          --  Processing for -s switch
  391.  
  392.          elsif C = 's' then
  393.             Ptr := Ptr + 1;
  394.  
  395.             if Program = Compiler then
  396.                Operating_Mode := Check_Syntax;
  397.             elsif Program = Binder then
  398.                All_Sources := True;
  399.                Check_Source_Files := True;
  400.             elsif Program = Make then
  401.                Smart_Compilations := True;
  402.             else
  403.                raise Bad_Switch;
  404.             end if;
  405.  
  406.          --  Processing for -t switch
  407.  
  408.          elsif C = 't' then
  409.             Ptr := Ptr + 1;
  410.  
  411.             if Program = Binder then
  412.                Ignore_Time_Stamp_Errors := True;
  413.             elsif Program = Compiler then
  414.                Tree_Output := True;
  415.             else
  416.                raise Bad_Switch;
  417.             end if;
  418.  
  419.          --  Processing for -u switch
  420.  
  421.          elsif C = 'u' then
  422.             Ptr := Ptr + 1;
  423.  
  424.             if Program = Compiler then
  425.                List_Units := True;
  426.             else
  427.                raise Bad_Switch;
  428.             end if;
  429.  
  430.          --  Processing for -v switch
  431.  
  432.          elsif C = 'v' then
  433.             Ptr := Ptr + 1;
  434.  
  435.             if Program = Compiler
  436.               or else Program = Binder
  437.               or else Program = Make
  438.             then
  439.                Verbose_Mode := True;
  440.             else
  441.                raise Bad_Switch;
  442.             end if;
  443.  
  444.          --  Processing for -w switch
  445.  
  446.          elsif C = 'w' then
  447.             Ptr := Ptr + 1;
  448.  
  449.             if Program = Compiler or else Program = Binder then
  450.  
  451.                case Switches (Ptr) is
  452.                   when 's' => Warning_Mode := Suppress;
  453.                   when 'e' => Warning_Mode := Treat_As_Error;
  454.  
  455.                   when others =>
  456.                      raise Bad_Switch;
  457.                end case;
  458.  
  459.                Ptr := Ptr + 1;
  460.  
  461.             else
  462.                raise Bad_Switch;
  463.             end if;
  464.  
  465.          --  Processing for -x switch
  466.  
  467.          elsif C = 'x' then
  468.             Ptr := Ptr + 1;
  469.  
  470.             if Program = Compiler then
  471.  
  472.                case Switches (Ptr) is
  473.                   when '1' => Xref_Flag_1 := True;
  474.                   when '2' => Xref_Flag_2 := True;
  475.                   when '3' => Xref_Flag_3 := True;
  476.                   when '4' => Xref_Flag_4 := True;
  477.                   when '5' => Xref_Flag_5 := True;
  478.                   when '6' => Xref_Flag_6 := True;
  479.                   when '9' => Xref_Flag_9 := True;
  480.                   when 'b' => Xref_Flag_B := True;
  481.                   when 's' => Xref_Flag_S := True;
  482.  
  483.                   when others =>
  484.                      raise Bad_Switch;
  485.                end case;
  486.  
  487.                Ptr := Ptr + 1;
  488.  
  489.             elsif Program = Binder then
  490.                All_Sources := False;
  491.                Check_Source_Files := False;
  492.  
  493.             else
  494.                raise Bad_Switch;
  495.             end if;
  496.  
  497.          --  Processing for -z switch
  498.  
  499.          elsif C = 'z' then
  500.             Ptr := Ptr + 1;
  501.  
  502.             if Program = Compiler then
  503.  
  504.                case Switches (Ptr) is
  505.                   when 'R' =>
  506.                      Stub_Mode := Compile_Receiver_Stub_Spec;
  507.  
  508.                   when 'C' =>
  509.                      Stub_Mode := Compile_Caller_Stub_Spec;
  510.  
  511.                   when 'r' =>
  512.                      Stub_Mode := Generate_Receiver_Stub_Body;
  513.                      Operating_Mode := Check_Semantics;
  514.  
  515.                   when 'c' =>
  516.                      Stub_Mode := Generate_Caller_Stub_Body;
  517.                      Operating_Mode := Check_Semantics;
  518.  
  519.                   when others =>
  520.                      raise Bad_Switch;
  521.                end case;
  522.  
  523.                Ptr := Ptr + 1;
  524.  
  525.             else
  526.                raise Bad_Switch;
  527.             end if;
  528.  
  529.          --  Processing for -83 switch
  530.  
  531.          elsif C = '8' then
  532.  
  533.             if Program = Compiler then
  534.                if Ptr = Max then
  535.                   raise Bad_Switch;
  536.                end if;
  537.  
  538.                Ptr := Ptr + 1;
  539.  
  540.                if Switches (Ptr) /= '3' then
  541.                   raise Bad_Switch;
  542.                else
  543.                   Ptr := Ptr + 1;
  544.                   Ada_83_Switch := True;
  545.                   Ada_95 := False;
  546.                   Ada_83 := True;
  547.                end if;
  548.  
  549.             else
  550.                raise Bad_Switch;
  551.             end if;
  552.  
  553.          --  Ignore extra switch character
  554.  
  555.          elsif C = '/' or else C = '-' then
  556.             Ptr := Ptr + 1;
  557.  
  558.          --  Anything else is an error (illegal switch character)
  559.  
  560.          else
  561.             raise Bad_Switch;
  562.          end if;
  563.  
  564.       end loop;
  565.  
  566.    exception
  567.       when Bad_Switch =>
  568.          Write_Str ("invalid switch: ");
  569.          Write_Char (C);
  570.          Write_Eol;
  571.          Exit_Program (E_Fatal);
  572.  
  573.       when Bad_Switch_Value =>
  574.          Write_Str ("switch: ");
  575.          Write_Char (C);
  576.          Write_Str (" ; value must be in 0 .. ");
  577.          Write_Int (Switch_Max_Value);
  578.          Write_Eol;
  579.          Exit_Program (E_Fatal);
  580.  
  581.    end Scan_Switches;
  582.  
  583. end Switch;
  584.