xmlfloat.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 235 行

CPP
235
字号
/* * Copyright 2001,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: XMLFloat.cpp,v 1.16 2004/09/09 20:09:30 peiyongz Exp $ * $Log: XMLFloat.cpp,v $ * Revision 1.16  2004/09/09 20:09:30  peiyongz * getDataOverflowed() * * Revision 1.15  2004/09/08 13:56:24  peiyongz * Apache License Version 2.0 * * Revision 1.14  2003/12/17 00:18:35  cargilld * Update to memory management so that the static memory manager (one used to call Initialize) is only for static data. * * Revision 1.13  2003/10/15 14:50:01  peiyongz * Bugzilla#22821: locale-sensitive function used to validate 'double' type, patch * from jsweeney@spss.com (Jeff Sweeney) * * Revision 1.12  2003/09/23 18:16:07  peiyongz * Inplementation for Serialization/Deserialization * * Revision 1.11  2003/05/16 06:01:53  knoaman * Partial implementation of the configurable memory manager. * * Revision 1.10  2003/05/16 03:11:22  knoaman * Partial implementation of the configurable memory manager. * * Revision 1.9  2003/03/10 20:55:58  peiyongz * Schema Errata E2-40 double/float * * Revision 1.8  2003/02/02 23:54:43  peiyongz * getFormattedString() added to return original and converted value. * * Revision 1.7  2003/01/30 19:14:43  tng * On some platforms like Solaris strtod will return -0.0.   So need to consider this scenario as well. * * Revision 1.6  2002/12/11 19:55:16  peiyongz * set negZero/posZero for float. * * Revision 1.5  2002/12/11 00:20:02  peiyongz * Doing businesss in value space. Converting out-of-bound value into special values. * * Revision 1.4  2002/11/04 15:22:05  tng * C++ Namespace Support. * * Revision 1.3  2002/09/24 19:51:24  tng * Performance: use XMLString::equals instead of XMLString::compareString * * Revision 1.2  2002/05/03 16:05:45  peiyongz * Bug 7341: Missing newline at end of util and DOM source files, * patch from Martin Kalen. * * Revision 1.1.1.1  2002/02/01 22:22:15  peiyongz * sane_include * * Revision 1.13  2001/11/19 21:33:42  peiyongz * Reorganization: Double/Float * * Revision 1.12  2001/11/19 17:27:55  peiyongz * Boundary Values updated * * Revision 1.11  2001/10/26 16:37:46  peiyongz * Add thread safe code * * Revision 1.9  2001/09/20 13:11:41  knoaman * Regx  + misc. fixes * * Revision 1.8  2001/09/14 13:57:59  peiyongz * exponent is a must if 'E' or 'e' is present. * * Revision 1.7  2001/08/23 11:54:26  tng * Add newline at the end and various typo fixes. * * Revision 1.6  2001/08/21 15:10:15  peiyongz * Bugzilla# 3017: MSVC5.0: C2202: 'compareSpecial' : not all * control paths return a value * * Revision 1.5  2001/08/14 22:10:20  peiyongz * new exception message added * * Revision 1.4  2001/07/31 17:38:16  peiyongz * Fix: memory leak by static (boundry) objects * * Revision 1.3  2001/07/31 13:48:29  peiyongz * fValue removed * * Revision 1.2  2001/07/27 20:43:53  peiyongz * copy ctor: to check for special types. * * Revision 1.1  2001/07/26 20:41:37  peiyongz * XMLFloat * * */// ---------------------------------------------------------------------------//  Includes// ---------------------------------------------------------------------------#include <xercesc/util/XMLFloat.hpp>#include <xercesc/util/XMLString.hpp>#include <xercesc/util/NumberFormatException.hpp>#include <xercesc/util/Janitor.hpp>#include <string.h>#include <errno.h>#include <stdlib.h>#include <float.h>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------//  ctor/dtor// ---------------------------------------------------------------------------XMLFloat::XMLFloat(const XMLCh* const strValue,                   MemoryManager* const manager):XMLAbstractDoubleFloat(manager){    init(strValue);}XMLFloat::~XMLFloat(){}void XMLFloat::checkBoundary(const XMLCh* const strValue){    char *nptr = XMLString::transcode(strValue, getMemoryManager());    normalizeDecimalPoint(nptr);    ArrayJanitor<char> jan1(nptr, getMemoryManager());    int   strLen = strlen(nptr);    char *endptr = 0;    errno = 0;    fValue = strtod(nptr, &endptr);    // check if all chars are valid char    if ( (endptr - nptr) != strLen)    {        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, getMemoryManager());    }    // check if overflow/underflow occurs    if (errno == ERANGE)    {        fDataConverted = true;        if ( fValue < 0 )        {            if (fValue > (-1)*DBL_MIN)            {                fValue = 0;            }            else            {                fType = NegINF;                fDataOverflowed = true;            }        }        else if ( fValue > 0)        {            if (fValue < DBL_MIN )            {                fValue = 0;            }            else            {                fType = PosINF;                fDataOverflowed = true;            }        }    }    else    {        /**         *  float related checking         */        if (fValue < (-1) * FLT_MAX)        {            fType = NegINF;            fDataConverted = true;            fDataOverflowed = true;        }        else if (fValue > (-1)*FLT_MIN && fValue < 0)        {            fDataConverted = true;            fValue = 0;        }        else if (fValue > 0 && fValue < FLT_MIN )        {            fDataConverted = true;            fValue = 0;        }        else if  (fValue > FLT_MAX)        {            fType = PosINF;            fDataConverted = true;            fDataOverflowed = true;        }    }}/*** * Support for Serialization/De-serialization ***/IMPL_XSERIALIZABLE_TOCREATE(XMLFloat)XMLFloat::XMLFloat(MemoryManager* const manager):XMLAbstractDoubleFloat(manager){}void XMLFloat::serialize(XSerializeEngine& serEng){    XMLAbstractDoubleFloat::serialize(serEng);}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?