------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                              G P R E X C H                               --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--            Copyright (C) 2006-2008, Free Software Foundation, Inc.       --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
-- Boston, MA 02110-1301, USA.                                              --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

package body Gprexch is

   type String_Ptr is access String;

   Binding_Labels : array (Binding_Section) of String_Ptr;
   --  The list of labels of the different section in a binder exchange file.
   --  Populated in the package body.

   Library_Labels : array (Library_Section) of String_Ptr;
   --  The list of labels of the different section in a library exchange file.
   --  Populated in the package body.

   -------------------
   -- Binding_Label --
   -------------------

   function Binding_Label (Section : Binding_Section) return String is
   begin
      if Binding_Labels (Section) = null then
         return "";

      else
         return Binding_Labels (Section).all;
      end if;
   end Binding_Label;

   -------------------------
   -- Get_Binding_Section --
   -------------------------

   function Get_Binding_Section (Label : String) return Binding_Section is
   begin
      for Section in Binding_Section loop
         if Binding_Labels (Section) /= null and then
           Binding_Labels (Section).all = Label
         then
            return Section;
         end if;
      end loop;

      return No_Binding_Section;
   end Get_Binding_Section;

   -------------------------
   -- Get_Library_Section --
   -------------------------

   function Get_Library_Section (Label : String) return Library_Section is
   begin
      for Section in Library_Section loop
         if Library_Labels (Section) /= null and then
           Library_Labels (Section).all = Label
         then
            return Section;
         end if;
      end loop;

      return No_Library_Section;
   end Get_Library_Section;

   -------------------
   -- Library_Label --
   -------------------

   function Library_Label (Section : Library_Section) return String is
   begin
      if Library_Labels (Section) = null then
         return "";

      else
         return Library_Labels (Section).all;
      end if;
   end Library_Label;

--  Package elaboration code (build the lists of section labels)

begin
   for J in Binding_Labels'Range loop
      if J /= No_Binding_Section then
         Binding_Labels (J) := new String'('[' & J'Img & ']');

         for K in Binding_Labels (J)'Range loop
            if Binding_Labels (J) (K) = '_' then
               Binding_Labels (J) (K) := ' ';
            end if;
         end loop;
      end if;
   end loop;

   Binding_Labels (No_Binding_Section) := null;

   for J in Library_Labels'Range loop
      if J /= No_Library_Section then
         Library_Labels (J) := new String'('[' & J'Img & ']');

         for K in Library_Labels (J)'Range loop
            if Library_Labels (J) (K) = '_' then
               Library_Labels (J) (K) := ' ';
            end if;
         end loop;
      end if;
   end loop;

   Library_Labels (No_Library_Section) := null;

end Gprexch;
