mirror of
https://github.com/AdaCore/xmlada.git
synced 2026-02-12 12:30:28 -08:00
124 lines
5.2 KiB
Ada
124 lines
5.2 KiB
Ada
------------------------------------------------------------------------------
|
|
-- XML/Ada - An XML suite for Ada95 --
|
|
-- --
|
|
-- Copyright (C) 2005-2017, AdaCore --
|
|
-- --
|
|
-- This library is free software; you can redistribute it and/or modify it --
|
|
-- under terms of the GNU General Public License as published by the Free --
|
|
-- Software Foundation; either version 3, or (at your option) any later --
|
|
-- version. This library is distributed in the hope that it will be useful, --
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
|
|
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
|
|
-- --
|
|
-- As a special exception under Section 7 of GPL version 3, you are granted --
|
|
-- additional permissions described in the GCC Runtime Library Exception, --
|
|
-- version 3.1, as published by the Free Software Foundation. --
|
|
-- --
|
|
-- You should have received a copy of the GNU General Public License and --
|
|
-- a copy of the GCC Runtime Library Exception along with this program; --
|
|
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
|
-- <http://www.gnu.org/licenses/>. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- This package provides the basic types to define the facets for an XSD type
|
|
|
|
pragma Ada_05;
|
|
|
|
with Sax.Symbols;
|
|
with Sax.Utils;
|
|
with Unicode.CES;
|
|
|
|
package Schema.Decimal is
|
|
|
|
---------------------------------
|
|
-- Arbitrary_Precision_Numbers --
|
|
---------------------------------
|
|
-- This type provides some minimal handling for arbitrary precision
|
|
-- numbers as described by the "decimal" and "integer" types.
|
|
-- This is *not* an arbitrary-precision library, which is not needed in the
|
|
-- context of XML
|
|
|
|
type Arbitrary_Precision_Number is private;
|
|
Undefined_Number : constant Arbitrary_Precision_Number;
|
|
|
|
function Image
|
|
(Number : Arbitrary_Precision_Number) return Unicode.CES.Byte_Sequence;
|
|
-- Return a displayable version of Number
|
|
|
|
procedure Value
|
|
(Symbols : Sax.Utils.Symbol_Table;
|
|
Ch : Unicode.CES.Byte_Sequence;
|
|
Val : out Arbitrary_Precision_Number;
|
|
Error : out Sax.Symbols.Symbol);
|
|
-- Convert Ch to a number.
|
|
-- Raises a Validation_Error if this is not a valid number
|
|
|
|
function Value (Val : Sax.Symbols.Symbol) return Arbitrary_Precision_Number;
|
|
-- Assumes [Val] is a valid Arbitrary_Precision_Number.
|
|
|
|
procedure Value_No_Exponent
|
|
(Symbols : Sax.Utils.Symbol_Table;
|
|
Ch : Unicode.CES.Byte_Sequence;
|
|
Val : out Arbitrary_Precision_Number;
|
|
Error : out Sax.Symbols.Symbol);
|
|
-- Same as value, but does not allow a "E" part
|
|
|
|
function "<" (Num1, Num2 : Arbitrary_Precision_Number) return Boolean;
|
|
function "<=" (Num1, Num2 : Arbitrary_Precision_Number) return Boolean;
|
|
function "=" (Num1, Num2 : Arbitrary_Precision_Number) return Boolean;
|
|
function ">=" (Num1, Num2 : Arbitrary_Precision_Number) return Boolean;
|
|
function ">" (Num1, Num2 : Arbitrary_Precision_Number) return Boolean;
|
|
-- Compare two numbers
|
|
|
|
function Check_Digits
|
|
(Symbols : Sax.Utils.Symbol_Table;
|
|
Num : Arbitrary_Precision_Number;
|
|
Fraction_Digits, Total_Digits : Integer := -1)
|
|
return Sax.Symbols.Symbol;
|
|
-- Check whether the two facets Fraction_Digits and Total_Digits match.
|
|
-- If any of the two values is negative, no check is done for it.
|
|
-- Returns an error message or [No_Symbol].
|
|
|
|
---------------
|
|
-- XML_Float --
|
|
---------------
|
|
-- This type represents a floating point value (float or double in XSD),
|
|
-- including infinity and NaN
|
|
|
|
type XML_Float is private;
|
|
Unknown_Float : constant XML_Float;
|
|
|
|
function "<=" (F1, F2 : XML_Float) return Boolean;
|
|
function "<" (F1, F2 : XML_Float) return Boolean;
|
|
function ">=" (F1, F2 : XML_Float) return Boolean;
|
|
function ">" (F1, F2 : XML_Float) return Boolean;
|
|
-- Compare two numbers
|
|
|
|
function Image (Value : XML_Float) return String;
|
|
-- Return a displayable version of Number
|
|
|
|
function Value (Str : String) return XML_Float;
|
|
-- Return the float stored in Str (including +INF, -INF)
|
|
|
|
private
|
|
type Arbitrary_Precision_Number is record
|
|
Value : Sax.Symbols.Symbol;
|
|
end record;
|
|
Undefined_Number : constant Arbitrary_Precision_Number :=
|
|
(Value => Sax.Symbols.No_Symbol);
|
|
|
|
type XML_Float_Kind is (Plus_Infinity, Minus_Infinity, NaN, Standard_Float);
|
|
type XML_Float (Kind : XML_Float_Kind := NaN) is record
|
|
case Kind is
|
|
when Standard_Float =>
|
|
Mantiss : Long_Long_Float;
|
|
Exp : Integer;
|
|
when others =>
|
|
null;
|
|
end case;
|
|
end record;
|
|
Unknown_Float : constant XML_Float := (Kind => NaN);
|
|
|
|
end Schema.Decimal;
|