------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUNTIME COMPONENTS                          --
--                                                                          --
--                       S Y S T E M . W C H _ S T W                        --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--                            $Revision: 1.14 $
--                                                                          --
--          Copyright (C) 1992-2000 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,  59 Temple Place - Suite 330,  Boston, --
-- MA 02111-1307, USA.                                                      --
--                                                                          --
-- As a special exception,  if other files  instantiate  generics from this --
-- unit, or you link  this unit with other files  to produce an executable, --
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
-- covered  by the  GNU  General  Public  License.  This exception does not --
-- however invalidate  any other reasons why  the executable file  might be --
-- covered by the  GNU Public License.                                      --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
--                                                                          --
------------------------------------------------------------------------------

with Interfaces;     use Interfaces;
with System.WCh_Con; use System.WCh_Con;
with System.WCh_JIS; use System.WCh_JIS;

package body System.WCh_StW is

   ---------------------------
   -- String_To_Wide_String --
   ---------------------------

   function String_To_Wide_String
     (S    : String;
      EM   : WC_Encoding_Method)
      return Wide_String
   is
      R  : Wide_String (1 .. S'Length);
      RP : Natural;
      SP : Natural;
      U1 : Unsigned_16;
      U2 : Unsigned_16;
      U3 : Unsigned_16;
      U  : Unsigned_16;

      Last : constant Natural := S'Last;

      function Get_Hex (C : Character) return Unsigned_16;
      --  Converts character from hex digit to value in range 0-15. The
      --  input must be in 0-9, A-F, or a-f, and no check is needed.

      procedure Get_Hex_4;
      --  Translates four hex characters starting at S (SP) to a single
      --  wide character. Used in WCEM_Hex and WCEM_Brackets mode. SP
      --  is not modified by the call. The resulting wide character value
      --  is stored in R (RP). RP is not modified by the call.

      function Get_Hex (C : Character) return Unsigned_16 is
      begin
         if C in '0' .. '9' then
            return Character'Pos (C) - Character'Pos ('0');
         elsif C in 'A' .. 'F' then
            return Character'Pos (C) - Character'Pos ('A') + 10;
         else
            return Character'Pos (C) - Character'Pos ('a') + 10;
         end if;
      end Get_Hex;

      procedure Get_Hex_4 is
      begin
         R (RP) := Wide_Character'Val (
            Get_Hex (S (SP + 3)) + 16 *
              (Get_Hex (S (SP + 2)) + 16 *
                (Get_Hex (S (SP + 1)) + 16 *
                  (Get_Hex (S (SP + 0))))));
      end Get_Hex_4;

   --  Start of processing for String_To_Wide_String

   begin
      SP := S'First;
      RP := 0;

      case EM is

         --  ESC-Hex representation

         when WCEM_Hex =>
            while SP <= Last - 4 loop
               RP := RP + 1;

               if S (SP) = ASCII.ESC then
                  SP := SP + 1;
                  Get_Hex_4;
                  SP := SP + 4;
               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

         --  Upper bit shift, internal code = external code

         when WCEM_Upper =>
            while SP < Last loop
               RP := RP + 1;

               if S (SP) >= Character'Val (16#80#) then
                  U1 := Character'Pos (S (SP));
                  U2 := Character'Pos (S (SP + 1));
                  R (RP) := Wide_Character'Val (256 * U1 + U2);
                  SP := SP + 2;
               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

         --  Upper bit shift, shift-JIS

         when WCEM_Shift_JIS =>
            while SP < Last loop
               RP := RP + 1;

               if S (SP) >= Character'Val (16#80#) then
                  R (RP) := Shift_JIS_To_JIS (S (SP), S (SP + 1));
                  SP := SP + 2;
               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

         --  Upper bit shift, EUC

         when WCEM_EUC =>
            while SP < Last loop
               RP := RP + 1;

               if S (SP) >= Character'Val (16#80#) then
                  R (RP) := EUC_To_JIS (S (SP), S (SP + 1));
                  SP := SP + 2;
               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

         --  Upper bit shift, UTF-8

         when WCEM_UTF8 =>
            while SP < Last loop
               RP := RP + 1;

               if S (SP) >= Character'Val (16#80#) then
                  U1 := Character'Pos (S (SP));
                  U2 := Character'Pos (S (SP + 1));

                  U := Shift_Left (U1 and 2#00011111#, 6) +
                         (U2 and 2#00111111#);
                  SP := SP + 2;

                  if U1 >= 2#11100000# then
                     U3 := Character'Pos (S (SP));
                     U := Shift_Left (U, 6) + (U3 and 2#00111111#);
                     SP := SP + 1;
                  end if;

                  R (RP) := Wide_Character'Val (U);

               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

         --  Brackets representation

         when WCEM_Brackets =>
            while SP <= Last - 7 loop
               RP := RP + 1;

               if S (SP) = '['
                 and then S (SP + 1) = '"'
                 and then S (SP + 2) /= '"'
               then
                  SP := SP + 2;
                  Get_Hex_4;
                  SP := SP + 6;

               else
                  R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
                  SP := SP + 1;
               end if;
            end loop;

      end case;

      while SP <= Last loop
         RP := RP + 1;
         R (RP) := Wide_Character'Val (Character'Pos (S (SP)));
         SP := SP + 1;
      end loop;

      return R (1 .. RP);
   end String_To_Wide_String;

end System.WCh_StW;
