[ros-diffs] [greatlrd] 25703: patch from : Paolo Devoti <devotip at gmail.com> fix issue : The fix does a WriteFile per line insted of one per char. See issue #2015 for more details.

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Sat Feb 3 17:03:38 CET 2007


Author: greatlrd
Date: Sat Feb  3 19:03:37 2007
New Revision: 25703

URL: http://svn.reactos.org/svn/reactos?rev=25703&view=rev
Log:
patch from : Paolo Devoti <devotip at gmail.com>
fix issue  : The fix does a WriteFile per line insted of one per char.
See issue #2015 for more details.

Modified:
    trunk/reactos/base/shell/cmd/console.c

Modified: trunk/reactos/base/shell/cmd/console.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/console.c?rev=25703&r1=25702&r2=25703&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/console.c (original)
+++ trunk/reactos/base/shell/cmd/console.c Sat Feb  3 19:03:37 2007
@@ -12,6 +12,9 @@
  *
  *    01-Jul-2005 (Brandon Turner) <turnerb7 at msu.edu>)
  *        Added ConPrintfPaging and ConOutPrintfPaging
+ *
+ *    02-Feb-2007 (Paolo Devoti) <devotip at gmail.com>)
+ *        Fixed ConPrintfPaging
  */
  
  
@@ -252,8 +255,8 @@
   /* the number of chars in a roow */
 	int ScreenCol = 0;  
  
-  /* chars since end of line */
-	int CharEL = 0; 
+  /* chars since start of line */
+	int CharSL = 0; 
  
 	int i = 0;
  
@@ -261,67 +264,54 @@
 		LineCount = 0;
  
   /* rest LineCount and return if no string have been given */
-        if (szFormat == NULL)
-                return 0;
+    if (szFormat == NULL)
+            return 0;
  
  
 	//get the size of the visual screen that can be printed too
 	if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
-        {
-                // we assuming its a file handle
-                ConPrintf(szFormat, arg_ptr, nStdHandle);
-                return 0;
-        }
+    {
+        // we assuming its a file handle
+        ConPrintf(szFormat, arg_ptr, nStdHandle);
+        return 0;
+    }
 	//subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt()
 	ScreenLines = (csbi.srWindow.Bottom  - csbi.srWindow.Top) - 4;
 	ScreenCol = (csbi.srWindow.Right - csbi.srWindow.Left) + 1;
  
 	//make sure they didnt make the screen to small 
 	if(ScreenLines<4)
-        {
-	        ConPrintf(szFormat, arg_ptr, nStdHandle);
-                return 0;
-        }
+    {
+	    ConPrintf(szFormat, arg_ptr, nStdHandle);
+            return 0;
+    }
  
 	len = _vstprintf (szOut, szFormat, arg_ptr);
 	pBuf = szOut;
  
 	for(i = 0; i < len; i++)
-	{ 
- 
-                if(pBuf[i] == _T('\n'))
-		{			        
-			LineCount++; 
-                        CharEL=0;
-		}      
-                else
-                {      
-                        CharEL++;           
-                        if (CharEL>=ScreenCol)
-                        {        
-                                if (i+1<len)
-                                {
-                                        if(pBuf[i+1] != _T('\n')) LineCount++;          
-                                }
-                                CharEL=0;
-                        }
-                }
- 
-                /* FIXME : write more that one char at time */
-                WriteFile (GetStdHandle (nStdHandle),&pBuf[i],sizeof(CHAR),&dwWritten,NULL);
-	        if(LineCount >= ScreenLines)
-	        {
-                        if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0)
-                        WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL); 
- 
-		        if(PagePrompt() != PROMPT_YES)
-		        {
-			        return 1;
-		        }
-		        //reset the number of lines being printed         
-		        LineCount = 0;
-                        CharEL=0;
-	        }
+	{
+		// search 'end of string' '\n' or 'end of screen line'
+		for(; (i < len) && (pBuf[i] != _T('\n') && (CharSL<ScreenCol)) ; i++)
+			CharSL++;
+
+        WriteFile (GetStdHandle (nStdHandle),&pBuf[i-CharSL],sizeof(CHAR)*(CharSL+1),&dwWritten,NULL);
+		LineCount++; 
+        CharSL=0;
+
+	    if(LineCount >= ScreenLines)
+	    {
+            if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0)
+				WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL); 
+
+		    if(PagePrompt() != PROMPT_YES)
+		    {
+			    return 1;
+		    }
+		    //reset the number of lines being printed         
+		    LineCount = 0;
+            CharSL=0;
+	    }
  
 	}
  




More information about the Ros-diffs mailing list