You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by tn...@apache.org on 2001/05/10 22:51:34 UTC
cvs commit: xml-xerces/c/src/validators/datatype DecimalDatatypeValidator.cpp DecimalDatatypeValidator.hpp Makefile.in
tng 01/05/10 13:51:34
Modified: c/Projects/OS2/VACPP40 xerces_util.icc
c/src/util Makefile.in
c/src/validators/datatype Makefile.in
Added: c/src/util XMLBigDecimal.cpp XMLBigDecimal.hpp
XMLBigInteger.cpp XMLBigInteger.hpp
c/src/validators/datatype DecimalDatatypeValidator.cpp
DecimalDatatypeValidator.hpp
Log:
Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
Revision Changes Path
1.5 +3 -1 xml-xerces/c/Projects/OS2/VACPP40/xerces_util.icc
Index: xerces_util.icc
===================================================================
RCS file: /home/cvs/xml-xerces/c/Projects/OS2/VACPP40/xerces_util.icc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- xerces_util.icc 2001/03/02 20:05:02 1.4
+++ xerces_util.icc 2001/05/10 20:51:12 1.5
@@ -3,7 +3,7 @@
BASE_DIR "\\src\\util\\BinInputStream.cpp",
BASE_DIR "\\src\\util\\BinMemInputStream.cpp",
BASE_DIR "\\src\\util\\BitSet.cpp",
- BASE_DIR "\\src\\util\\HashPtr.cpp",
+ BASE_DIR "\\src\\util\\HashPtr.cpp",
BASE_DIR "\\src\\util\\HashXMLCh.cpp",
BASE_DIR "\\src\\util\\HeaderDummy.cpp",
BASE_DIR "\\src\\util\\KVStringPair.cpp",
@@ -15,6 +15,8 @@
BASE_DIR "\\src\\util\\XML256TableTranscoder.cpp",
BASE_DIR "\\src\\util\\XML88591Transcoder.cpp",
BASE_DIR "\\src\\util\\XMLASCIITranscoder.cpp",
+ BASE_DIR "\\src\\util\\XMLBigDecimal.cpp",
+ BASE_DIR "\\src\\util\\XMLBigInteger.cpp",
BASE_DIR "\\src\\util\\XMLChTranscoder.cpp",
BASE_DIR "\\src\\util\\XMLEBCDICTranscoder.cpp",
BASE_DIR "\\src\\util\\XMLException.cpp",
1.33 +7 -0 xml-xerces/c/src/util/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/util/Makefile.in,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- Makefile.in 2001/04/19 17:47:56 1.32
+++ Makefile.in 2001/05/10 20:51:18 1.33
@@ -55,6 +55,9 @@
#
#
# $Log: Makefile.in,v $
+# Revision 1.33 2001/05/10 20:51:18 tng
+# Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
+#
# Revision 1.32 2001/04/19 17:47:56 knoaman
# A string tokenizer utility.
#
@@ -293,6 +296,8 @@
XML256TableTranscoder.hpp \
XML88591Transcoder.hpp \
XMLASCIITranscoder.hpp \
+ XMLBigDecimal.hpp \
+ XMLBigInteger.hpp \
XMLChTranscoder.hpp \
XMLIBM1140Transcoder.hpp \
XMLDeleterFor.hpp \
@@ -350,6 +355,8 @@
XML256TableTranscoder.$(TO) \
XML88591Transcoder.$(TO) \
XMLASCIITranscoder.$(TO) \
+ XMLBigDecimal.$(TO) \
+ XMLBigInteger.$(TO) \
XMLChTranscoder.$(TO) \
XMLIBM1140Transcoder.$(TO) \
XMLEBCDICTranscoder.$(TO) \
1.1 xml-xerces/c/src/util/XMLBigDecimal.cpp
Index: XMLBigDecimal.cpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Log: XMLBigDecimal.cpp,v $
* Revision 1.1 2001/05/10 20:51:20 tng
* Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
*
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <string.h>
#include <iostream.h>
#include <util/XMLBigDecimal.hpp>
#include <util/PlatformUtils.hpp>
#include <util/XMLString.hpp>
#include <util/XMLUniDefs.hpp>
#include <util/NumberFormatException.hpp>
#include <util/RuntimeException.hpp>
#include <util/TransService.hpp>
#include <util/Janitor.hpp>
/**
* Constructs a BigDecimal from a string containing an optional minus
* sign followed by a sequence of zero or more decimal digits, optionally
* followed by a fraction, which consists of a decimal point followed by
* zero or more decimal digits. The string must contain at least one
* digit in the integer or fractional part. The scale of the resulting
* BigDecimal will be the number of digits to the right of the decimal
* point in the string, or 0 if the string contains no decimal point.
* Any extraneous characters (including whitespace) will result in
* a NumberFormatException.
*/
//
// since parseBigDecimal and XMLBigInteger() may
// throw exception, caller of XMLBigDecimal better
// be ready to catch it.
//
XMLBigDecimal::XMLBigDecimal(const XMLCh* const strValue)
:fIntVal(0)
,fScale(0)
{
XMLCh* ret_value = new XMLCh[XMLString::stringLen(strValue)+1];
ArrayJanitor<XMLCh> janName(ret_value);
parseBigDecimal(strValue, ret_value, fScale);
fIntVal = new XMLBigInteger(ret_value);
}
XMLBigDecimal::XMLBigDecimal(const XMLBigDecimal& toCopy)
:fIntVal(0)
,fScale(toCopy.getScale())
{
//invoke XMLBigInteger' copy ctor
fIntVal = new XMLBigInteger(*(toCopy.getValue()));
}
/***
*
* Leading and trailing whitespaces are allowed, and trimmed
*
* Only one and either of (+,-) after the leading whitespace, before
* any other characters are allowed, '+' removed
*
* '.' allowed and removed
* return status: void
* retBuffer: w/o leading and/or trailing whitespace
* w/o '+' and containning one '-' if any
* w/o leading zero
* w/o '.'
*
* scalevalue: indicate the number of digits, right to
* the '.'
*
* see XMLBigInteger::parseBigInteger();
* XMLString::textToBin();
*
* " +000203.456" "203456"
* " -000203.456" "-203456"
* " -000.456" "-456"
*
***/
void XMLBigDecimal::parseBigDecimal(const XMLCh* const toConvert
, XMLCh* const retBuffer
, unsigned int & scaleValue)
{
scaleValue = 0;
// If no string, then its a failure
if ((!toConvert) ||
(!*toConvert))
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLINT_Invalid);
// Scan past any whitespace. If we hit the end, then return failure
const XMLCh* startPtr = toConvert;
while (XMLPlatformUtils::fgTransService->isSpace(*startPtr))
startPtr++;
if (!*startPtr)
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLINT_Invalid);
// Start at the end and work back through any whitespace
const XMLCh* endPtr = toConvert + XMLString::stringLen(toConvert);
while (XMLPlatformUtils::fgTransService->isSpace(*(endPtr - 1)))
endPtr--;
//
// Work through what remains and convert each char to a digit.
//
XMLCh* retPtr = retBuffer;
//
// '+' or '-' is allowed only at the first position
//
if (*startPtr == chDash)
{
// copy the '-'
*retPtr = chDash;
startPtr++;
retPtr++;
}
else if (*startPtr == chPlus)
{
// skip the '+'
startPtr++;
}
// Leading zero will be taken care by BigInteger
bool dotSignFound = false;
while (startPtr < endPtr)
{
//
// '.' is allowed only once
//
if (*startPtr == chPeriod)
{
if (dotSignFound == false)
{
dotSignFound = true;
scaleValue = endPtr - startPtr - 1;
startPtr++;
continue;
}
else
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLBIGDECIMAL_MANY_DOT);
}
// If not valid decimal digit, then an error
if ((*startPtr < chDigit_0) || (*startPtr > chDigit_9))
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLBIGDECIMAL_Invalid);
// copy over
*retPtr = *startPtr;
retPtr++;
startPtr++;
}
*retPtr = 0; //terminated
return;
}
/**
* Returns -1, 0 or 1 as lValue is less than, equal to, or greater
* than rValue. Two BigDecimals that are equal in value but have a
* different scale (e.g., 2.0, 2.00) are considered equal by this method.
*/
int XMLBigDecimal::compareValues(const XMLBigDecimal* const lValue
, const XMLBigDecimal* const rValue)
{
//
if ((!lValue) ||
(!rValue) )
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLBIGDECIMAL_Null_value);
/* Optimization: would run fine without the next three lines */
int sigDiff = lValue->getSign() - rValue->getSign();
if (sigDiff != 0)
return (sigDiff > 0 ? 1 : -1);
//
// If signs match, scale and compare intVals
// since matchScale will destructively change the scale
// we make a copy for both
//
if (lValue->getScale() != rValue->getScale())
{
XMLBigDecimal lTemp = *lValue;
XMLBigDecimal rTemp = *rValue;
matchScale(&lTemp, &rTemp);
return XMLBigInteger::compareValues(lTemp.getValue(), rTemp.getValue());
}
return XMLBigInteger::compareValues(lValue->getValue(), rValue->getValue());
}
/*
* If the scales of lValue and rValue differ, rescale (destructively)
* the lower-scaled BigDecimal so they match.
*
* rescale the lower-scaled will not lose precision.
*
*/
void XMLBigDecimal::matchScale(XMLBigDecimal* const lValue
, XMLBigDecimal* const rValue)
{
if (lValue->getScale() < rValue->getScale())
lValue->reScale(rValue->getScale());
else
if (lValue->getScale() > rValue->getScale())
rValue->reScale(lValue->getScale());
}
void XMLBigDecimal::reScale(unsigned int newScale)
{
if (newScale < 0)
return;
/* Handle the easy cases */
if (newScale == this->getScale())
return;
else if (newScale > this->getScale())
{
fIntVal->multiply(newScale - this->getScale());
fScale = newScale;
}
else /* scale < this.scale */
{
fIntVal->divide(this->getScale() - newScale);
fScale = newScale;
}
return;
}
void XMLBigDecimal::dumpData() const
{
cout<<"scale="<<"<"<<fScale<<">"<<endl;
fIntVal->dumpData();
cout<<endl;
}
1.1 xml-xerces/c/src/util/XMLBigDecimal.hpp
Index: XMLBigDecimal.hpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Id: XMLBigDecimal.hpp,v 1.1 2001/05/10 20:51:22 tng Exp $
*/
#ifndef XML_BIGDECIMAL_HPP
#define XML_BIGDECIMAL_HPP
#include <util/XercesDefs.hpp>
#include <util/XMLBigInteger.hpp>
class XMLUTIL_EXPORT XMLBigDecimal
{
public:
/**
* Constructs a newly allocated <code>XMLBigDecimal</code> object that
* represents the value represented by the string.
*
* @param the <code>String</code> to be converted to an
* <code>XMLBigDecimal</code>.
* @exception NumberFormatException if the <code>String</code> does not
* contain a parsable XMLBigDecimal.
*/
XMLBigDecimal(const XMLCh* const strValue);
~XMLBigDecimal();
XMLBigDecimal(const XMLBigDecimal& toCopy);
static void parseBigDecimal(const XMLCh* const strValue
, XMLCh* const retValue
, unsigned int& scaleValue);
static int compareValues(const XMLBigDecimal* const lValue
, const XMLBigDecimal* const rValue);
static void matchScale(XMLBigDecimal* const lValue
, XMLBigDecimal* const rValue);
/**
* Returns the sign of this number
*
* -1 negative
* 0 zero
* 1 positive
*
*/
int getSign() const;
XMLBigInteger* getValue() const;
unsigned int getScale() const;
unsigned int getTotalDigit() const;
void dumpData() const;
/**
* Compares this object to the specified object.
* The result is <code>true</code> if and only if the argument is not
* <code>null</code> and is an <code>XMLBigDecimal</code> object that contains
* the same <code>int</code> value as this object.
*
* @param obj the object to compare with.
* @return <code>true</code> if the objects are the same;
* <code>false</code> otherwise.
*/
bool operator==(const XMLBigDecimal& toCompare) const;
private:
void reScale(unsigned int newValue);
// -----------------------------------------------------------------------
// Private data members
//
// fIntVal
// the XMLBigInteger holding the value of this BigDecimal.
//
// fScale
// the number of digits to the right of the decimal point
//
// -----------------------------------------------------------------------
XMLBigInteger* fIntVal;
unsigned int fScale;
};
inline XMLBigDecimal::~XMLBigDecimal()
{
delete fIntVal;
}
inline int XMLBigDecimal::getSign() const
{
return fIntVal->getSign();
}
inline XMLBigInteger* XMLBigDecimal::getValue() const
{
return fIntVal;
}
inline unsigned int XMLBigDecimal::getScale() const
{
return fScale;
}
inline unsigned int XMLBigDecimal::getTotalDigit() const
{
return fIntVal->getTotalDigit();
}
inline bool XMLBigDecimal::operator==(const XMLBigDecimal& toCompare) const
{
return ( XMLBigInteger::compareValues(this->fIntVal, toCompare.fIntVal) == 0 ? true : false);
}
#endif
1.1 xml-xerces/c/src/util/XMLBigInteger.cpp
Index: XMLBigInteger.cpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Log: XMLBigInteger.cpp,v $
* Revision 1.1 2001/05/10 20:51:23 tng
* Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
*
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <string.h>
#include <iostream.h>
#include <util/XMLBigInteger.hpp>
#include <util/XMLString.hpp>
#include <util/NumberFormatException.hpp>
#include <util/RuntimeException.hpp>
#include <util/PlatformUtils.hpp>
#include <util/TransService.hpp>
#include <util/XMLUniDefs.hpp>
#include <util/XMLUni.hpp>
#include <util/Janitor.hpp>
/***
*
* Leading and trailing whitespaces are allowed, and trimmed
*
* Only one and either of (+,-) after the leading whitespace, before
* any other characters are allowed, and trimmed
*
* Leading zero, after leading whitespace, (+|-), before any other
* characters are allowed, and trimmed
*
* '.' NOT allowed
* return status: void
* ret_buf: w/o leading and/or trailing whitespace
* w/o '+' and '-'
* w/o leading zero
*
* see XMLInteger::parseInteger();
* XMLString::textToBin();
*
* " +000203456" "203456"
* " -000203456" "203456"
*
***/
void XMLBigInteger::parseBigInteger(const XMLCh* const toConvert
, XMLCh* retBuffer
, int& signValue)
{
// If no string, then its a failure
if ((!toConvert) ||
(!*toConvert))
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLINT_Invalid);
//
// Note: in Java's BigInteger, it seems any leading and/or trailing
// whitespaces are not allowed. If this is the case, we may
// need to skip the trimming below.
//
// Scan past any whitespace. If we hit the end, then return failure
const XMLCh* startPtr = toConvert;
while (XMLPlatformUtils::fgTransService->isSpace(*startPtr))
startPtr++;
if (!*startPtr)
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLINT_Invalid);
// Start at the end and work back through any whitespace
const XMLCh* endPtr = toConvert + XMLString::stringLen(toConvert);
while (XMLPlatformUtils::fgTransService->isSpace(*(endPtr - 1)))
endPtr--;
//
// Work through what remains and convert each char to a digit.
// anything other than '
//
XMLCh* retPtr = retBuffer;
signValue = 1;
//
// '+' or '-' is allowed only at the first position
//
if (*startPtr == chDash)
{
signValue = -1;
startPtr++;
}
else if (*startPtr == chPlus)
{
// skip the '+'
startPtr++;
}
// Scan past any leading zero.
while (*startPtr == chDigit_0)
startPtr++;
if (!*startPtr)
{
signValue = 0;
// containning zero, only zero, nothing but zero
// it is a zero, indeed
return;
}
while (startPtr < endPtr)
{
// If not valid decimal digit, then an error
if ((*startPtr < chDigit_0) || (*startPtr > chDigit_9))
ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLINT_Invalid);
// copy over
*retPtr = *startPtr;
retPtr++;
startPtr++;
}
*retPtr = 0; //terminated
return;
}
/**
* Translates a string containing an optional minus sign followed by a
* sequence of one or more digits into a BigInteger.
* Any extraneous characters (including whitespace),
* inclusive, will result in a NumberFormatException.
*/
XMLBigInteger::XMLBigInteger(const XMLCh* const strValue)
{
XMLCh* ret_value = new XMLCh[XMLString::stringLen(strValue)+1];
ArrayJanitor<XMLCh> janName(ret_value);
try
{
parseBigInteger(strValue, ret_value, fSign);
}
catch (NumberFormatException)
{
throw;
//ThrowXML(NumberFormatException, XMLExcepts::CM_UnaryOpHadBinType);
//ThrowXML(NumberFormatException, XMLExcepts::XMLBIGDECIMAL_Inv_format);
}
if (fSign == 0)
fMagnitude = XMLString::replicate(XMLUni::fgZeroLenString);
else
{
unsigned int strLen = XMLString::stringLen(ret_value);
fMagnitude = new XMLCh[strLen+1];
XMLString::moveChars(fMagnitude, ret_value, strLen);
fMagnitude[strLen]=0;
}
}
XMLBigInteger::~XMLBigInteger()
{
delete[] fMagnitude;
}
XMLBigInteger::XMLBigInteger(const XMLBigInteger& toCopy)
{
setSign(toCopy.getSign());
int strLen = XMLString::stringLen(toCopy.fMagnitude);
fMagnitude = new XMLCh[strLen+1];
XMLString::moveChars(fMagnitude, toCopy.fMagnitude, strLen);
fMagnitude[strLen]=0;
}
/**
* Returns -1, 0 or 1 as lValue is less than, equal to, or greater
* than rValue.
*/
int XMLBigInteger::compareValues(const XMLBigInteger* const lValue
, const XMLBigInteger* const rValue)
{
int lSign = lValue->getSign();
int rSign = rValue->getSign();
//
// different sign
//
if (lSign != rSign)
return(lSign > rSign ? 1 : -1);
//
// same sign
//
if (lSign == 0) // optimization
return 0;
int lStrLen = XMLString::stringLen(lValue->fMagnitude);
int rStrLen = XMLString::stringLen(rValue->fMagnitude);
//
// different length
//
if (lStrLen > rStrLen)
return ( lSign > 0 ? 1 : -1 );
else if (lStrLen < rStrLen)
return ( lSign > 0 ? -1 : 1 );
//
// same length
// XMLString::compareString() return > 0, 0 and <0
// we need to convert it to 1, 0, and -1
//
int retVal = XMLString::compareString(lValue->fMagnitude, rValue->fMagnitude);
if ( retVal > 0 )
{
return ( lSign > 0 ? 1 : -1 );
}
else if ( retVal < 0 )
{
return ( lSign > 0 ? -1 : 1 );
}
else
return 0;
}
/**
* Shift the fMagnitude to the left
*/
void XMLBigInteger::multiply(const unsigned int byteToShift)
{
if (byteToShift <= 0)
return;
int strLen = XMLString::stringLen(fMagnitude);
XMLCh* tmp = new XMLCh[strLen+byteToShift+1];
XMLString::moveChars(tmp, fMagnitude, strLen);
unsigned int i = 0;
for ( ; i < byteToShift; i++)
tmp[strLen+i] = chDigit_0;
tmp[strLen+i] = chNull;
delete[] fMagnitude;
fMagnitude = tmp;
}
/**
* Shift the fMagnitude to the right
* by doing this, we lose precision.
*/
void XMLBigInteger::divide(const unsigned int byteToShift)
{
if (byteToShift <= 0)
return;
int strLen = XMLString::stringLen(fMagnitude);
XMLCh* tmp = new XMLCh[strLen-byteToShift+1];
XMLString::moveChars(tmp, fMagnitude, strLen-byteToShift);
tmp[strLen-byteToShift] = chNull;
delete[] fMagnitude;
fMagnitude = tmp;
}
void XMLBigInteger::dumpData() const
{
char *p;
p = XMLString::transcode(fMagnitude);
cout<<"sign="<<"<"<<fSign<<">"<<endl;
cout<<"fMagnitude="<<"<"<<p<<">"<<endl;
cout<<endl;
delete[] p;
}
1.1 xml-xerces/c/src/util/XMLBigInteger.hpp
Index: XMLBigInteger.hpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Id: XMLBigInteger.hpp,v 1.1 2001/05/10 20:51:24 tng Exp $
*/
#ifndef XML_BIGINTEGER_HPP
#define XML_BIGINTEGER_HPP
#include <util/XercesDefs.hpp>
#include <util/XMLString.hpp>
class XMLUTIL_EXPORT XMLBigInteger
{
public:
/**
* Constructs a newly allocated <code>XMLBigInteger</code> object that
* represents the value represented by the string. The string is
* converted to an int value as if by the <code>valueOf</code> method.
*
* @param s the <code>String</code> to be converted to an
* <code>XMLBigInteger</code>.
* @exception NumberFormatException if the <code>String</code> does not
* contain a parsable XMLBigInteger.
*/
XMLBigInteger(const XMLCh* const strValue);
~XMLBigInteger();
XMLBigInteger(const XMLBigInteger& toCopy);
static void parseBigInteger(const XMLCh* const toConvert
, XMLCh* const retBuffer
, int& signValue);
static int compareValues(const XMLBigInteger* const lValue
,const XMLBigInteger* const rValue);
void multiply(const unsigned int byteToShift);
void divide(const unsigned int byteToShift);
int getTotalDigit() const;
void dumpData() const;
/**
* Compares this object to the specified object.
* The result is <code>true</code> if and only if the argument is not
* <code>null</code> and is an <code>XMLBigInteger</code> object that contains
* the same <code>int</code> value as this object.
*
* @param obj the object to compare with.
* @return <code>true</code> if the objects are the same;
* <code>false</code> otherwise.
*/
bool operator==(const XMLBigInteger& toCompare) const;
/**
* Returns the signum function of this number (i.e., -1, 0 or 1 as
* the value of this number is negative, zero or positive).
*/
int getSign() const;
private:
void setSign(int);
/*
* The number is internally stored in "minimal" sign-fMagnitude format
* (i.e., no BigIntegers have a leading zero byte in their magnitudes).
* Zero is represented with a signum of 0 (and a zero-length fMagnitude).
* Thus, there is exactly one representation for each value.
*/
// -----------------------------------------------------------------------
// Private data members
//
// fSign
// to represent the sign of the number.
//
// fMagnitude
// the buffer holding the number.
//
// -----------------------------------------------------------------------
int fSign;
XMLCh* fMagnitude; //null terminated
};
inline int XMLBigInteger::getSign() const
{
return fSign;
}
inline int XMLBigInteger::getTotalDigit() const
{
return ((getSign() ==0) ? 0 : XMLString::stringLen(fMagnitude));
}
inline bool XMLBigInteger::operator==(const XMLBigInteger& toCompare) const
{
return ( compareValues(this, &toCompare) ==0 ? true : false);
}
inline void XMLBigInteger::setSign(int newSign)
{
fSign = newSign;
}
#endif
1.4 +5 -0 xml-xerces/c/src/validators/datatype/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/validators/datatype/Makefile.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Makefile.in 2001/05/09 18:43:41 1.3
+++ Makefile.in 2001/05/10 20:51:31 1.4
@@ -55,6 +55,9 @@
#
#
# $Log: Makefile.in,v $
+# Revision 1.4 2001/05/10 20:51:31 tng
+# Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
+#
# Revision 1.3 2001/05/09 18:43:41 tng
# Add StringDatatypeValidator and BooleanDatatypeValidator. By Pei Yong Zhang.
#
@@ -92,6 +95,7 @@
DatatypeValidator.hpp \
DatatypeValidatorFactory.hpp \
BooleanDatatypeValidator.hpp \
+ DecimalDatatypeValidator.hpp \
StringDatatypeValidator.hpp
VALIDATORS_DATATYPE_CPP_PRIVHEADERS =
@@ -102,6 +106,7 @@
DatatypeValidator.$(TO) \
DatatypeValidatorFactory.$(TO) \
BooleanDatatypeValidator.$(TO) \
+ DecimalDatatypeValidator.$(TO) \
StringDatatypeValidator.$(TO)
1.1 xml-xerces/c/src/validators/datatype/DecimalDatatypeValidator.cpp
Index: DecimalDatatypeValidator.cpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Log: DecimalDatatypeValidator.cpp,v $
* Revision 1.1 2001/05/10 20:51:29 tng
* Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger. By Pei Yong Zhang.
*
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <validators/datatype/DecimalDatatypeValidator.hpp>
#include <validators/schema/SchemaSymbols.hpp>
#include <validators/datatype/InvalidDatatypeFacetException.hpp>
#include <validators/datatype/InvalidDatatypeValueException.hpp>
#include <util/NumberFormatException.hpp>
// ---------------------------------------------------------------------------
// Constructors and Destructor
// ---------------------------------------------------------------------------
DecimalDatatypeValidator::DecimalDatatypeValidator(
DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets
, const int finalSet)
:DatatypeValidator(baseValidator, facets, finalSet, DatatypeValidator::Decimal)
, fTotalDigits(0)
, fFractionDigits(0)
, fMaxInclusive(0)
, fMaxExclusive(0)
, fMinInclusive(0)
, fMinExclusive(0)
, fEnumeration(0)
{
try
{
init(baseValidator, facets);
}
catch (XMLException&)
{
cleanUp();
throw;
}
}
void DecimalDatatypeValidator::init(DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets)
{
// Set Facets if any defined
if (facets)
{
XMLCh* key;
XMLCh* value;
RefVectorOf<XMLCh>* fStrEnumeration = 0; // save the literal value
Janitor<RefVectorOf<XMLCh> > janStrEnum(fStrEnumeration);
RefHashTableOfEnumerator<KVStringPair> e(facets);
while (e.hasMoreElements())
{
KVStringPair pair = e.nextElement();
key = pair.getKey();
value = pair.getValue();
if (XMLString::compareString(key, SchemaSymbols::fgELT_PATTERN)==0)
{
setPattern(value);
if (getPattern())
setFacetsDefined(DatatypeValidator::FACET_PATTERN);
// do not construct regex until needed
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_ENUMERATION)==0)
{
if (fStrEnumeration)
delete fStrEnumeration;
fStrEnumeration = XMLString::tokenizeString(value);
setFacetsDefined(DatatypeValidator::FACET_ENUMERATION);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_MAXINCLUSIVE)==0)
{
try
{
setMaxInclusive(new XMLBigDecimal(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_MaxInc);
}
setFacetsDefined(DatatypeValidator::FACET_MAXINCLUSIVE);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_MAXEXCLUSIVE)==0)
{
try
{
setMaxExclusive(new XMLBigDecimal(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_MaxExc);
}
setFacetsDefined(DatatypeValidator::FACET_MAXEXCLUSIVE);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_MININCLUSIVE)==0)
{
try
{
setMinInclusive(new XMLBigDecimal(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_MinInc);
}
setFacetsDefined(DatatypeValidator::FACET_MININCLUSIVE);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_MINEXCLUSIVE)==0)
{
try
{
setMinExclusive(new XMLBigDecimal(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_MinExc);
}
setFacetsDefined(DatatypeValidator::FACET_MINEXCLUSIVE);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_PRECISION)==0)
{
try
{
setTotalDigits(XMLString::parseInt(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_Precision);
}
// check 4.3.11.c0 must: totalDigits > 0
if ( fTotalDigits <= 0 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Neg_Precision);
//InvalidDatatypeFacetException("totalDigits value '"+fTotalDigits+"' must be a positiveInteger.");
setFacetsDefined(DatatypeValidator::FACET_PRECISSION);
}
else if (XMLString::compareString(key, SchemaSymbols::fgELT_FRACTIONDIGITS)==0)
{
try
{
setFractionDigits(XMLString::parseInt(value));
}
catch (NumberFormatException)
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Inv_Precision);
}
// check 4.3.12.c0 must: fractionDigits > 0
if ( fFractionDigits < 0 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Neg_Fraction);
//InvalidDatatypeFacetException("fractionDigits value '"+fFractionDigits+"' must be a positiveInteger.");
setFacetsDefined(DatatypeValidator::FACET_SCALE);
}
else
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_Tag);
}
}//while
/***
Schema constraint: Part I -- self checking
***/
if ( getFacetsDefined() != 0 )
{
// non co-existence checking
// check 4.3.8.c1 error: maxInclusive + maxExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) )
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_max_inc_exc);
// "It is an error for both maxInclusive and maxExclusive to be specified
// for the same datatype." );
}
// non co-existence checking
// check 4.3.9.c1 error: minInclusive + minExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_min_inc_exc);
// "It is an error for both minInclusive and minExclusive to be specified
// for the same datatype." );
}
//
// minExclusive < minInclusive <= maxInclusive < maxExclusive
//
// check 4.3.7.c1 must: minInclusive <= maxInclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
if ( XMLBigDecimal::compareValues(getMinInclusive(), getMaxInclusive()) == 1 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_inc_min_max);
// "minInclusive value ='" + getMinInclusive(false) + "'must be <=
// maxInclusive value ='" + getMaxInclusive(false) + "'. " );
}
// check 4.3.8.c2 must: minExclusive <= maxExclusive ??? minExclusive < maxExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) )
{
if ( XMLBigDecimal::compareValues(getMinExclusive(), getMaxExclusive()) == 1 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_exc_min_max);
// "minExclusive value ='" + getMinExclusive(false) + "'must be <=
// maxExclusive value ='" + getMaxExclusive(false) + "'. " );
}
// check 4.3.9.c2 must: minExclusive < maxInclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) )
{
if ( XMLBigDecimal::compareValues(getMinExclusive(), getMaxInclusive()) != -1 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxinc_minexc);
// "minExclusive value ='" + getMinExclusive(false) + "'must be >
// maxInclusive value ='" + getMaxInclusive(false) + "'. " );
}
// check 4.3.10.c1 must: minInclusive < maxExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
if ( XMLBigDecimal::compareValues(getMinInclusive(), getMaxExclusive()) != -1 )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
// ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_maxexc);
// "minInclusive value ='" + getMinInclusive(false) + "'must be <
// maxExclusive value ='" + getMaxExclusive(false) + "'. " );
}
// check 4.3.12.c1 must: fractionDigits <= totalDigits
if ( ((getFacetsDefined() & DatatypeValidator::FACET_SCALE) != 0) &&
((getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) != 0) )
{
if ( fFractionDigits > fTotalDigits )
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_scale_precision);
// "fractionDigits value ='" + this.fFractionDigits + "'must be <=
// totalDigits value ='" + this.fTotalDigits + "'. " );
}
} // if getFacetsDefined
/***
Schema constraint: Part II -- self vs base
***/
if ( baseValidator != 0 )
{
DecimalDatatypeValidator* numBase = (DecimalDatatypeValidator*)baseValidator;
// this
// minExclusive maxExclusive
// minInclusive maxInclusive
//
// base
// minExclusive maxExclusive
// minInclusive maxExclusive
//
if ( getFacetsDefined() != 0 )
{
// check 4.3.7.c2 error:
// maxInclusive > base.maxInclusive
// maxInclusive >= base.maxExclusive
// maxInclusive < base.minInclusive
// maxInclusive <= base.minExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) )
{
if ( ((numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxInclusive(), numBase->getMaxInclusive()) == 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxinc_base_maxinc);
// "maxInclusive value ='" + getMaxInclusive(false) + "' must be <=
// base.maxInclusive value ='" + getMaxInclusive(true) + "'." );
if ( ((numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxInclusive(), numBase->getMaxExclusive()) != -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxinc_base_maxexc);
// "maxInclusive value ='" + getMaxInclusive(false) + "' must be <
// base.maxExclusive value ='" + getMaxExclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxInclusive(), numBase->getMinInclusive()) == -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxinc_base_mininc);
// "maxInclusive value ='" + getMaxInclusive(false) + "' must be >=
// base.minInclusive value ='" + getMinInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxInclusive(), numBase->getMinExclusive() ) != 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxinc_base_minexc);
// "maxInclusive value ='" + getMaxInclusive(false) + "' must be >
// base.minExclusive value ='" + getMinExclusive(true) + "'." );
}
// check 4.3.8.c3 error:
// maxExclusive > base.maxExclusive
// maxExclusive > base.maxInclusive
// maxExclusive <= base.minInclusive
// maxExclusive <= base.minExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) )
{
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxExclusive(), numBase->getMaxExclusive()) == 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxexc_base_maxexc);
// "maxExclusive value ='" + getMaxExclusive(false) + "' must be
// <= base.maxExclusive value ='" + getMaxExclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxExclusive(), numBase->getMaxInclusive()) == 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxexc_base_maxinc);
// "maxExclusive value ='" + getMaxExclusive(false) + "' must be
// <= base.maxInclusive value ='" + getMaxInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxExclusive(), numBase->getMinExclusive() ) != 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxexc_base_mininc);
// "maxExclusive value ='" + getMaxExclusive(false) + "' must be
// > base.minExclusive value ='" + getMinExclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMaxExclusive(), numBase->getMinInclusive()) != 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_maxexc_base_minexc);
// "maxExclusive value ='" + getMaxExclusive(false) + "' must be
// > base.minInclusive value ='" + getMinInclusive(true) + "'." );
}
// check 4.3.9.c3 error:
// minExclusive < base.minExclusive
// minExclusive > base.maxInclusive ??? minExclusive >= base.maxInclusive
// minExclusive < base.minInclusive
// minExclusive >= base.maxExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) )
{
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinExclusive(), numBase->getMinExclusive() ) == -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_minexc);
// "minExclusive value ='" + getMinExclusive(false) + "' must be
// >= base.minExclusive value ='" + getMinExclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinExclusive(), numBase->getMaxInclusive()) == 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_maxinc);
// "minExclusive value ='" + getMinExclusive(false) + "' must be
// <= base.maxInclusive value ='" + getMaxInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinExclusive(), numBase->getMinInclusive()) == -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_mininc);
// "minExclusive value ='" + getMinExclusive(false) + "' must be
// >= base.minInclusive value ='" + getMinInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinExclusive(), numBase->getMaxExclusive()) != -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_maxexc);
// "minExclusive value ='" + getMinExclusive(false) + "' must be
// < base.maxExclusive value ='" + getMaxExclusive(true) + "'." );
}
// check 4.3.10.c2 error:
// minInclusive < base.minInclusive
// minInclusive > base.maxInclusive
// minInclusive <= base.minExclusive
// minInclusive >= base.maxExclusive
if ( ((getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) )
{
if ( ((numBase->getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinInclusive(), numBase->getMinInclusive()) == -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_mininc);
// "minInclusive value ='" + getMinInclusive(false) + "' must be
// >= base.minInclusive value ='" + getMinInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinInclusive(), numBase->getMaxInclusive()) == 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_maxinc);
// "minInclusive value ='" + getMinInclusive(false) + "' must be
// <= base.maxInclusive value ='" + getMaxInclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinInclusive(), numBase->getMinExclusive() ) != 1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_minexc);
// "minInclusive value ='" + getMinInclusive(false) + "' must be
// > base.minExclusive value ='" + getMinExclusive(true) + "'." );
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
( XMLBigDecimal::compareValues(getMinInclusive(), numBase->getMaxExclusive()) != -1 ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_mininc_base_maxexc);
// "minInclusive value ='" + getMinInclusive(false) + "' must be
// < base.maxExclusive value ='" + getMaxExclusive(true) + "'." );
}
// check 4.3.11.c1 error: totalDigits > base.totalDigits
if (( getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) != 0)
{
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) != 0) &&
( fTotalDigits > numBase->fTotalDigits ))
ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_totdigit_base_totdigit);
// "totalDigits value ='" + fTotalDigits + "' must be
// <= base.totalDigits value ='" + numBase.fTotalDigits + "'." );
}
// check question error: fractionDigits > base.fractionDigits ???
// check question error: fractionDigits > base.totalDigits ???
// check question error: totalDigits conflicts with bounds ???
// check 4.3.5.c0 must: enumeration values from the value space of base
//
// In fact, the values in the enumeration shall go through validation
// of this class as well.
// this->checkContent(value, false);
//
if ( ((getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) != 0) &&
( fStrEnumeration != 0 ))
{
int i = 0;
int enumLength = fStrEnumeration->size();
try
{
for ( ; i < enumLength; i++)
// ask parent do a complete check
numBase->checkContent(fStrEnumeration->elementAt(i), false);
}
catch ( XMLException& )
{
ThrowXML1(InvalidDatatypeFacetException
, XMLExcepts::FACET_enum_base
, fStrEnumeration->elementAt(i));
}
//
// we need to convert from fStrEnumeration to fEnumeration
try
{
fEnumeration = new RefVectorOf<XMLBigDecimal>(enumLength, true);
for ( ; i < enumLength; i++)
fEnumeration->insertElementAt(new XMLBigDecimal(fStrEnumeration->elementAt(i)), i);
}
catch ( NumberFormatException& )
{
ThrowXML1(InvalidDatatypeFacetException
, XMLExcepts::FACET_enum_base
, fStrEnumeration->elementAt(i));
}
}
}
/***
Schema constraint: Part III -- inherit from base
***/
// inherit enumeration
if ( ((getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) == 0 ) &&
((numBase->getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) != 0 ))
{
setFacetsDefined(DatatypeValidator::FACET_ENUMERATION);
// need to adopt the Vector
RefVectorOf<XMLBigDecimal>* fBaseEnumeration = numBase->fEnumeration;
int enumLength = fBaseEnumeration->size();
fEnumeration = new RefVectorOf<XMLBigDecimal>(enumLength, true);
for ( int i = 0; i < enumLength; i++)
fEnumeration->insertElementAt(fBaseEnumeration->elementAt(i), i);
}
// inherit maxExclusive
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) == 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) == 0) )
{
setMaxExclusive(new XMLBigDecimal(*(numBase->getMaxExclusive())));
setFacetsDefined(DatatypeValidator::FACET_MAXEXCLUSIVE);
}
// inherit maxInclusive
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) == 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) == 0) )
{
setMaxInclusive(new XMLBigDecimal(*(numBase->getMaxInclusive())));
setFacetsDefined(DatatypeValidator::FACET_MAXINCLUSIVE);
}
// inherit minExclusive
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) == 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) == 0) )
{
setMinExclusive(new XMLBigDecimal(*(numBase->getMinExclusive())));
setFacetsDefined(DatatypeValidator::FACET_MINEXCLUSIVE);
}
// inherit minExclusive
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) == 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) == 0) )
{
setMinInclusive(new XMLBigDecimal(*(numBase->getMinInclusive())));
setFacetsDefined(DatatypeValidator::FACET_MININCLUSIVE);
}
// inherit totalDigits
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) == 0) )
{
setTotalDigits(numBase->fTotalDigits);
setFacetsDefined(DatatypeValidator::FACET_PRECISSION);
}
// inherit fractionDigits
if ( (( numBase->getFacetsDefined() & DatatypeValidator::FACET_SCALE) != 0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_SCALE) == 0) )
{
setFractionDigits(numBase->fFractionDigits);
setFacetsDefined(DatatypeValidator::FACET_SCALE);
}
// inherit enumeration
if ((( numBase->getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) !=0) &&
(( getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION) == 0))
{
setFacetsDefined(DatatypeValidator::FACET_ENUMERATION);
// need to adopt the Vector
RefVectorOf<XMLBigDecimal>* fBaseEnumeration = numBase->fEnumeration;
int enumLength = fBaseEnumeration->size();
fEnumeration = new RefVectorOf<XMLBigDecimal>(enumLength, true);
for ( int i = 0; i < enumLength; i++)
//invoke XMLBigDecimal's copy ctor
fEnumeration->insertElementAt(new XMLBigDecimal(*(fBaseEnumeration->elementAt(i))), i);
}
} //if baseValidator
}// End of Facet setting
}
void DecimalDatatypeValidator::checkContent( const XMLCh* const content, bool asBase)
{
//validate against base validator if any
DecimalDatatypeValidator *pBase = (DecimalDatatypeValidator*) this->getBaseValidator();
if (pBase !=0)
pBase->checkContent(content, true);
// we check pattern first
if ( (getFacetsDefined() & DatatypeValidator::FACET_PATTERN ) != 0 )
{
// lazy construction
if (getRegex() ==0)
setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
if (getRegex()->matches(content) ==false)
{
ThrowXML2(InvalidDatatypeValueException
, XMLExcepts::VALUE_NotMatch_Pattern
, content
, getPattern());
}
}
// if this is a base validator, we only need to check pattern facet
// all other facet were inherited by the derived type
if (asBase)
return;
XMLBigDecimal theValue(content);
XMLBigDecimal *theData = &theValue;
if (fEnumeration != 0)
{
int i=0;
int enumLength = fEnumeration->size();
for ( ; i < enumLength; i++)
{
if (XMLBigDecimal::compareValues(theData, fEnumeration->elementAt(i))==0)
break;
}
if (i == enumLength)
ThrowXML1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content);
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_SCALE) != 0 )
{
if ( theData->getScale() > fFractionDigits )
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_scale);
// "'" + content + "'" + " with totalDigits = '"+ totalDigits +"'"
// "'" + fTotalDigits + "'"} ));
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_PRECISSION) != 0 )
{
if ( theData->getTotalDigit() > fTotalDigits )
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_precision);
// "'" + content + "'" + " with totalDigits = '"+ totalDigits +"'"
// "'" + fTotalDigits + "'"} ));
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_MAXEXCLUSIVE) != 0 )
{
// must be < MaxExclusive
if (XMLBigDecimal::compareValues(theData, getMaxExclusive()) != -1)
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_maxexc);
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_MAXINCLUSIVE) != 0 )
{
// must be <= MaxInclusive
if (XMLBigDecimal::compareValues(theData, getMaxInclusive()) == 1)
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_maxinc);
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_MININCLUSIVE) != 0 )
{
// must be >= MinInclusive
if (XMLBigDecimal::compareValues(theData, getMinInclusive()) == -1)
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_mininc);
}
if ( (getFacetsDefined() & DatatypeValidator::FACET_MINEXCLUSIVE) != 0 )
{
// must be > MinExclusive
if (XMLBigDecimal::compareValues(theData, getMinExclusive()) != 1)
ThrowXML(InvalidDatatypeValueException, XMLExcepts::FACET_Len_maxLen);
//ThrowXML(InvalidDatatypeValueException, XMLExcepts::VALUE_exceed_mininc);
}
}
// ---------------------------------------------------------------------------
// Whitespace handling methods
// ---------------------------------------------------------------------------
/**
* End of file DecimalDatatypeValidator::cpp
*/
1.1 xml-xerces/c/src/validators/datatype/DecimalDatatypeValidator.hpp
Index: DecimalDatatypeValidator.hpp
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/*
* $Id: DecimalDatatypeValidator.hpp,v 1.1 2001/05/10 20:51:30 tng Exp $
*/
#if !defined(DECIMAL_DATATYPEVALIDATOR_HPP)
#define DECIMAL_DATATYPEVALIDATOR_HPP
#include <validators/datatype/DatatypeValidator.hpp>
#include <util/RefVectorOf.hpp>
#include <util/XMLBigDecimal.hpp>
class VALIDATORS_EXPORT DecimalDatatypeValidator : public DatatypeValidator
{
public:
// -----------------------------------------------------------------------
// Public ctor/dtor
// -----------------------------------------------------------------------
/** @name Constructor. */
//@{
DecimalDatatypeValidator();
DecimalDatatypeValidator(DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets
, const int finalSet);
virtual ~DecimalDatatypeValidator();
//@}
// -----------------------------------------------------------------------
// Validation methods
// -----------------------------------------------------------------------
/** @name Validation Function */
//@{
/**
* validate that a string matches the boolean datatype
* @param content A string containing the content to be validated
*
* @exception throws InvalidDatatypeException if the content is
* is not valid.
*/
void validate(const XMLCh* const content);
//@}
// -----------------------------------------------------------------------
// Compare methods
// -----------------------------------------------------------------------
/** @name Compare Function */
//@{
/**
* Compare two boolean data types
*
* @param content1
* @param content2
* @return
*/
int compare(const XMLCh* const, const XMLCh* const);
//@}
/**
* Returns an instance of the base datatype validator class
* Used by the DatatypeValidatorFactory.
*/
DatatypeValidator* newInstance(DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets
, const int finalSet);
private:
void checkContent( const XMLCh* const content, bool asBase);
void init(DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets);
void cleanUp();
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
unsigned int getTotalDigits() const;
unsigned int getFractionDigits() const;
XMLBigDecimal* const getMaxInclusive() const;
XMLBigDecimal* const getMaxExclusive() const;
XMLBigDecimal* const getMinInclusive() const;
XMLBigDecimal* const getMinExclusive() const;
RefVectorOf<XMLBigDecimal>* getEnumeration() const;
// -----------------------------------------------------------------------
// Setter methods
// -----------------------------------------------------------------------
void setTotalDigits(unsigned int);
void setFractionDigits(unsigned int);
void setMaxInclusive(XMLBigDecimal* const);
void setMaxExclusive(XMLBigDecimal* const);
void setMinInclusive(XMLBigDecimal* const);
void setMinExclusive(XMLBigDecimal* const);
void setEnumeration(RefVectorOf<XMLBigDecimal>* );
// -----------------------------------------------------------------------
// Private data members
//
// -----------------------------------------------------------------------
unsigned int fTotalDigits;
unsigned int fFractionDigits;
XMLBigDecimal* fMaxInclusive;
XMLBigDecimal* fMaxExclusive;
XMLBigDecimal* fMinInclusive;
XMLBigDecimal* fMinExclusive;
RefVectorOf<XMLBigDecimal>* fEnumeration; // save the actual value
};
inline DecimalDatatypeValidator::DecimalDatatypeValidator()
:DatatypeValidator(0, 0, 0, DatatypeValidator::Decimal)
, fTotalDigits(0)
, fFractionDigits(0)
, fMaxInclusive(0)
, fMaxExclusive(0)
, fMinInclusive(0)
, fMinExclusive(0)
, fEnumeration(0)
{
}
inline DecimalDatatypeValidator::~DecimalDatatypeValidator()
{
cleanUp();
}
// -----------------------------------------------------------------------
// Compare methods
// -----------------------------------------------------------------------
inline int DecimalDatatypeValidator::compare(const XMLCh* const lValue
, const XMLCh* const rValue)
{
return XMLBigDecimal::compareValues(new XMLBigDecimal(lValue)
, new XMLBigDecimal(rValue));
}
inline DatatypeValidator* DecimalDatatypeValidator::newInstance(
DatatypeValidator* const baseValidator
, RefHashTableOf<KVStringPair>* const facets
, const int finalSet)
{
return (DatatypeValidator*) new DecimalDatatypeValidator(baseValidator, facets, finalSet);
}
inline void DecimalDatatypeValidator::validate( const XMLCh* const content)
{
checkContent(content, false);
}
inline void DecimalDatatypeValidator::cleanUp()
{
delete fMaxInclusive;
delete fMaxExclusive;
delete fMinInclusive;
delete fMinExclusive;
//~RefVectorOf will delete all adopted elements
delete fEnumeration;
}
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
inline unsigned int DecimalDatatypeValidator::getTotalDigits() const
{
return fTotalDigits;
}
inline unsigned int DecimalDatatypeValidator::getFractionDigits() const
{
return fFractionDigits;
}
inline XMLBigDecimal* const DecimalDatatypeValidator::getMaxInclusive() const
{
return fMaxInclusive;
}
inline XMLBigDecimal* const DecimalDatatypeValidator::getMaxExclusive() const
{
return fMaxExclusive;
}
inline XMLBigDecimal* const DecimalDatatypeValidator::getMinInclusive() const
{
return fMinInclusive;
}
inline XMLBigDecimal* const DecimalDatatypeValidator::getMinExclusive() const
{
return fMinExclusive;
}
inline RefVectorOf<XMLBigDecimal>* DecimalDatatypeValidator::getEnumeration() const
{
return fEnumeration;
}
// -----------------------------------------------------------------------
// Setter methods
// -----------------------------------------------------------------------
inline void DecimalDatatypeValidator::setTotalDigits(unsigned int newTotalDigits)
{
fTotalDigits = newTotalDigits;
}
inline void DecimalDatatypeValidator::setFractionDigits(unsigned int newFractionDigits)
{
fFractionDigits = newFractionDigits;
}
inline void DecimalDatatypeValidator::setMaxInclusive(XMLBigDecimal* const newMaxInclusive)
{
if (fMaxInclusive) delete fMaxInclusive;
fMaxInclusive = newMaxInclusive;
}
inline void DecimalDatatypeValidator::setMaxExclusive(XMLBigDecimal* const newMaxExclusive)
{
if (fMaxExclusive) delete fMaxExclusive;
fMaxExclusive = newMaxExclusive;
}
inline void DecimalDatatypeValidator::setMinInclusive(XMLBigDecimal* const newMinInclusive)
{
if (fMinInclusive) delete fMinInclusive;
fMinInclusive = newMinInclusive;
}
inline void DecimalDatatypeValidator::setMinExclusive(XMLBigDecimal* const newMinExclusive)
{
if (fMinExclusive) delete fMinExclusive;
fMinExclusive = newMinExclusive;
}
inline void DecimalDatatypeValidator::setEnumeration(RefVectorOf<XMLBigDecimal>* newEnum)
{
fEnumeration = newEnum;
}
/**
* End of file DecimalDatatypeValidator.hpp
*/
#endif
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org