home *** CD-ROM | disk | FTP | other *** search
- ------------------------------------------------------------------------------
- -- --
- -- GNAT RUNTIME COMPONENTS --
- -- --
- -- S Y S T E M . W C H _ C N V --
- -- --
- -- B o d y --
- -- --
- -- $Revision: 1.1 $ --
- -- --
- -- Copyright (c) 1992,1993,1994 NYU, All Rights Reserved --
- -- --
- -- The GNAT library is free software; you can redistribute it and/or modify --
- -- it under terms of the GNU Library General Public License as published by --
- -- the Free Software Foundation; either version 2, or (at your option) any --
- -- later version. The GNAT library is distributed in the hope that it will --
- -- be useful, but WITHOUT ANY WARRANTY; without even the implied warranty --
- -- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
- -- Library General Public License for more details. You should have --
- -- received a copy of the GNU Library General Public License along with --
- -- the GNAT library; see the file COPYING.LIB. If not, write to the Free --
- -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
- -- --
- ------------------------------------------------------------------------------
-
- -- This package contains generic subprograms used for converting between
- -- sequences of Character and Wide_Character. All access to wide character
- -- sequences is isolated in this unit.
-
- with System.WCh_Con; use System.WCh_Con;
- with System.WCh_JIS; use System.WCh_JIS;
-
- package body System.WCh_Cnv is
-
- --------------------------------
- -- Char_Sequence_To_Wide_Char --
- --------------------------------
-
- function Char_Sequence_To_Wide_Char
- (C : Character;
- EM : WC_Encoding_Method)
- return Wide_Character
- is
- B1, B2 : Integer;
-
- begin
- case EM is
-
- when WCEM_None =>
- return Wide_Character'Val (Character'Pos (C));
-
- when WCEM_Hex =>
- if C /= Ascii.ESC then
- return Wide_Character'Val (Character'Pos (C));
-
- else
- B1 := 0;
-
- for J in 1 .. 4 loop
- B2 := Character'Pos (In_Char);
-
- if B2 in Character'Pos ('0') .. Character'Pos ('9') then
- B1 := B1 * 16 + B2 - Character'Pos ('0');
-
- elsif B2 in Character'Pos ('A') .. Character'Pos ('F') then
- B1 := B1 * 16 + B2 - (Character'Pos ('A') - 10);
-
- else
- raise Constraint_Error;
- end if;
- end loop;
-
- return Wide_Character'Val (B1);
- end if;
-
- when WCEM_Upper =>
- if C > Ascii.DEL then
- return
- Wide_Character'Val
- (256 * Character'Pos (C) + Character'Pos (In_Char));
- else
- return Wide_Character'Val (Character'Pos (C));
- end if;
-
- when WCEM_Shift_JIS =>
- if C > Ascii.DEL then
- return Shift_JIS_To_JIS (C, In_Char);
- else
- return Wide_Character'Val (Character'Pos (C));
- end if;
-
- when WCEM_EUC =>
- if C > Ascii.DEL then
- return EUC_To_JIS (C, In_Char);
- else
- return Wide_Character'Val (Character'Pos (C));
- end if;
- end case;
- end Char_Sequence_To_Wide_Char;
-
- --------------------------------
- -- Wide_Char_To_Char_Sequence --
- --------------------------------
-
- procedure Wide_Char_To_Char_Sequence
- (WC : Wide_Character;
- EM : WC_Encoding_Method)
- is
- Val : constant Natural := Wide_Character'Pos (WC);
- Hexc : constant array (0 .. 15) of Character := "0123456789ABCDEF";
- C1, C2 : Character;
-
- begin
- case EM is
-
- when WCEM_None =>
- if Val < 256 then
- Out_Char (Character'Val (Val));
- else
- raise Constraint_Error;
- end if;
-
- when WCEM_Hex =>
- if Val < 256 then
- Out_Char (Character'Val (Val));
-
- else
- Out_Char (Ascii.ESC);
- Out_Char (Hexc (Val / (16**3)));
- Out_Char (Hexc ((Val / (16**2)) mod 16));
- Out_Char (Hexc ((Val / 16) mod 16));
- Out_Char (Hexc (Val mod 16));
- end if;
-
- when WCEM_Upper =>
- if Val < 128 then
- Out_Char (Character'Val (Val));
-
- elsif Val < 16#8000# then
- raise Constraint_Error;
-
- else
- Out_Char (Character'Val (Val / 256));
- Out_Char (Character'Val (Val mod 256));
- end if;
-
- when WCEM_Shift_JIS =>
- if Val < 128 then
- Out_Char (Character'Val (Val));
- else
- JIS_To_Shift_JIS (WC, C1, C2);
- Out_Char (C1);
- Out_Char (C2);
- end if;
-
- when WCEM_EUC =>
- if Val < 128 then
- Out_Char (Character'Val (Val));
- else
- JIS_To_EUC (WC, C1, C2);
- Out_Char (C1);
- Out_Char (C2);
- end if;
-
- end case;
- end Wide_Char_To_Char_Sequence;
-
- end System.WCh_Cnv;
-