Index: modules/rostests/rosautotest/CWineTest.cpp =================================================================== --- modules/rostests/rosautotest/CWineTest.cpp (revision 66851) +++ modules/rostests/rosautotest/CWineTest.cpp (working copy) @@ -276,7 +276,6 @@ stringstream ss, ssFinish; DWORD StartTime; float TotalTime; - string tailString; CPipe Pipe; char Buffer[1024]; @@ -295,7 +294,7 @@ { /* Output text through StringOut, even while the test is still running */ Buffer[BytesAvailable] = 0; - tailString = StringOut(tailString.append(string(Buffer)), false); + StringOut(string(Buffer)); if(Configuration.DoSubmit()) TestInfo->Log += Buffer; @@ -305,17 +304,10 @@ } 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: modules/rostests/rosautotest/precomp.h =================================================================== --- modules/rostests/rosautotest/precomp.h (revision 66851) +++ 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); -string StringOut(const string& String, bool forcePrint = true); +void StringOut(const string& InputString); string UnicodeToAscii(PCWSTR UnicodeString); string UnicodeToAscii(const wstring& UnicodeString); Index: modules/rostests/rosautotest/tools.cpp =================================================================== --- modules/rostests/rosautotest/tools.cpp (revision 66851) +++ modules/rostests/rosautotest/tools.cpp (working copy) @@ -87,85 +87,42 @@ /** * Outputs a string through the standard output and the debug output. - * The string may have LF or CRLF line endings. + * The input string may have LF or CRLF line endings. * - * @param String + * @param InputString * The std::string to output */ -string -StringOut(const string& String, bool forcePrint) +void +StringOut(const string& InputString) { - char DbgString[DBGPRINT_BUFSIZE + 1]; - size_t i, start = 0, last_newline = 0, size = 0, curr_pos = 0; - string NewString; + const char* pInput = InputString.c_str(); + char* OutputString = new char[InputString.size() + 1]; + char* pOutput = OutputString; /* Unify the line endings (the piped output of the tests may use CRLF) */ - for(i = 0; i < String.size(); i++) + while (*pInput) { - /* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */ - if(String[i] == '\r' && String[i + 1] == '\n') + if (*pInput == '\r' && *(pInput + 1) == '\n') { - NewString += '\n'; - ++i; + *pOutput = '\n'; + ++pInput; } else { - /* Otherwise copy the string */ - NewString += String[i]; + *pOutput = *pInput; } - 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; - OutputDebugStringA(DbgString); - } - - last_newline = curr_pos; - } + ++pInput; + ++pOutput; } - size = curr_pos - start; + *pOutput = 0; + OutputDebugStringA(OutputString); - /* 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; + if (Configuration.DoPrint()) + cout << OutputString << flush; - memcpy(DbgString, NewString.c_str() + start, size); - DbgString[size] = 0; - OutputDebugStringA(DbgString); - - NewString.clear(); - return NewString; - } - - /* Output full lines only */ - if(Configuration.DoPrint()) - cout << NewString.substr(0, start); - - /* Return the remaining chunk */ - return NewString.substr(start, size); + delete[] OutputString; } /**