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...@apache.org on 2001/06/15 19:55:11 UTC
cvs commit: xml-xalan/c/src/XMLSupport FormatterToXML.hpp FormatterToXML.cpp
dbertoni 01/06/15 10:55:11
Modified: c/src/XMLSupport FormatterToXML.hpp FormatterToXML.cpp
Log:
New, experimental direct output.
Revision Changes Path
1.32 +65 -7 xml-xalan/c/src/XMLSupport/FormatterToXML.hpp
Index: FormatterToXML.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToXML.hpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- FormatterToXML.hpp 2001/05/02 15:43:15 1.31
+++ FormatterToXML.hpp 2001/06/15 17:55:07 1.32
@@ -85,6 +85,7 @@
class AttributeList;
class Writer;
+class XalanOutputStream;
@@ -131,6 +132,7 @@
* standalone document declaration
*
* @param format should be used only by derived classes.
+ * @param fBufferData If true, data will be buffered in the formatter
*/
FormatterToXML(
Writer& writer,
@@ -143,7 +145,8 @@
const XalanDOMString& doctypePublic = XalanDOMString(),
bool xmlDecl = true,
const XalanDOMString& standalone = XalanDOMString(),
- eFormat format = OUTPUT_METHOD_XML);
+ eFormat format = OUTPUT_METHOD_XML,
+ bool fBufferData = true);
virtual
~FormatterToXML();
@@ -203,13 +206,13 @@
const XMLCh* const ch,
const unsigned int length);
- const Writer&
+ const Writer*
getWriter() const
{
return m_writer;
}
- Writer&
+ Writer*
getWriter()
{
return m_writer;
@@ -314,8 +317,13 @@
/**
* The writer where the XML will be written.
*/
- Writer& m_writer;
+ Writer* const m_writer;
+ /**
+ * The stream where the XML will be written.
+ */
+ XalanOutputStream* const m_stream;
+
/**
* Output a line break.
*/
@@ -324,6 +332,7 @@
/**
* Append a wide character to the buffer.
+ *
* Characters that are not representable
* in the encoding are not written as
* entities.
@@ -340,9 +349,6 @@
/**
* Append a wide character to the buffer.
- * Characters that are not representable
- * in the encoding are not written as
- * entities.
*
* @ch the character to append.
*/
@@ -358,6 +364,10 @@
* Append a null-terminated array of wide characters to
* the buffer.
*
+ * Characters that are not representable
+ * in the encoding are not written as
+ * entities.
+ *
* @chars the array to append
*/
void
@@ -375,6 +385,10 @@
/**
* Append an array of wide character to the buffer.
*
+ * Characters that are not representable
+ * in the encoding are not written as
+ * entities.
+ *
* @chars the array to append
* @start the offset into the array to start from
* @length the number of characters to append
@@ -401,6 +415,10 @@
/**
* Append a string to the buffer.
*
+ * Characters that are not representable
+ * in the encoding are not written as
+ * entities.
+ *
* @param str the string to append
*/
void
@@ -693,6 +711,17 @@
/**
* Append a wide character to the buffer.
* Characters that are not representable
+ * in the encoding are not written as
+ * entities.
+ *
+ * @ch the character to append.
+ */
+ void
+ accumNameAsByteDirect(XalanDOMChar ch);
+
+ /**
+ * Append a wide character to the buffer.
+ * Characters that are not representable
* in the encoding are written as entities.
*
* @ch the character to append.
@@ -701,6 +730,16 @@
accumContentAsByte(XalanDOMChar ch);
/**
+ * Append a wide character to the stream with buffering.
+ * Characters that are not representable
+ * in the encoding are written as entities.
+ *
+ * @ch the character to append.
+ */
+ void
+ accumContentAsByteDirect(XalanDOMChar ch);
+
+ /**
* Append a wide character to the buffer.
* Characters that are not representable
* in the encoding are not written as
@@ -713,11 +752,30 @@
/**
* Append a wide character to the buffer.
+ * Characters that are not representable
+ * in the encoding are not written as
+ * entities.
+ *
+ * @ch the character to append.
+ */
+ void
+ accumNameAsCharDirect(XalanDOMChar ch);
+
+ /**
+ * Append a wide character to the buffer.
*
* @ch the character to append.
*/
void
accumContentAsChar(XalanDOMChar ch);
+
+ /**
+ * Append a wide character to the stream without buffering.
+ *
+ * @ch the character to append.
+ */
+ void
+ accumContentAsCharDirect(XalanDOMChar ch);
/**
* Output the doc type declaration.
1.49 +119 -20 xml-xalan/c/src/XMLSupport/FormatterToXML.cpp
Index: FormatterToXML.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToXML.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- FormatterToXML.cpp 2001/06/06 21:46:05 1.48
+++ FormatterToXML.cpp 2001/06/15 17:55:08 1.49
@@ -97,9 +97,11 @@
const XalanDOMString& doctypePublic,
bool xmlDecl,
const XalanDOMString& standalone,
- eFormat format) :
+ eFormat format,
+ bool fBufferData) :
FormatterListener(format),
- m_writer(writer),
+ m_writer(&writer),
+ m_stream(m_writer->getStream()),
m_maxCharacter(0),
#if !defined(XALAN_NO_DEFAULT_BUILTIN_ARRAY_INITIALIZATION)
m_attrCharsMap(),
@@ -150,18 +152,16 @@
}
}
- XalanOutputStream* const theStream = m_writer.getStream();
-
- if (theStream != 0)
+ if (m_stream != 0)
{
try
{
- theStream->setOutputEncoding(m_encoding);
+ m_stream->setOutputEncoding(m_encoding);
}
catch(const XalanOutputStream::UnsupportedEncodingException&)
{
// Default to UTF-8 if the requested encoding is not supported...
- theStream->setOutputEncoding(XalanDOMString(XalanTranscodingServices::s_utf8String));
+ m_stream->setOutputEncoding(XalanDOMString(XalanTranscodingServices::s_utf8String));
m_encoding = XalanTranscodingServices::s_utf8String;
}
@@ -174,20 +174,38 @@
if (XalanTranscodingServices::getBytesEqualChars(m_encoding) == true)
{
m_bytesEqualChars = true;
+
+ if (fBufferData == false)
+ {
+ m_accumNameFunction = &FormatterToXML::accumNameAsByteDirect;
- m_byteBuf.resize(s_maxBufferSize);
+ m_accumContentFunction = &FormatterToXML::accumContentAsByteDirect;
+ }
+ else
+ {
+ m_byteBuf.resize(s_maxBufferSize);
- m_accumNameFunction = &FormatterToXML::accumNameAsByte;
+ m_accumNameFunction = &FormatterToXML::accumNameAsByte;
- m_accumContentFunction = &FormatterToXML::accumContentAsByte;
+ m_accumContentFunction = &FormatterToXML::accumContentAsByte;
+ }
}
else
{
- m_charBuf.resize(s_maxBufferSize);
+ if (fBufferData == false)
+ {
+ m_accumNameFunction = &FormatterToXML::accumNameAsCharDirect;
- m_accumNameFunction = &FormatterToXML::accumNameAsChar;
+ m_accumContentFunction = &FormatterToXML::accumContentAsCharDirect;
+ }
+ else
+ {
+ m_charBuf.resize(s_maxBufferSize);
+
+ m_accumNameFunction = &FormatterToXML::accumNameAsChar;
- m_accumContentFunction = &FormatterToXML::accumContentAsChar;
+ m_accumContentFunction = &FormatterToXML::accumContentAsChar;
+ }
}
// Do this last so we initialize the map according to the value of
@@ -302,6 +320,23 @@
void
+FormatterToXML::accumNameAsByteDirect(XalanDOMChar ch)
+{
+ assert(m_stream != 0);
+
+ if (ch > m_maxCharacter)
+ {
+ m_stream->write(char(XalanUnicode::charQuestionMark));
+ }
+ else
+ {
+ m_stream->write(char(ch));
+ }
+}
+
+
+
+void
FormatterToXML::accumContentAsByte(XalanDOMChar ch)
{
if (ch > m_maxCharacter)
@@ -322,11 +357,26 @@
void
+FormatterToXML::accumContentAsByteDirect(XalanDOMChar ch)
+{
+ if (ch > m_maxCharacter)
+ {
+ writeNumberedEntityReference(ch);
+ }
+ else
+ {
+ m_stream->write(char(ch));
+ }
+}
+
+
+
+void
FormatterToXML::accumNameAsChar(XalanDOMChar ch)
{
if (ch > m_maxCharacter)
{
- m_charBuf[m_pos++] = char(XalanUnicode::charQuestionMark);
+ m_charBuf[m_pos++] = XalanUnicode::charQuestionMark;
}
else
{
@@ -342,6 +392,21 @@
void
+FormatterToXML::accumNameAsCharDirect(XalanDOMChar ch)
+{
+ if (ch > m_maxCharacter)
+ {
+ m_stream->write(XalanUnicode::charQuestionMark);
+ }
+ else
+ {
+ m_stream->write(ch);
+ }
+}
+
+
+
+void
FormatterToXML::accumContentAsChar(XalanDOMChar ch)
{
if (ch > m_maxCharacter)
@@ -362,6 +427,21 @@
void
+FormatterToXML::accumContentAsCharDirect(XalanDOMChar ch)
+{
+ if (ch > m_maxCharacter)
+ {
+ writeNumberedEntityReference(ch);
+ }
+ else
+ {
+ m_stream->write(ch);
+ }
+}
+
+
+
+void
FormatterToXML::accumName(const XalanDOMChar* chars)
{
for(; *chars!= 0; ++chars)
@@ -583,7 +663,7 @@
{
assert(m_charBuf.size() > 0 && m_charBuf.size() >= m_pos);
- m_writer.write(&m_charBuf[0], 0, m_pos);
+ m_writer->write(&m_charBuf[0], 0, m_pos);
m_pos = 0;
}
@@ -595,7 +675,7 @@
{
assert(m_byteBuf.size() > 0 && m_byteBuf.size() >= m_pos);
- m_writer.write(&m_byteBuf[0], 0, m_pos);
+ m_writer->write(&m_byteBuf[0], 0, m_pos);
m_pos = 0;
}
@@ -605,13 +685,20 @@
void
FormatterToXML::flush()
{
- if (m_bytesEqualChars == true)
+ if (m_stream != 0)
{
- flushBytes();
+ m_stream->flush();
}
else
{
- flushChars();
+ if (m_bytesEqualChars == true)
+ {
+ flushBytes();
+ }
+ else
+ {
+ flushChars();
+ }
}
}
@@ -620,7 +707,9 @@
void
FormatterToXML::flushWriter()
{
- m_writer.flush();
+ assert(m_writer != 0);
+
+ m_writer->flush();
}
@@ -1124,6 +1213,15 @@
const XMLCh* const chars,
const unsigned int length)
{
+#if 1
+ // We need to do normalization, which is slower,
+ // but there you have it...
+ if (length > 0)
+ {
+ characters(chars, length);
+ }
+#else
+ // We'ed like to be able to do this...
if(m_inEntityRef == false && length != 0)
{
assert(isXMLWhitespace(chars, 0, length));
@@ -1152,6 +1250,7 @@
}
}
}
+#endif
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org