Index: CWineTest.cpp =================================================================== --- modules/rostests/rosautotest/CWineTest.cpp (revision 68236) +++ modules/rostests/rosautotest/CWineTest.cpp (working copy) @@ -276,6 +276,7 @@ stringstream ss, ssFinish; DWORD StartTime; float TotalTime; + string tailString; CPipe Pipe; char Buffer[1024]; @@ -294,7 +295,7 @@ { /* Output text through StringOut, even while the test is still running */ Buffer[BytesAvailable] = 0; - StringOut(string(Buffer)); + tailString = StringOut(tailString.append(string(Buffer)), false); if(Configuration.DoSubmit()) TestInfo->Log += Buffer; @@ -304,10 +305,17 @@ } catch(CTestException& e) { + if(!tailString.empty()) + StringOut(tailString); + tailString.clear(); StringOut(e.GetMessage()); TestInfo->Log += e.GetMessage(); } + /* Print what's left */ + if(!tailString.empty()) + StringOut(tailString); + TotalTime = ((float)GetTickCount() - StartTime)/1000; ssFinish << "Test " << TestInfo->Test << " completed in "; ssFinish << setprecision(2) << fixed << TotalTime << " seconds." << endl; Index: precomp.h =================================================================== --- modules/rostests/rosautotest/precomp.h (revision 68236) +++ modules/rostests/rosautotest/precomp.h (working copy) @@ -69,7 +69,7 @@ string EscapeString(const string& Input); string GetINIValue(PCWCH AppName, PCWCH KeyName, PCWCH FileName); bool IsNumber(const char* Input); -void StringOut(const string& InputString); +string StringOut(const string& InputString, bool forcePrint = true); string UnicodeToAscii(PCWSTR UnicodeString); string UnicodeToAscii(const wstring& UnicodeString); Index: tools.cpp =================================================================== --- modules/rostests/rosautotest/tools.cpp (revision 68236) +++ modules/rostests/rosautotest/tools.cpp (working copy) @@ -7,6 +7,7 @@ #include "precomp.h" +#define DBGPRINT_BUFSIZE 511 static const char HexCharacters[] = "0123456789ABCDEF"; /** @@ -86,43 +87,85 @@ /** * Outputs a string through the standard output and the debug output. - * The input string may have LF or CRLF line endings. + * The string may have LF or CRLF line endings. * - * @param InputString + * @param String * The std::string to output */ -void -StringOut(const string& InputString) +string +StringOut(const string& String, bool forcePrint) { - const char* pInput = InputString.c_str(); - char* OutputString = new char[InputString.size() + 1]; - char* pOutput = OutputString; + char DbgString[DBGPRINT_BUFSIZE + 1]; + size_t i, start = 0, last_newline = 0, size = 0, curr_pos = 0; + string NewString; /* Unify the line endings (the piped output of the tests may use CRLF) */ - while (*pInput) + for(i = 0; i < String.size(); i++) { /* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */ - if (*pInput == '\r' && *(pInput + 1) == '\n') + if(String[i] == '\r' && String[i + 1] == '\n') { - *pOutput = '\n'; - ++pInput; + NewString += '\n'; + ++i; } else { - *pOutput = *pInput; + /* Otherwise copy the string */ + NewString += String[i]; } - ++pInput; - ++pOutput; + curr_pos = NewString.size(); + + /* Try to print whole lines but obey the 512 bytes chunk size limit*/ + if(NewString[curr_pos - 1] == '\n' || (curr_pos - start) == DBGPRINT_BUFSIZE) + { + if((curr_pos - start) >= DBGPRINT_BUFSIZE) + { + /* No newlines so far, or the string just fits */ + if(last_newline <= start || ((curr_pos - start == DBGPRINT_BUFSIZE) && NewString[curr_pos - 1] == '\n')) + { + size = curr_pos - start; + memcpy(DbgString, NewString.c_str() + start, size); + start = curr_pos; + } + else + { + size = last_newline - start; + memcpy(DbgString, NewString.c_str() + start, size); + start = last_newline; + } + + DbgString[size] = 0; + DbgPrint("%s", DbgString); + } + + last_newline = curr_pos; + } } - *pOutput = 0; - OutputDebugStringA(OutputString); + size = curr_pos - start; - if (Configuration.DoPrint()) - cout << OutputString << flush; + /* Only print if forced to or if the rest is a whole line */ + if(forcePrint == true || NewString[curr_pos - 1] == '\n') + { + /* Output the whole string */ + if(Configuration.DoPrint()) + cout << NewString << flush; - delete[] OutputString; + memcpy(DbgString, NewString.c_str() + start, size); + DbgString[size] = 0; + DbgPrint("%s", DbgString); + + NewString.clear(); + return NewString; + } + + /* Output full lines only */ + if(Configuration.DoPrint()) + cout << NewString.substr(0, start) << flush; + + /* Return the remaining chunk */ + return NewString.substr(start, size); } /**