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 / i-c.adb < prev    next >
Text File  |  1996-09-28  |  11KB  |  408 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                         I N T E R F A C E S . C                          --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.7 $                              --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with System;
  27. with Unchecked_Conversion;
  28.  
  29. package body Interfaces.C is
  30.  
  31.    --  The following bodies are temporary, see documentation in spec ???
  32.  
  33.    function To_C (Item : Character) return char is
  34.    begin
  35.       return Character_To_char (Item);
  36.    end To_C;
  37.  
  38.    function To_Ada (Item : char) return Character is
  39.    begin
  40.       return char_To_Character (Item);
  41.    end To_Ada;
  42.  
  43.    function To_C (Item : in Wide_Character) return wchar_t is
  44.    begin
  45.       return Wide_Character_To_wchar_t (Item);
  46.    end To_C;
  47.  
  48.    function To_Ada (Item : in wchar_t) return Wide_Character is
  49.    begin
  50.       return wchar_t_To_Wide_Character (Item);
  51.    end To_Ada;
  52.  
  53.    -----------------------
  54.    -- Is_Nul_Terminated --
  55.    -----------------------
  56.  
  57.    --  Case of char_array
  58.  
  59.    function Is_Nul_Terminated (Item : in char_array) return Boolean is
  60.    begin
  61.       for J in Item'Range loop
  62.          if Item (J) = nul then
  63.             return True;
  64.          end if;
  65.       end loop;
  66.  
  67.       return False;
  68.    end Is_Nul_Terminated;
  69.  
  70.    --  Case of wchar_array
  71.  
  72.    function Is_Nul_Terminated (Item : in wchar_array) return Boolean is
  73.    begin
  74.       for J in Item'Range loop
  75.          if Item (J) = wide_nul then
  76.             return True;
  77.          end if;
  78.       end loop;
  79.  
  80.       return False;
  81.    end Is_Nul_Terminated;
  82.  
  83.    ------------
  84.    -- To_Ada --
  85.    ------------
  86.  
  87.    --  Convert char_array to String (function form)
  88.  
  89.    function To_Ada
  90.      (Item     : in char_array;
  91.       Trim_Nul : in Boolean := True)
  92.       return     String
  93.    is
  94.       Count : Natural;
  95.       From  : size_t;
  96.  
  97.    begin
  98.       if Trim_Nul then
  99.          From := Item'First;
  100.  
  101.          loop
  102.             exit when Item (From) = nul;
  103.  
  104.             if From = Item'Last then
  105.                raise Terminator_Error;
  106.             else
  107.                From := From + 1;
  108.             end if;
  109.          end loop;
  110.  
  111.          Count := Natural (From - Item'First);
  112.  
  113.       else
  114.          Count := Item'Length;
  115.       end if;
  116.  
  117.       declare
  118.          subtype Return_Type is String (1 .. Count);
  119.          type Return_Type_Ptr is access Return_Type;
  120.          function To_Return_Type_Ptr is
  121.            new Unchecked_Conversion (System.Address, Return_Type_Ptr);
  122.  
  123.       begin
  124.          return To_Return_Type_Ptr (Item'Address).all;
  125.       end;
  126.    end To_Ada;
  127.  
  128.    --  Convert char_array to String (procedure form)
  129.  
  130.    procedure To_Ada
  131.      (Item       : in char_array;
  132.       Target     : out String;
  133.       Count      : out Natural;
  134.       Trim_Nul   : in Boolean := True)
  135.    is
  136.       From   : size_t;
  137.  
  138.    begin
  139.       if Trim_Nul then
  140.          From := Item'First;
  141.          loop
  142.             exit when Item (From) = nul;
  143.  
  144.             if From = Item'Last then
  145.                raise Terminator_Error;
  146.             else
  147.                From := From + 1;
  148.             end if;
  149.          end loop;
  150.  
  151.          Count := Natural (From - Item'First);
  152.  
  153.       else
  154.          Count := Item'Length;
  155.       end if;
  156.  
  157.       if Count > Target'Length then
  158.          raise Constraint_Error;
  159.  
  160.       else
  161.          From := Item'First;
  162.          for To in Target'Range loop
  163.             Target (To) := Character (Item (From));
  164.             From := From + 1;
  165.          end loop;
  166.       end if;
  167.  
  168.    end To_Ada;
  169.  
  170.    --  Convert wchar_array to Wide_String (function form)
  171.  
  172.    function To_Ada
  173.      (Item     : in wchar_array;
  174.       Trim_Nul : in Boolean := True)
  175.       return     Wide_String
  176.    is
  177.       Count : Natural;
  178.       From  : size_t;
  179.  
  180.    begin
  181.       if Trim_Nul then
  182.          From := Item'First;
  183.  
  184.          loop
  185.             exit when Item (From) = wide_nul;
  186.  
  187.             if From = Item'Last then
  188.                raise Terminator_Error;
  189.             else
  190.                From := From + 1;
  191.             end if;
  192.          end loop;
  193.  
  194.          Count := Natural (From - Item'First);
  195.  
  196.       else
  197.          Count := Item'Length;
  198.       end if;
  199.  
  200.       declare
  201.          subtype Return_Type is Wide_String (1 .. Count);
  202.          type Return_Type_Ptr is access Return_Type;
  203.          function To_Return_Type_Ptr is
  204.            new Unchecked_Conversion (System.Address, Return_Type_Ptr);
  205.  
  206.       begin
  207.          return To_Return_Type_Ptr (Item'Address).all;
  208.       end;
  209.    end To_Ada;
  210.  
  211.    --  Convert wchar_array to Wide_String (procedure form)
  212.  
  213.    procedure To_Ada
  214.      (Item       : in wchar_array;
  215.       Target     : out Wide_String;
  216.       Count      : out Natural;
  217.       Trim_Nul   : in Boolean := True)
  218.    is
  219.       From   : size_t;
  220.  
  221.    begin
  222.       if Trim_Nul then
  223.          From := Item'First;
  224.          loop
  225.             exit when Item (From) = wide_nul;
  226.  
  227.             if From = Item'Last then
  228.                raise Terminator_Error;
  229.             else
  230.                From := From + 1;
  231.             end if;
  232.          end loop;
  233.  
  234.          Count := Natural (From - Item'First);
  235.  
  236.       else
  237.          Count := Item'Length;
  238.       end if;
  239.  
  240.       if Count > Target'Length then
  241.          raise Constraint_Error;
  242.  
  243.       else
  244.          From := Item'First;
  245.          for To in Target'Range loop
  246.             Target (To) := Wide_Character (Item (From));
  247.             From := From + 1;
  248.          end loop;
  249.       end if;
  250.  
  251.    end To_Ada;
  252.  
  253.    ----------
  254.    -- To_C --
  255.    ----------
  256.  
  257.    --  Convert String to char_array (function form)
  258.  
  259.    function To_C
  260.      (Item       : in String;
  261.       Append_Nul : in Boolean := True)
  262.       return       char_array
  263.    is
  264.       Length : size_t;
  265.  
  266.    begin
  267.       --  If appending null, we have to make a copy
  268.  
  269.       if Append_Nul then
  270.          declare
  271.             Target : char_array (0 .. Item'Length);
  272.             To     : size_t;
  273.  
  274.          begin
  275.             To := 0;
  276.             for From in Item'Range loop
  277.                Target (To) := char (Item (From));
  278.                To := To + 1;
  279.             end loop;
  280.  
  281.             Target (Item'Length) := nul;
  282.             return Target;
  283.          end;
  284.  
  285.       --  If not appending null, we can use unchecked conversion to return
  286.       --  the result, since we know in GNAT there is structural equivalence.
  287.  
  288.       else
  289.          declare
  290.             subtype Return_Type is char_array (0 .. Item'Length - 1);
  291.             type Return_Type_Ptr is access Return_Type;
  292.             function To_Return_Type_Ptr is
  293.               new Unchecked_Conversion (System.Address, Return_Type_Ptr);
  294.  
  295.          begin
  296.             return To_Return_Type_Ptr (Item'Address).all;
  297.          end;
  298.       end if;
  299.    end To_C;
  300.  
  301.    --  Convert String to char_array (procedure form)
  302.  
  303.    procedure To_C
  304.      (Item       : in String;
  305.       Target     : out char_array;
  306.       Count      : out size_t;
  307.       Append_Nul : in  Boolean := True)
  308.    is
  309.       To : size_t;
  310.  
  311.    begin
  312.       if Target'Length < Item'Length then
  313.          raise Constraint_Error;
  314.  
  315.       else
  316.          To := Target'First;
  317.          for From in Item'Range loop
  318.             Target (To) := char (Item (From));
  319.             To := To + 1;
  320.          end loop;
  321.  
  322.          if Append_Nul then
  323.             if To > Target'Last then
  324.                raise Constraint_Error;
  325.             else
  326.                Target (To) := nul;
  327.             end if;
  328.          end if;
  329.       end if;
  330.    end To_C;
  331.  
  332.    --  Convert Wide_String to wchar_array (function form)
  333.  
  334.    function To_C
  335.      (Item       : in Wide_String;
  336.       Append_Nul : in Boolean := True)
  337.       return       wchar_array
  338.    is
  339.       Length : size_t;
  340.  
  341.    begin
  342.       --  If appending null, we have to make a copy
  343.  
  344.       if Append_Nul then
  345.          declare
  346.             Target : wchar_array (0 .. Item'Length);
  347.             To     : size_t;
  348.  
  349.          begin
  350.             To := 0;
  351.             for From in Item'Range loop
  352.                Target (To) := wchar_t (Item (From));
  353.                To := To + 1;
  354.             end loop;
  355.  
  356.             Target (Item'Length) := wide_nul;
  357.             return Target;
  358.          end;
  359.  
  360.       --  If not appending null, we can use unchecked conversion to return
  361.       --  the result, since we know in GNAT there is structural equivalence.
  362.  
  363.       else
  364.          declare
  365.             subtype Return_Type is wchar_array (0 .. Item'Length - 1);
  366.             type Return_Type_Ptr is access Return_Type;
  367.             function To_Return_Type_Ptr is
  368.               new Unchecked_Conversion (System.Address, Return_Type_Ptr);
  369.  
  370.          begin
  371.             return To_Return_Type_Ptr (Item'Address).all;
  372.          end;
  373.       end if;
  374.    end To_C;
  375.  
  376.    --  Convert Wide_String to wchar_array (procedure form)
  377.  
  378.    procedure To_C
  379.      (Item       : in Wide_String;
  380.       Target     : out wchar_array;
  381.       Count      : out size_t;
  382.       Append_Nul : in  Boolean := True)
  383.    is
  384.       To : size_t;
  385.  
  386.    begin
  387.       if Target'Length < Item'Length then
  388.          raise Constraint_Error;
  389.  
  390.       else
  391.          To := Target'First;
  392.          for From in Item'Range loop
  393.             Target (To) := wchar_t (Item (From));
  394.             To := To + 1;
  395.          end loop;
  396.  
  397.          if Append_Nul then
  398.             if To > Target'Last then
  399.                raise Constraint_Error;
  400.             else
  401.                Target (To) := wide_nul;
  402.             end if;
  403.          end if;
  404.       end if;
  405.    end To_C;
  406.  
  407. end Interfaces.C;
  408.