s-wchjis.adb (JIS_To_EUC): Raise Constraint_Error for invalid value

2006-02-13  Robert Dewar  <dewar@adacore.com>

	* s-wchjis.adb (JIS_To_EUC): Raise Constraint_Error for invalid value

From-SVN: r111102
This commit is contained in:
Robert Dewar 2006-02-15 10:46:58 +01:00 committed by Arnaud Charlet
parent bfe7c10c9b
commit 405b3ed444

View File

@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2005, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
@ -31,6 +31,8 @@
-- -- -- --
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
with System.Pure_Exceptions; use System.Pure_Exceptions;
package body System.WCh_JIS is package body System.WCh_JIS is
type Byte is mod 256; type Byte is mod 256;
@ -68,7 +70,7 @@ package body System.WCh_JIS is
---------------- ----------------
procedure JIS_To_EUC procedure JIS_To_EUC
(J : in Wide_Character; (J : Wide_Character;
EUC1 : out Character; EUC1 : out Character;
EUC2 : out Character) EUC2 : out Character)
is is
@ -76,10 +78,28 @@ package body System.WCh_JIS is
JIS2 : constant Natural := Wide_Character'Pos (J) rem 256; JIS2 : constant Natural := Wide_Character'Pos (J) rem 256;
begin begin
-- Special case of small Katakana
if JIS1 = 0 then if JIS1 = 0 then
-- The value must be in the range 16#80# to 16#FF# so that the upper
-- bit is set in both bytes.
if JIS2 < 16#80# then
Raise_Exception (CE, "invalid small Katakana character");
end if;
EUC1 := Character'Val (EUC_Hankaku_Kana); EUC1 := Character'Val (EUC_Hankaku_Kana);
EUC2 := Character'Val (JIS2); EUC2 := Character'Val (JIS2);
-- The upper bit of both characters must be clear, or this is not
-- a valid character for representation in EUC form.
elsif JIS1 > 16#7F# or else JIS2 > 16#7F# then
Raise_Exception (CE, "wide character value out of EUC range");
-- Result is just the two characters with upper bits set
else else
EUC1 := Character'Val (JIS1 + 16#80#); EUC1 := Character'Val (JIS1 + 16#80#);
EUC2 := Character'Val (JIS2 + 16#80#); EUC2 := Character'Val (JIS2 + 16#80#);
@ -91,7 +111,7 @@ package body System.WCh_JIS is
---------------------- ----------------------
procedure JIS_To_Shift_JIS procedure JIS_To_Shift_JIS
(J : in Wide_Character; (J : Wide_Character;
SJ1 : out Character; SJ1 : out Character;
SJ2 : out Character) SJ2 : out Character)
is is