dbertoni    01/02/05 13:44:16

  Modified:    c/src/ICUBridge ICUBridge.cpp
  Log:
  Use stack-based buffers when possible.
  
  Revision  Changes    Path
  1.10      +90 -38    xml-xalan/c/src/ICUBridge/ICUBridge.cpp
  
  Index: ICUBridge.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/ICUBridge.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ICUBridge.cpp     2000/11/02 01:45:32     1.9
  +++ ICUBridge.cpp     2001/02/05 21:44:16     1.10
  @@ -86,6 +86,33 @@
   
   
   
  +#if defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
  +inline void
  +doCopyData(
  +                     const XalanDOMChar*             theString,
  +                     unsigned int                    theStringLength,
  +                     XalanDOMChar*                   theBuffer)
  +{
  +     // Copy the data, truncating each character...
  +     for (unsigned int i = 0; i < theStringLength; ++i)
  +     {
  +             // There should be no truncation, since XalanDOMChars
  +             // hold UTF-16 code points, but assert, just in case...
  +             assert(theString[i] == UChar(theString[i]));
  +
  +             theBuffer[i] = theString[i];
  +     }
  +
  +}
  +#endif
  +
  +
  +
  +// Use a stack-based buffer up to this size.
  +const unsigned int   theStackBufferSize = 200u;
  +
  +
  +
   const UnicodeString
   ICUBridge::XalanDOMCharStringToUnicodeString(const XalanDOMChar*     
theString)
   {
  @@ -97,29 +124,32 @@
        {
   #if defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
   
  -             // Create a buffer to copy out the UnicodeString data...
  -             UCharVectorType         theBuffer;
  -
                const unsigned int      theLength = length(theString);
   
  -             // Resize the buffer appropriately...
  -             theBuffer.reserve(theLength);
  -
  -             // Copy the data, truncating each character...
  -             for (unsigned int i = 0; i < theLength; ++i)
  +             if (theStackBufferSize > theLength)
                {
  -                     // There should be no truncation, since XalanDOMChars
  -                     // hold UTF-16 code points, but assert, just in case...
  -                     assert(theString[i] == UChar(theString[i]));
  -                     theBuffer.push_back(theString[i]);
  +                     XalanDOMChar    theBuffer[theStackBufferSize];
  +
  +                     doCopyData(theString, theLength, theBuffer);
  +
  +                     return UnicodeString(&theBuffer[0], theLength);
                }
  +             else
  +             {
  +                     // Create a buffer to copy out the UnicodeString data...
  +                     UCharVectorType         theBuffer;
   
  -             return UnicodeString(&theBuffer[0], theBuffer.size());
  +                     // Resize the buffer appropriately...
  +                     theBuffer.resize(theLength);
   
  -#else
  +                     doCopyData(theString, theLength, &theBuffer[0]);
   
  -             return UnicodeString(theString, length(theString));
  +                     assert(theLength == theBuffer.size());
   
  +                     return UnicodeString(&theBuffer[0], theLength);
  +             }
  +#else
  +             return UnicodeString(theString, length(theString));
   #endif
        }
   }
  @@ -136,13 +166,13 @@
   
   
   const XalanDOMString
  -ICUBridge::UnicodeStringToXalanDOMString(const UnicodeString&                
theString)
  +ICUBridge::UnicodeStringToXalanDOMString(const UnicodeString&        
theString)
   {
  +     const int32_t   theLength = theString.length();
  +
   #if defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
   
        // If XalanDOMChar is larger than the ICU's UChar, we have to more 
work...
  -     const int32_t   theLength = theString.length();
  -
        // Create a buffer...
        XalanDOMCharVectorType  theBuffer;
   
  @@ -159,19 +189,30 @@
   
   #else
   
  -     // Create a buffer to copy out the UnicodeString data...
  -     UCharVectorType         theResult;
  +     if (theStackBufferSize > theLength)
  +     {
  +             UChar   theBuffer[theStackBufferSize];
   
  -     const int32_t   theLength = theString.length();
  +             // Extract the data...
  +             theString.extract(0, theLength, theBuffer);
  +
  +             return XalanDOMString(theBuffer, theLength);
  +     }
  +     else
  +     {
  +             // Create a buffer to copy out the UnicodeString data...
  +             UCharVectorType         theBuffer;
   
  -     // Resize the buffer appropriately...
  -     theResult.resize(theLength);
  +             // Resize the buffer appropriately...
  +             theBuffer.resize(theLength);
   
  -     // Extract the data...
  -     theString.extract(0, theLength, &theResult[0]);
  +             // Extract the data...
  +             theString.extract(0, theLength, &theBuffer[0]);
   
  -     return XalanDOMString(&theResult[0], theResult.size());
  +             assert(theLength == int32_t(theBuffer.size()));
   
  +             return XalanDOMString(&theBuffer[0], theLength);
  +     }
   #endif
   }
   
  @@ -192,25 +233,36 @@
   
   #else
   
  +     const int32_t   theLength = theString.length();
  +
  +     if (theStackBufferSize > theLength)
  +     {
  +             UChar   theBuffer[theStackBufferSize];
  +
  +             // Extract the data...
  +             theString.extract(0, theLength, theBuffer);
  +
  +             theResult = XalanDOMString(theBuffer, theLength);
  +     }
  +     else
  +     {
   #if defined(XALAN_NO_NAMESPACES)
  -     typedef vector<UChar>                                   UCharVectorType;
  +             typedef vector<UChar>           UCharVectorType;
   #else
  -     typedef std::vector<UChar>                              UCharVectorType;
  +             typedef std::vector<UChar>      UCharVectorType;
   #endif
   
  -     // Create a buffer to copy out the UnicodeString data...
  -     UCharVectorType         theBuffer;
  -
  -     const int32_t   theLength = theString.length();
  -
  -     // Resize the buffer appropriately...
  -     theBuffer.resize(theLength);
  +             // Create a buffer to copy out the UnicodeString data...
  +             UCharVectorType         theBuffer;
   
  -     // Extract the data...
  -     theString.extract(0, theLength, &theBuffer[0]);
  +             // Resize the buffer appropriately...
  +             theBuffer.resize(theLength);
   
  -     theResult = XalanDOMString(&theBuffer[0], theBuffer.size());
  +             // Extract the data...
  +             theString.extract(0, theLength, &theBuffer[0]);
   
  +             theResult = XalanDOMString(&theBuffer[0], theBuffer.size());
  +     }
   #endif
   }
   
  
  
  

Reply via email to