Author: janderwald
Date: Tue Nov 7 02:50:03 2006
New Revision: 24697
URL:
http://svn.reactos.org/svn/reactos?rev=24697&view=rev
Log:
- improve namedpipe_reader parsing of lines code
- it should now be able handle partial / full lines
Modified:
trunk/reactos/tools/sysreg/namedpipe_reader.cpp
Modified: trunk/reactos/tools/sysreg/namedpipe_reader.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/namedpipe_rea…
==============================================================================
--- trunk/reactos/tools/sysreg/namedpipe_reader.cpp (original)
+++ trunk/reactos/tools/sysreg/namedpipe_reader.cpp Tue Nov 7 02:50:03 2006
@@ -95,11 +95,43 @@
//---------------------------------------------------------------------------------------
void NamedPipeReader::extractLines(TCHAR * buffer, std::vector<string> & vect,
bool & append_line, unsigned long cbRead)
{
- TCHAR * offset = _tcsstr(buffer, _T("\x0D"));
+ TCHAR * offset = _tcschr(buffer, _T('\x0D'));
DWORD buf_offset = 0;
while(offset)
{
- offset[0] = _T('\0');
+ ///
+ /// HACKHACK
+ /// due to some mysterious reason, _tcschr / _tcsstr sometimes returns
+ /// not always the offset to the CR character but to the next LF
+ /// in MSVC 2005 (Debug Modus)
+
+ if (offset[0] == _T('\x0A'))
+ {
+ if (buf_offset)
+ {
+ offset--;
+ }
+ else
+ {
+ //TODO
+ // implement me special case
+ }
+ }
+
+ if (offset[0] == _T('\x0D'))
+ {
+ buf_offset += 2;
+ offset[0] = _T('\0');
+ offset +=2;
+ }
+ else
+ {
+ ///
+ /// BUG detected in parsing code
+ ///
+ abort();
+ }
+
string line = buffer;
if (append_line)
{
@@ -115,18 +147,18 @@
vect.push_back (line);
}
- offset += 2;
-
- buf_offset += line.length () + 2;
+ buf_offset += line.length();
if (buf_offset >= cbRead)
{
break;
}
buffer = offset;
+
offset = _tcsstr(buffer, _T("\n"));
}
if (buf_offset < cbRead)
{
+ buffer[cbRead - buf_offset] = _T('\0');
string line = buffer;
if (append_line)
{
@@ -195,7 +227,7 @@
#endif
} while (!fSuccess); // repeat loop if ERROR_MORE_DATA
- } while (localbuf[strlen(localbuf)-1] != '\n');
+ } while (append_line);
if (!fSuccess)
return 0;