------------------------------------------------------------------------------ -- -- -- G N U _ M U L T I P L E _ P R E C I S I O N . E X T R A S . Z -- -- -- -- B o d y -- -- -- -- $Revision: 1.2 $ -- -- -- -- Copyright (C) 1999 Michael Roe -- -- -- -- This 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. -- -- -- ------------------------------------------------------------------------------ with Interfaces.C; use type Interfaces.C.int; use type Interfaces.C.size_t; package body GNU_Multiple_Precision.Z.Extras is function ">" (X, Y : Big_Integer) return Boolean is begin return Compare (X, Y) > 0; end ">"; function "<" (X, Y : Big_Integer) return Boolean is begin return Compare (X, Y) < 0; end "<"; function "<=" (X, Y : Big_Integer) return Boolean is begin return Compare (X, Y) <= 0; end "<="; function ">=" (X, Y : Big_Integer) return Boolean is begin return Compare (X, Y) >= 0; end ">="; function ">" (X : Big_Integer; Y : Integer) return Boolean is begin return Compare (X, Y) > 0; end ">"; function "<" (X : Big_Integer; Y : Integer) return Boolean is begin return Compare (X, Y) < 0; end "<"; function "<=" (X : Big_Integer; Y : Integer) return Boolean is begin return Compare (X, Y) <= 0; end "<="; function ">=" (X : Big_Integer; Y : Integer) return Boolean is begin return Compare (X, Y) >= 0; end ">="; function ">" (X : Integer; Y : Big_Integer) return Boolean is begin return Compare (Y, X) < 0; end ">"; function "<" (X : Integer; Y : Big_Integer) return Boolean is begin return Compare (Y, X) > 0; end "<"; function "<=" (X : Integer; Y : Big_Integer) return Boolean is begin return Compare (Y, X) >= 0; end "<="; function ">=" (X : Integer; Y : Big_Integer) return Boolean is begin return Compare (Y, X) <= 0; end ">="; procedure Set_String (Rop : in out Big_Integer; Str : in String; Base : in Positive := 10) is begin Set_C_String (Rop, Interfaces.C.To_C (Str), Interfaces.C.int (Base)); end Set_String; function To_String (Op : Big_Integer; Base : Positive := 10) return String is Ptr : System.Address; Buff : Interfaces.C.char_array (0 .. Size_In_Base (Op, Interfaces.C.int (Base)) + 1); -- NB : The size of Buff must be 2 greater than the value returned -- by Size_In_Base to allow space for a minus sign at the beginning -- and a NUL at the end. begin Ptr := Get_String (Buff'Address, Base, Op); if Base = 10 then return Interfaces.C.To_Ada (Buff); else -- If the base isn't 10, add an Ada-style indication of what base -- the number is in. If the number is negative, strip the minus off -- the front of the number and put it back on before the indication -- of the base. Also need to remove the leading space from the front -- of the value returned by Integer'Image. declare Base_String : String := Integer'Image (Base); begin if Op < 0 then return "-" & Base_String (Base_String'First + 1 .. Base_String'Last) & "#" & Interfaces.C.To_Ada (Buff (1 .. Buff'Last)) & "#"; else return Base_String (Base_String'First + 1 .. Base_String'Last) & "#" & Interfaces.C.To_Ada (Buff) & "#"; end if; end; end if; end To_String; procedure Invert (Rop : out Big_Integer; Op1, Op2 : in Big_Integer) is Return_Code : Interfaces.C.int; begin Invert (Return_Code, Rop, Op1, Op2); if Return_Code = 0 then raise Constraint_Error; end if; end Invert; end GNU_Multiple_Precision.Z.Extras;