peiyongz 2004/09/13 14:24:21
Modified: c/src/xercesc/framework/psvi XSValue.hpp XSValue.cpp
Log:
1. returned data to contain datatype in addition to value
2. registry to map type name (in string) to type name enum
Revision Changes Path
1.11 +54 -34 xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp
Index: XSValue.hpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.hpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XSValue.hpp 9 Sep 2004 20:08:31 -0000 1.10
+++ XSValue.hpp 13 Sep 2004 21:24:20 -0000 1.11
@@ -16,6 +16,10 @@
/*
* $Log$
+ * Revision 1.11 2004/09/13 21:24:20 peiyongz
+ * 1. returned data to contain datatype in addition to value
+ * 2. registry to map type name (in string) to type name enum
+ *
* Revision 1.10 2004/09/09 20:08:31 peiyongz
* Using new error code
*
@@ -51,6 +55,7 @@
#define XSVALUE_HPP
#include <xercesc/util/PlatformUtils.hpp>
+#include <xercesc/util/RefHashTableOf.hpp>
XERCES_CPP_NAMESPACE_BEGIN
@@ -176,43 +181,52 @@
, MemoryManager* const manager =
XMLPlatformUtils::fgMemoryManager
);
+ static
+ DataType getDataType (const XMLCh* const dtString);
+
//@}
//----------------------------------
/** public data */
- union {
- bool f_bool;
- char f_char;
- unsigned char f_uchar;
- short f_short;
- unsigned short f_ushort;
- int f_int;
- unsigned int f_uint;
- long f_long;
- unsigned long f_ulong;
- float f_float;
- double f_double;
- XMLCh* f_strVal;
-
- struct decimal {
- int f_sign;
- unsigned int f_scale;
- unsigned long f_integral;
- unsigned long f_fraction;
- double f_dvalue;
- } f_decimal;
-
- struct datetime {
- int f_year;
- int f_month;
- int f_day;
- int f_hour;
- int f_min;
- int f_second;
- double f_milisec;
+ struct {
+
+ DataType f_datatype;
+
+ union {
+ bool f_bool;
+ char f_char;
+ unsigned char f_uchar;
+ short f_short;
+ unsigned short f_ushort;
+ int f_int;
+ unsigned int f_uint;
+ long f_long;
+ unsigned long f_ulong;
+ float f_float;
+ double f_double;
+ XMLCh* f_strVal;
+
+ struct decimal {
+ int f_sign;
+ unsigned int f_scale;
+ unsigned long f_integral;
+ unsigned long f_fraction;
+ double f_dvalue;
+ } f_decimal;
+
+ struct datetime {
+ int f_year;
+ int f_month;
+ int f_day;
+ int f_hour;
+ int f_min;
+ int f_second;
+ double f_milisec;
+
+ } f_datetime;
- } f_datetime;
+ } fValue;
} fData;
@@ -222,6 +236,9 @@
static
void reinitRegEx();
+ static
+ void reinitRegistry();
+
private:
typedef union
@@ -236,7 +253,10 @@
* The default constructor
*
*/
- XSValue(MemoryManager* const manager);
+ XSValue(
+ DataType const dt
+ , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+ );
//@};
@@ -363,6 +383,8 @@
, MemoryManager* const manager
);
+ static RefHashTableOf<XSValue>* fDataTypeRegistry;
+
// -----------------------------------------------------------------------
// data members
// -----------------------------------------------------------------------
@@ -370,7 +392,6 @@
MemoryManager* fMemoryManager;
};
-
XERCES_CPP_NAMESPACE_END
1.11 +143 -55 xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp
Index: XSValue.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XSValue.cpp 9 Sep 2004 20:08:31 -0000 1.10
+++ XSValue.cpp 13 Sep 2004 21:24:20 -0000 1.11
@@ -16,6 +16,10 @@
/*
* $Log$
+ * Revision 1.11 2004/09/13 21:24:20 peiyongz
+ * 1. returned data to contain datatype in addition to value
+ * 2. registry to map type name (in string) to type name enum
+ *
* Revision 1.10 2004/09/09 20:08:31 peiyongz
* Using new error code
*
@@ -156,6 +160,9 @@
static RegularExpression* sXSValueRegEx = 0;
static XMLRegisterCleanup XSValueRegExCleanup;
+RefHashTableOf<XSValue>* XSValue::fDataTypeRegistry = 0;
+static XMLRegisterCleanup XSValueRegistryCleanup;
+
static XMLMutex& gXSValueMutex()
{
if (!sXSValueMutext)
@@ -201,6 +208,80 @@
return sXSValueRegEx;
}
+XSValue::DataType XSValue::getDataType(const XMLCh* const dtString)
+{
+
+ if (!fDataTypeRegistry)
+ {
+ // Lock the mutex
+ XMLMutexLock lockInit(&gXSValueMutex());
+
+ if (!fDataTypeRegistry)
+ {
+ try {
+ //using the XMLPlatformUtils::fgMemoryManager
+ fDataTypeRegistry = new RefHashTableOf<XSValue>(43, true, new
HashXMLCh() );
+
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_STRING,
new XSValue(dt_string));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BOOLEAN,
new XSValue(dt_boolean));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DECIMAL,
new XSValue(dt_decimal));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_FLOAT,
new XSValue(dt_float));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DOUBLE,
new XSValue(dt_double));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DURATION,
new XSValue(dt_duration));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DATETIME,
new XSValue(dt_dateTime));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_TIME,
new XSValue(dt_time));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DATE,
new XSValue(dt_date));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_YEARMONTH,
new XSValue(dt_gYearMonth));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_YEAR,
new XSValue(dt_gYear));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_MONTHDAY,
new XSValue(dt_gMonthDay));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_DAY,
new XSValue(dt_gDay));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_MONTH,
new XSValue(dt_gMonth));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_HEXBINARY,
new XSValue(dt_hexBinary));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BASE64BINARY,
new XSValue(dt_base64Binary));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_ANYURI,
new XSValue(dt_anyURI));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_QNAME,
new XSValue(dt_QName));
+ fDataTypeRegistry->put((void*) XMLUni::fgNotationString,
new XSValue(dt_NOTATION));
+ fDataTypeRegistry->put((void*)
SchemaSymbols::fgDT_NORMALIZEDSTRING, new XSValue(dt_normalizedString));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_TOKEN,
new XSValue(dt_token));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_LANGUAGE,
new XSValue(dt_language));
+ fDataTypeRegistry->put((void*) XMLUni::fgNmTokenString,
new XSValue(dt_NMTOKEN));
+ fDataTypeRegistry->put((void*) XMLUni::fgNmTokensString,
new XSValue(dt_NMTOKENS));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NAME,
new XSValue(dt_Name));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NCNAME,
new XSValue(dt_NCName));
+ fDataTypeRegistry->put((void*) XMLUni::fgIDString,
new XSValue(dt_ID));
+ fDataTypeRegistry->put((void*) XMLUni::fgIDRefString,
new XSValue(dt_IDREF));
+ fDataTypeRegistry->put((void*) XMLUni::fgIDRefsString,
new XSValue(dt_IDREFS));
+ fDataTypeRegistry->put((void*) XMLUni::fgEntityString,
new XSValue(dt_ENTITY));
+ fDataTypeRegistry->put((void*) XMLUni::fgEntitiesString,
new XSValue(dt_ENTITIES));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_INTEGER,
new XSValue(dt_integer));
+ fDataTypeRegistry->put((void*)
SchemaSymbols::fgDT_NONPOSITIVEINTEGER, new XSValue(dt_nonPositiveInteger));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_NEGATIVEINTEGER,
new XSValue(dt_negativeInteger));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_LONG,
new XSValue(dt_long));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_INT,
new XSValue(dt_int));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_SHORT,
new XSValue(dt_short));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_BYTE,
new XSValue(dt_byte));
+ fDataTypeRegistry->put((void*)
SchemaSymbols::fgDT_NONNEGATIVEINTEGER, new XSValue(dt_nonNegativeInteger));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_ULONG,
new XSValue(dt_unsignedLong));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_UINT,
new XSValue(dt_unsignedInt));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_USHORT,
new XSValue(dt_unsignedShort));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_UBYTE,
new XSValue(dt_unsignedByte));
+ fDataTypeRegistry->put((void*) SchemaSymbols::fgDT_POSITIVEINTEGER,
new XSValue(dt_positiveInteger));
+
+ }
+ catch (...)
+ {
+ return dt_MAXCOUNT;
+ }
+
+ XSValueRegistryCleanup.registerCleanup(XSValue::reinitRegistry);
+ }
+ }
+
+ XSValue* data = fDataTypeRegistry->get(dtString);
+ return data? data->fData.f_datatype : dt_MAXCOUNT;
+
+}
+
inline
static bool checkTimeZoneError(XSValue::DataType const &datatype
, SchemaDateTimeException const &e )
@@ -226,16 +307,18 @@
// ---------------------------------------------------------------------------
// XSValue: Constructors and Destructor
// ---------------------------------------------------------------------------
-XSValue::XSValue(MemoryManager* const manager)
+XSValue::XSValue(DataType const dt
+ , MemoryManager* const manager)
:fMemAllocated(false)
,fMemoryManager(manager)
{
+ fData.f_datatype = dt;
}
XSValue::~XSValue()
{
if (fMemAllocated)
- fMemoryManager->deallocate(fData.f_strVal);
+ fMemoryManager->deallocate(fData.fValue.f_strVal);
}
// ---------------------------------------------------------------------------
@@ -1255,14 +1338,14 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
+ XSValue* retVal = new (manager) XSValue(dt_decimal, manager);
- retVal->fData.f_decimal.f_sign = data.getSign();
- retVal->fData.f_decimal.f_scale = data.getScale();
- retVal->fData.f_decimal.f_fraction = actValFract.f_ulong;
- retVal->fData.f_decimal.f_integral = actValInt.f_ulong;
+ retVal->fData.fValue.f_decimal.f_sign = data.getSign();
+ retVal->fData.fValue.f_decimal.f_scale = data.getScale();
+ retVal->fData.fValue.f_decimal.f_fraction = actValFract.f_ulong;
+ retVal->fData.fValue.f_decimal.f_integral = actValInt.f_ulong;
- retVal->fData.f_decimal.f_dvalue = data2.getValue();
+ retVal->fData.fValue.f_decimal.f_dvalue = data2.getValue();
return retVal;
}
@@ -1278,8 +1361,8 @@
}
else
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_float = (float) data.getValue();
+ XSValue* retVal = new (manager) XSValue(dt_float, manager);
+ retVal->fData.fValue.f_float = (float) data.getValue();
return retVal;
}
}
@@ -1295,8 +1378,8 @@
}
else
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_double = data.getValue();
+ XSValue* retVal = new (manager) XSValue(dt_double, manager);
+ retVal->fData.fValue.f_double = data.getValue();
return retVal;
}
}
@@ -1330,8 +1413,8 @@
case XSValue::dt_integer:
// error: no
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_integer, manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1341,8 +1424,8 @@
if (actVal.f_long > -1)
return 0;
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_negativeInteger,
manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1352,8 +1435,8 @@
if (actVal.f_long > 0)
return 0;
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_nonPositiveInteger,
manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1363,8 +1446,8 @@
if (actVal.f_long < 0)
return 0;
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_nonNegativeInteger,
manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1374,8 +1457,8 @@
if (actVal.f_long < 1)
return 0;
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_positiveInteger,
manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1408,8 +1491,8 @@
case XSValue::dt_long:
// error : no
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_long = actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_long, manager);
+ retVal->fData.fValue.f_long = actVal.f_long;
return retVal;
}
break;
@@ -1424,8 +1507,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_int = (int) actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_int, manager);
+ retVal->fData.fValue.f_int = (int) actVal.f_long;
return retVal;
}
break;
@@ -1438,8 +1521,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_short = (short) actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_short, manager);
+ retVal->fData.fValue.f_short = (short) actVal.f_long;
return retVal;
}
break;
@@ -1452,8 +1535,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_char = (char) actVal.f_long;
+ XSValue* retVal = new (manager) XSValue(dt_byte, manager);
+ retVal->fData.fValue.f_char = (char) actVal.f_long;
return retVal;
}
break;
@@ -1484,8 +1567,8 @@
case XSValue::dt_unsignedLong:
// error: no
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_ulong = actVal.f_ulong;
+ XSValue* retVal = new (manager) XSValue(dt_unsignedLong,
manager);
+ retVal->fData.fValue.f_ulong = actVal.f_ulong;
return retVal;
}
break;
@@ -1500,8 +1583,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_uint = (unsigned int) actVal.f_ulong;
+ XSValue* retVal = new (manager) XSValue(dt_unsignedInt,
manager);
+ retVal->fData.fValue.f_uint = (unsigned int) actVal.f_ulong;
return retVal;
}
break;
@@ -1514,8 +1597,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_ushort = (unsigned short) actVal.f_ulong;
+ XSValue* retVal = new (manager) XSValue(dt_unsignedShort,
manager);
+ retVal->fData.fValue.f_ushort = (unsigned short) actVal.f_ulong;
return retVal;
}
break;
@@ -1528,8 +1611,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_uchar = (unsigned char) actVal.f_ulong;
+ XSValue* retVal = new (manager) XSValue(dt_unsignedByte,
manager);
+ retVal->fData.fValue.f_uchar = (unsigned char) actVal.f_ulong;
return retVal;
}
break;
@@ -1595,15 +1678,15 @@
break;
}
- XSValue* retVal = new (manager) XSValue(manager);
+ XSValue* retVal = new (manager) XSValue(datatype, manager);
- retVal->fData.f_datetime.f_year = coreDate.fValue[XMLDateTime::CentYear];
- retVal->fData.f_datetime.f_month = coreDate.fValue[XMLDateTime::Month];
- retVal->fData.f_datetime.f_day = coreDate.fValue[XMLDateTime::Day];
- retVal->fData.f_datetime.f_hour = coreDate.fValue[XMLDateTime::Hour];
- retVal->fData.f_datetime.f_min = coreDate.fValue[XMLDateTime::Minute];
- retVal->fData.f_datetime.f_second = coreDate.fValue[XMLDateTime::Second];
- retVal->fData.f_datetime.f_milisec = coreDate.fMiliSecond;
+ retVal->fData.fValue.f_datetime.f_year =
coreDate.fValue[XMLDateTime::CentYear];
+ retVal->fData.fValue.f_datetime.f_month =
coreDate.fValue[XMLDateTime::Month];
+ retVal->fData.fValue.f_datetime.f_day =
coreDate.fValue[XMLDateTime::Day];
+ retVal->fData.fValue.f_datetime.f_hour =
coreDate.fValue[XMLDateTime::Hour];
+ retVal->fData.fValue.f_datetime.f_min =
coreDate.fValue[XMLDateTime::Minute];
+ retVal->fData.fValue.f_datetime.f_second =
coreDate.fValue[XMLDateTime::Second];
+ retVal->fData.fValue.f_datetime.f_milisec = coreDate.fMiliSecond;
return retVal;
}
@@ -1640,15 +1723,15 @@
if (XMLString::equals(content, XMLUni::fgBooleanValueSpace[0]) ||
XMLString::equals(content, XMLUni::fgBooleanValueSpace[2]) )
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_bool = true;
+ XSValue* retVal = new (manager) XSValue(dt_boolean, manager);
+ retVal->fData.fValue.f_bool = true;
return retVal;
}
else if (XMLString::equals(content, XMLUni::fgBooleanValueSpace[1])
||
XMLString::equals(content, XMLUni::fgBooleanValueSpace[3])
)
{
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_bool = false;
+ XSValue* retVal = new (manager) XSValue(dt_boolean, manager);
+ retVal->fData.fValue.f_bool = false;
return retVal;
}
else
@@ -1668,8 +1751,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_strVal = decodedData;
+ XSValue* retVal = new (manager) XSValue(dt_hexBinary, manager);
+ retVal->fData.fValue.f_strVal = decodedData;
retVal->fMemAllocated = true;
return retVal;
}
@@ -1685,8 +1768,8 @@
return 0;
}
- XSValue* retVal = new (manager) XSValue(manager);
- retVal->fData.f_strVal = decodedData;
+ XSValue* retVal = new (manager) XSValue(dt_base64Binary, manager);
+ retVal->fData.fValue.f_strVal = decodedData;
retVal->fMemAllocated = true;
return retVal;
}
@@ -1793,6 +1876,12 @@
{
delete sXSValueRegEx;
sXSValueRegEx = 0;
+}
+
+void XSValue::reinitRegistry()
+{
+ delete fDataTypeRegistry;
+ fDataTypeRegistry = 0;
}
XERCES_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]