From 405b3ed444dd41d7818ab4da3da2f1ceb26ea4d4 Mon Sep 17 00:00:00 2001 From: Robert Dewar Date: Wed, 15 Feb 2006 10:46:58 +0100 Subject: [PATCH] s-wchjis.adb (JIS_To_EUC): Raise Constraint_Error for invalid value 2006-02-13 Robert Dewar * s-wchjis.adb (JIS_To_EUC): Raise Constraint_Error for invalid value From-SVN: r111102 --- gcc/ada/s-wchjis.adb | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/gcc/ada/s-wchjis.adb b/gcc/ada/s-wchjis.adb index 5ac43a67bfc..079712f97b7 100644 --- a/gcc/ada/s-wchjis.adb +++ b/gcc/ada/s-wchjis.adb @@ -6,7 +6,7 @@ -- -- -- 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 -- -- 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 type Byte is mod 256; @@ -68,7 +70,7 @@ package body System.WCh_JIS is ---------------- procedure JIS_To_EUC - (J : in Wide_Character; + (J : Wide_Character; EUC1 : out Character; EUC2 : out Character) is @@ -76,10 +78,28 @@ package body System.WCh_JIS is JIS2 : constant Natural := Wide_Character'Pos (J) rem 256; begin + -- Special case of small Katakana + 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); 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 EUC1 := Character'Val (JIS1 + 16#80#); EUC2 := Character'Val (JIS2 + 16#80#); @@ -91,7 +111,7 @@ package body System.WCh_JIS is ---------------------- procedure JIS_To_Shift_JIS - (J : in Wide_Character; + (J : Wide_Character; SJ1 : out Character; SJ2 : out Character) is -- 2.30.2