//! @param theMaxBufferSizeBytes the length of buffer to read (in bytes)
Standard_ReadLineBuffer (size_t theMaxBufferSizeBytes)
: myUseReadBufferLastStr(false),
+ myIsMultilineMode (false),
myBufferPos (0),
myBytesLastRead (0)
{
{
myReadBufferLastStr.clear();
myUseReadBufferLastStr = false;
+ myIsMultilineMode = false;
myBufferPos = 0;
myBytesLastRead = 0;
}
int64_t& theReadData)
{
char* aResultLine = NULL;
+ bool isMultiline = false;
theLineLength = 0;
theReadData = 0;
if (myUseReadBufferLastStr)
{
theLineLength = myReadBufferLastStr.size();
- aResultLine = myReadBufferLastStr.data();
+ aResultLine = &myReadBufferLastStr.front();
myUseReadBufferLastStr = false;
}
break;
// read next line from myReadBuffer
while (myBufferPos < myBytesLastRead)
{
- if (myReadBuffer[myBufferPos] == '\n')
+ if (myReadBuffer[myBufferPos] == '\\' && myIsMultilineMode)
{
- isEndLineFound = true;
+ // multi-line syntax
+ if (myBufferPos + 1 == myBytesLastRead
+ ||(myBufferPos + 2 == myBytesLastRead && myReadBuffer[myBufferPos + 1] == '\r'))
+ {
+ isMultiline = true;
+ }
+ else if (myReadBuffer[myBufferPos + 1] == '\n'
+ ||(myReadBuffer[myBufferPos + 1] == '\r' && myReadBuffer[myBufferPos + 2] == '\n'))
+ {
+ if (myUseReadBufferLastStr)
+ {
+ myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
+ }
+ else
+ {
+ myReadBufferLastStr = std::vector<char>(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
+ myUseReadBufferLastStr = true;
+ }
+
+ if (myReadBuffer[myBufferPos + 1] == '\r')
+ {
+ myBufferPos += 2;
+ }
+ else
+ {
+ myBufferPos += 1;
+ }
+
+ aStartLinePos = myBufferPos + 1;
+ }
+ }
+ else if (myReadBuffer[myBufferPos] == '\n')
+ {
+ if (!isMultiline)
+ {
+ isEndLineFound = true;
+ }
+ else if (myBufferPos == 1 && myReadBuffer[0] == '\r')
+ {
+ myReadBufferLastStr.erase (myReadBufferLastStr.end() - 1);
+ aStartLinePos += 2;
+ isMultiline = false;
+ }
+ else if (myBufferPos == 0)
+ {
+ aStartLinePos += 1;
+ if (myReadBufferLastStr[myReadBufferLastStr.size() - 1] == '\\')
+ {
+ myReadBufferLastStr.erase (myReadBufferLastStr.end() - 1);
+ }
+ else
+ {
+ myReadBufferLastStr.erase (myReadBufferLastStr.end() - 2, myReadBufferLastStr.end());
+ }
+ isMultiline = false;
+ }
}
++myBufferPos;
myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
myUseReadBufferLastStr = false;
theLineLength = myReadBufferLastStr.size();
- aResultLine = myReadBufferLastStr.data();
+ aResultLine = &myReadBufferLastStr.front();
}
else
{
myReadBufferLastStr.clear();
}
theLineLength = myBufferPos - aStartLinePos;
- aResultLine = myReadBuffer.data() + aStartLinePos;
+ aResultLine = &myReadBuffer.front() + aStartLinePos;
}
// make string null terminated by replacing '\n' or '\r' (before '\n') symbol to null character.
if (theLineLength > 1 && aResultLine[theLineLength - 2] == '\r')
// save "unfinished" part of string to additional buffer
if (aStartLinePos != myBufferPos)
{
- myReadBufferLastStr = std::vector<char>(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
- myUseReadBufferLastStr = true;
+ if (myUseReadBufferLastStr)
+ {
+ myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
+ }
+ else
+ {
+ myReadBufferLastStr = std::vector<char>(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos);
+ myUseReadBufferLastStr = true;
+ }
}
}
}
return aResultLine;
}
+ //! Returns TRUE when the Multiline Mode is on.
+ bool IsMultilineMode() const { return myIsMultilineMode; }
+
+ //! Sets or unsets the multi-line mode.
+ void SetMultilineMode (bool theMultilineMode) { myIsMultilineMode = theMultilineMode; }
+
protected:
//! Read from stl stream.
size_t theLen,
size_t& theReadLen)
{
- theReadLen = theStream.read (myReadBuffer.data(), theLen).gcount();
+ theReadLen = (size_t )theStream.read (&myReadBuffer.front(), theLen).gcount();
return !theStream.bad();
}
size_t theLen,
size_t& theReadLen)
{
- theReadLen = ::fread (myReadBuffer.data(), 1, theLen, theStream);
+ theReadLen = ::fread (&myReadBuffer.front(), 1, theLen, theStream);
return ::ferror (theStream) == 0;
}
std::vector<char> myReadBuffer; //!< Temp read buffer
std::vector<char> myReadBufferLastStr; //!< Part of last string of myReadBuffer
bool myUseReadBufferLastStr; //!< Flag to use myReadBufferLastStr during next line reading
+ bool myIsMultilineMode; //!< Flag to process of the special multi-line case at the end of the line
size_t myBufferPos; //!< Current position in myReadBuffer
size_t myBytesLastRead; //!< The number of characters that were read last time from myReadBuffer.
};