stringstream ss, ssFinish;
DWORD StartTime;
float TotalTime;
- string tailString;
CPipe Pipe;
char Buffer[1024];
{
/* 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;
}
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;
* PROJECT: ReactOS Automatic Testing Utility
* LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
* PURPOSE: Various helper functions
- * COPYRIGHT: Copyright 2008-2009 Colin Finck <colin@reactos.org>
+ * COPYRIGHT: Copyright 2008-2015 Colin Finck <colin@reactos.org>
*/
#include "precomp.h"
-#define DBGPRINT_BUFSIZE 511
static const char HexCharacters[] = "0123456789ABCDEF";
/**
/**
* 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;
-
- /* 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;
-
- memcpy(DbgString, NewString.c_str() + start, size);
- DbgString[size] = 0;
- OutputDebugStringA(DbgString);
-
- NewString.clear();
- return NewString;
- }
+ *pOutput = 0;
+ OutputDebugStringA(OutputString);
- /* Output full lines only */
- if(Configuration.DoPrint())
- cout << NewString.substr(0, start);
+ if (Configuration.DoPrint())
+ cout << OutputString << flush;
- /* Return the remaining chunk */
- return NewString.substr(start, size);
+ delete[] OutputString;
}
/**