OSDN Git Service

2005-03-29 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-restri.adb
index e258e5e..be39f23 100644 (file)
@@ -40,9 +40,9 @@ package body System.Restrictions is
 
    function Abort_Allowed return Boolean is
    begin
-      return Restrictions.Violated (No_Abort_Statements)
+      return Run_Time_Restrictions.Violated (No_Abort_Statements)
                or else
-             Restrictions.Violated (Max_Asynchronous_Select_Nesting);
+             Run_Time_Restrictions.Violated (Max_Asynchronous_Select_Nesting);
    end Abort_Allowed;
 
    ---------------------
@@ -51,12 +51,98 @@ package body System.Restrictions is
 
    function Tasking_Allowed return Boolean is
    begin
-      return Restrictions.Violated (Max_Tasks)
+      return Run_Time_Restrictions.Violated (Max_Tasks)
                or else
-             Restrictions.Violated (No_Tasking);
+             Run_Time_Restrictions.Violated (No_Tasking);
    end Tasking_Allowed;
 
+--  Package elaboration code (acquire restrictions)
+
 begin
-   null;
+   Acquire_Restrictions : declare
+
+      subtype Big_String is String (Positive);
+      type Big_String_Ptr is access all Big_String;
+
+      RString : Big_String_Ptr;
+      pragma Import (C, RString, "__gl_restrictions");
+
+      P : Natural := 1;
+      --  Pointer to scan string
+
+      C : Character;
+      --  Next character from string
+
+      function Get_Char return Character;
+      --  Get next character from string
+
+      function Get_Natural return Natural;
+      --  Scan out natural value known to be in range, updating P past it
+
+      --------------
+      -- Get_Char --
+      --------------
+
+      function Get_Char return Character is
+      begin
+         P := P + 1;
+         return RString (P - 1);
+      end Get_Char;
+
+      -----------------
+      -- Get_Natural --
+      -----------------
+
+      function Get_Natural return Natural is
+         N : Natural := 0;
+
+      begin
+         while RString (P) in '0' .. '9' loop
+            N := N * 10 + (Character'Pos (Get_Char) - Character'Pos ('0'));
+         end loop;
+
+         return N;
+      end Get_Natural;
+
+   --  Start of processing for Acquire_Restrictions
+
+   begin
+      --  Acquire data corresponding to first R line
+
+      for R in All_Boolean_Restrictions loop
+         C := Get_Char;
+
+         if C = 'v' then
+            Run_Time_Restrictions.Violated (R) := True;
+
+         elsif C = 'r' then
+            Run_Time_Restrictions.Set (R) := True;
+         end if;
+      end loop;
+
+      --  Acquire data corresponding to second R line
+
+      for RP in All_Parameter_Restrictions loop
+
+         --  Acquire restrictions pragma information
+
+         if Get_Char = 'r' then
+            Run_Time_Restrictions.Set (RP) := True;
+            Run_Time_Restrictions.Value (RP) := Get_Natural;
+         end if;
+
+         --  Acquire restrictions violations information
+
+         if Get_Char = 'v' then
+            Run_Time_Restrictions.Violated (RP) := True;
+            Run_Time_Restrictions.Count (RP) := Get_Natural;
+
+            if RString (P) = '+' then
+               Run_Time_Restrictions.Unknown (RP) := True;
+               P := P + 1;
+            end if;
+         end if;
+      end loop;
+   end Acquire_Restrictions;
 end System.Restrictions;