You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@locus.apache.org on 2000/08/10 20:17:08 UTC
cvs commit: xml-xalan/c/src/PlatformSupport DOMStringHelper.cpp DOMStringHelper.hpp
dbertoni 00/08/10 11:17:08
Modified: c/src/PlatformSupport DOMStringHelper.cpp
DOMStringHelper.hpp
Log:
Improved implementations which do fewer dynamic memory allocations.
Revision Changes Path
1.29 +127 -99 xml-xalan/c/src/PlatformSupport/DOMStringHelper.cpp
Index: DOMStringHelper.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DOMStringHelper.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- DOMStringHelper.cpp 2000/07/13 22:21:25 1.28
+++ DOMStringHelper.cpp 2000/08/10 18:17:07 1.29
@@ -102,7 +102,7 @@
// The maximum number of digits that sprintf can put in a buffer.
-// 100 for now. We're using this because we want to avoid transcoding
+// 50 for now. We're using this because we want to avoid transcoding
// number strings when we don't have to,
const size_t MAX_PRINTF_DIGITS = 50;
@@ -136,40 +136,6 @@
-
-#if !defined(XALAN_FULL_WCHAR_SUPPORT)
-
-// Simulates the java String method indexOf(). Returns the index of theChar
-// in theString, or length(theString) if the character is not found.
-XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(unsigned int)
-indexOf(
- const XalanDOMChar* theString,
- XalanDOMChar theChar)
-{
- const unsigned int theLength = length(theString);
-
- if (theLength == 0)
- {
- return theLength;
- }
- else
- {
- unsigned int theIndex = 0;
-
- while(theIndex < theLength &&
- theString[theIndex] != theChar)
- {
- ++theIndex;
- }
-
- return theIndex == theLength ? theLength : theIndex;
- }
-}
-
-#endif
-
-
-
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(unsigned int)
indexOf(
const XalanDOMChar* theString,
@@ -261,8 +227,6 @@
-#if !defined(XALAN_FULL_WCHAR_SUPPORT)
-
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(unsigned int)
lastIndexOf(
const XalanDOMChar* theString,
@@ -278,6 +242,7 @@
{
unsigned int theIndex = theLength - 1;
+ // Rely on wrap-around...
while(theIndex < theLength && theString[theIndex] != theChar)
{
theIndex--;
@@ -287,8 +252,6 @@
}
}
-#endif
-
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
@@ -503,7 +466,7 @@
// Reserve the buffer now. We don't have to null-terminate,
// because the XalanDOMString constructor will take a size
- // option.
+ // parameter.
theBuffer.reserve(theLength);
const XalanDOMChar* const ptr = theString.rawBuffer();
@@ -569,8 +532,42 @@
}
+
+inline bool
+doEqualsIgnoreCase(
+ const XalanDOMChar* theLHS,
+ const XalanDOMChar* theRHS,
+ unsigned int theLength)
+{
+ // Check each character, converting to uppercase
+ // for the test.
+ unsigned int i = 0;
+
+ for(; i < theLength; i++)
+ {
+ const XalanDOMChar charLHS = theLHS[i];
+ const XalanDOMChar charRHS = theRHS[i];
+
+ if (charLHS != charRHS &&
+ towupper(charLHS) != charRHS &&
+ charLHS != towupper(charRHS))
+ {
+ break;
+ }
+ }
+
+ // Did we reach the end of the string?
+ if (i == theLength)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
-#if !defined(_MSC_VER)
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
equalsIgnoreCase(
@@ -587,31 +584,12 @@
// If they are equal, then compare
if (theLength == length(theRHS))
{
- // Check each character, converting to uppercase
- // for the test.
- unsigned int i = 0;
-
- for(; i < theLength; i++)
- {
- if (towupper(theLHS[i]) !=
- towupper(theRHS[i]))
- {
- break;
- }
- }
-
- // Did we reach the end of the string?
- if (i == theLength)
- {
- fResult = true;
- }
+ fResult = doEqualsIgnoreCase(theLHS, theRHS, theLength);
}
return fResult;
}
-#endif
-
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(bool)
@@ -637,15 +615,22 @@
{
assert(c_wstr(theLHS) != 0);
assert(c_wstr(theRHS) != 0);
+
+ unsigned const int theLHSLength = length(theLHS);
- return equalsIgnoreCase(c_wstr(theLHS), c_wstr(theRHS));
+ if (theLHSLength == length(theRHS))
+ {
+ return doEqualsIgnoreCase(c_wstr(theLHS), c_wstr(theRHS), theLHSLength);
+ }
+ else
+ {
+ return false;
+ }
}
}
-#if !defined(XALAN_FULL_WCHAR_SUPPORT)
-
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(int)
compare(
const XalanDOMChar* theLHS,
@@ -704,8 +689,6 @@
return theResult;
}
-#endif
-
struct WideStringLexicalCompare
@@ -861,19 +844,12 @@
{
theVector.reserve(theLength + 1);
- for(unsigned int i = 0; i < theLength; i++)
+ for(unsigned int i = 0; i < theLength; i++)
{
-#if defined(XALAN_OLD_STYLE_CASTS)
// Assert that the truncation will not affect the resulting character.
- assert(theString[i] == (char)theString[i]);
+ assert(theString[i] == char(theString[i]));
- theVector.push_back((char)theString[i]);
-#else
- // Assert that the truncation will not affect the resulting character.
- assert(theString[i] == static_cast<char>(theString[i]));
-
- theVector.push_back(static_cast<char>(theString[i]));
-#endif
+ theVector.push_back(char(theString[i]));
}
// Put a terminating 0 byte.
@@ -1011,8 +987,10 @@
}
else
{
- ostrstream theFormatter;
+ char theBuffer[MAX_PRINTF_DIGITS + 1];
+ ostrstream theFormatter(theBuffer, sizeof(theBuffer));
+
theFormatter << theDouble << '\0';
// OK, now we have to clean up the output for
@@ -1025,9 +1003,7 @@
// the decimal point, since any values with no
// fractional part were printed as integers
XalanDOMCharVectorType theResult =
- MakeXalanDOMCharVector(theFormatter.str(), false);
-
- theFormatter.freeze(false);
+ MakeXalanDOMCharVector(theBuffer, false);
XalanDOMCharVectorType::iterator thePosition = theResult.end();
@@ -1055,7 +1031,10 @@
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
LongToHexDOMString(long theLong)
{
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+// I'm 99% sure that we don't need to use swprintf
+// to format, since strings of numbers don't to be
+// generated as wide strings.
+#if defined(XALAN_USE_WCHAR_SUPPORT)
wchar_t theBuffer[MAX_PRINTF_DIGITS + 1];
@@ -1066,17 +1045,23 @@
return XalanDOMString(theBuffer, length(theBuffer));
#else
+
+ char theBuffer[MAX_PRINTF_DIGITS + 1];
- ostrstream theFormatter;
+ ostrstream theFormatter(theBuffer, sizeof(theBuffer));
theFormatter << hex << theLong << '\0';
- const XalanDOMString theString = theFormatter.str();
+ // We don't need to transcode, so just make it a
+ // wide character string...
+ wchar_t theResult[MAX_PRINTF_DIGITS + 1];
- theFormatter.freeze(false);
+ const unsigned int theLength = length(theBuffer);
- return theString;
+ copy(theBuffer, theBuffer + theLength, theResult);
+ return XalanDOMString(theResult, theLength);
+
#endif
}
@@ -1085,15 +1070,21 @@
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
UnsignedLongToHexDOMString(unsigned long theUnsignedLong)
{
- ostrstream theFormatter;
+ char theBuffer[MAX_PRINTF_DIGITS + 1];
+
+ ostrstream theFormatter(theBuffer, sizeof(theBuffer));
theFormatter << hex << theUnsignedLong << '\0';
+
+ // We don't need to transcode, so just make it a
+ // wide character string...
+ wchar_t theResult[MAX_PRINTF_DIGITS + 1];
- const XalanDOMString theString = theFormatter.str();
+ const unsigned int theLength = length(theBuffer);
- theFormatter.freeze(false);
+ copy(theBuffer, theBuffer + theLength, theResult);
- return theString;
+ return XalanDOMString(theResult, theLength);
}
@@ -1101,7 +1092,7 @@
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
LongToDOMString(long theLong)
{
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+#if defined(XALAN_USE_WCHAR_SUPPORT)
wchar_t theBuffer[MAX_PRINTF_DIGITS + 1];
@@ -1113,15 +1104,21 @@
#else
- ostrstream theFormatter;
+ char theBuffer[MAX_PRINTF_DIGITS + 1];
+ ostrstream theFormatter(theBuffer, sizeof(theBuffer));
+
theFormatter << theLong << '\0';
+
+ // We don't need to transcode, so just make it a
+ // wide character string...
+ wchar_t theResult[MAX_PRINTF_DIGITS + 1];
- XalanDOMString theString = theFormatter.str();
+ const unsigned int theLength = length(theBuffer);
- theFormatter.freeze(false);
+ copy(theBuffer, theBuffer + theLength, theResult);
- return theString;
+ return XalanDOMString(theResult, theLength);
#endif
}
@@ -1131,8 +1128,35 @@
XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(XalanDOMString)
UnsignedLongToDOMString(unsigned long theUnsignedLong)
{
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+#if 1
+
+ wchar_t theBuffer[MAX_PRINTF_DIGITS + 1];
+ wchar_t* thePointer = &theBuffer[MAX_PRINTF_DIGITS + 1];
+ wchar_t* const theEnd = thePointer;
+
+ // Null terminate it...
+ *thePointer = 0;
+
+ do
+ {
+ // Next spot...
+ --thePointer;
+
+ // Isolate the left most character. We may need to
+ // change this to a switch statement on platforms
+ // that are not ASCII-based (i.e. EBCDIC)
+ *thePointer = wchar_t(theUnsignedLong % 10 + '0');
+
+ // OK, we're done with it...
+ theUnsignedLong /= 10;
+ }
+ while(theUnsignedLong != 0);
+
+ return XalanDOMString(thePointer, theEnd - thePointer);
+
+#elif defined(XALAN_USE_WCHAR_SUPPORT)
+
wchar_t theBuffer[MAX_PRINTF_DIGITS + 1];
swprintf(theBuffer,
@@ -1143,15 +1167,19 @@
#else
- ostrstream theFormatter;
+ char theBuffer[MAX_PRINTF_DIGITS + 1];
+ ostrstream theFormatter(theBuffer, sizeof(theBuffer));
+
theFormatter << theUnsignedLong << '\0';
+
+ wchar_t theResult[MAX_PRINTF_DIGITS + 1];
- XalanDOMString theString = theFormatter.str();
+ const unsigned int theLength = length(theBuffer);
- theFormatter.freeze(false);
+ copy(theBuffer, theBuffer + theLength, theResult);
- return theString;
+ return XalanDOMString(theResult, theLength);
#endif
}
1.25 +58 -53 xml-xalan/c/src/PlatformSupport/DOMStringHelper.hpp
Index: DOMStringHelper.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/DOMStringHelper.hpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- DOMStringHelper.hpp 2000/07/21 19:18:55 1.24
+++ DOMStringHelper.hpp 2000/08/10 18:17:07 1.25
@@ -114,6 +114,23 @@
/**
+ * Reserve some space in the string for more efficient
+ * concatenation...
+ *
+ * @param theString target string
+ * @param theCount The amount of space to reserve
+ */
+inline void
+reserve(
+ XalanDOMString& theString,
+ unsigned int theCount)
+{
+ theString.reserve(theCount);
+}
+
+
+
+/**
* Get the underlying representation of the target XalanDOMString as a
* null-terminated string
*
@@ -169,22 +186,6 @@
}
-#if 0
-/**
- * Get the underlying representation of the target XalanDOMString as an array of
- * XalanDOMChar, not guaranteed to be null-terminated.
- *
- * @param theString target string
- * @return array of XalanDOMChar
- */
-inline const XalanDOMChar*
-toCharArray(XalanDOMString& theString)
-{
- return theString.rawBuffer();
-}
-#endif
-
-
/**
* Simulates the java String method length() for a XalanDOMString
@@ -212,7 +213,9 @@
{
assert(theBuffer != 0);
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+ // For the time being, we're using our own custom routine,
+ // since performance is better.
+#if defined(XALAN_USE_WCHAR_SUPPORT)
return wcslen(theBuffer);
#else
const XalanDOMChar* theBufferPointer = theBuffer;
@@ -242,13 +245,24 @@
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
-
+/**
+ * Simulates the java String method indexOf().
+ *
+ * @param theString string to search
+ * @param theChar character searched for
+ * @return the index of theChar in theString,
+ * or length(theString) if the character is not
+ * found.
+ */
inline unsigned int
indexOf(
const XalanDOMChar* theString,
XalanDOMChar theChar)
{
+ // For the time being, we're using our own custom routine,
+ // since performance is better.
+#if defined(XALAN_USE_WCHAR_SUPPORT)
+
const XalanDOMChar* const thePointer =
wcschr(theString, theChar);
@@ -260,23 +274,20 @@
{
return thePointer - theString;
}
-}
#else
-/**
- * Simulates the java String method indexOf().
- *
- * @param theString string to search
- * @param theChar character searched for
- * @return the index of theChar in theString,
- * or length(theString) if the character is not
- * found.
- */
-XALAN_PLATFORMSUPPORT_EXPORT_FUNCTION(unsigned int)
-indexOf(
- const XalanDOMChar* theString,
- XalanDOMChar theChar);
+
+ const XalanDOMChar* thePointer = theString;
+
+ while(*thePointer != theChar && *thePointer != 0)
+ {
+ ++thePointer;
+ }
+
+ return thePointer - theString;
+
#endif
+}
@@ -346,7 +357,10 @@
* or length(theString) if the character is not
* found.
*/
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+
+// For the time being, we're using our own custom routine,
+// since performance is better.
+#if defined(XALAN_USE_WCHAR_SUPPORT)
inline unsigned int
lastIndexOf(
@@ -726,7 +740,11 @@
inline bool
isSpace(XalanDOMChar theChar)
{
- return iswspace(theChar) ? true : false;
+ return theChar > 0x20 ? false :
+ (theChar == 0x20 ||
+ theChar == 0xD ||
+ theChar == 0xA ||
+ theChar == 0x9) ? true : false;
}
@@ -857,8 +875,11 @@
+
+// For the time being, we're using our own custom routine,
+// since performance is better.
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+#if defined(XALAN_USE_WCHAR_SUPPORT)
/**
* Compare the contents of two strings.
@@ -889,7 +910,7 @@
-#if defined(XALAN_FULL_WCHAR_SUPPORT)
+#if defined(XALAN_USE_WCHAR_SUPPORT)
/**
* Compare the contents of two strings using the
@@ -1081,21 +1102,6 @@
-#if defined(_MSC_VER)
-
-inline bool
-equalsIgnoreCase(
- const XalanDOMChar* theLHS,
- const XalanDOMChar* theRHS)
-{
- assert(theLHS != 0);
- assert(theRHS != 0);
-
- return _wcsicmp(theLHS, theRHS) == 0 ? true : false;
-}
-
-#else
-
/**
* Compare the contents of two strings for equality, without regard for case
*
@@ -1107,7 +1113,6 @@
equalsIgnoreCase(
const XalanDOMChar* theLHS,
const XalanDOMChar* theRHS);
-#endif