[ROSAUTOTEST]
authorColin Finck <colin@reactos.org>
Sun, 22 Mar 2015 12:35:08 +0000 (12:35 +0000)
committerColin Finck <colin@reactos.org>
Sun, 22 Mar 2015 12:35:08 +0000 (12:35 +0000)
Make outputting a string as easy as it should be. Now that our StringOut internally uses OutputDebugStringA instead of DbgPrint, we don't need to output in 512 byte chunks anymore.
Additionally, do an explicit flush when using std::cout to not lose debug output.

ROSTESTS-158 #resolve #comment Committed in r66855

svn path=/trunk/; revision=66855

rostests/rosautotest/CWineTest.cpp
rostests/rosautotest/precomp.h
rostests/rosautotest/tools.cpp

index 5410d86..4df9c01 100644 (file)
@@ -276,7 +276,6 @@ CWineTest::RunTest(CTestInfo* TestInfo)
     stringstream ss, ssFinish;
     DWORD StartTime;
     float TotalTime;
-    string tailString;
     CPipe Pipe;
     char Buffer[1024];
 
@@ -295,7 +294,7 @@ CWineTest::RunTest(CTestInfo* TestInfo)
         {
             /* 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 @@ CWineTest::RunTest(CTestInfo* TestInfo)
     }
     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 fa752b8..15b4287 100644 (file)
@@ -69,7 +69,7 @@ string EscapeString(const char* Input);
 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 c925c14..bfb512d 100644 (file)
@@ -2,12 +2,11 @@
  * 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";
 
 /**
@@ -87,85 +86,43 @@ IsNumber(const char* Input)
 
 /**
  * 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;
 }
 
 /**