console
Eric Pouech
pouech-eric at wanadoo.fr
Thu May 8 14:02:57 CDT 2003
A+
--
Eric Pouech
-------------- next part --------------
Name: con_nonwrap
ChangeLog: fixed console output for non wrapped mode
License: X11
GenDate: 2003/05/08 18:57:40 UTC
ModifiedFiles: dlls/kernel/console.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/console.c,v
retrieving revision 1.14
diff -u -u -r1.14 console.c
--- dlls/kernel/console.c 3 Apr 2003 18:04:40 -0000 1.14
+++ dlls/kernel/console.c 7 May 2003 18:50:40 -0000
@@ -1579,11 +1583,12 @@
/******************************************************************
- * write_char
+ * CONSOLE_WriteChars
*
* WriteConsoleOutput helper: hides server call semantics
+ * writes a string at a given pos with standard attribute
*/
-static int write_char(HANDLE hCon, LPCWSTR lpBuffer, int nc, COORD* pos)
+int CONSOLE_WriteChars(HANDLE hCon, LPCWSTR lpBuffer, int nc, COORD* pos)
{
int written = -1;
@@ -1651,18 +1656,17 @@
DWORD mode, LPWSTR ptr, int len)
{
int blk; /* number of chars to write on current line */
+ int done; /* number of chars already written */
if (len <= 0) return 1;
if (mode & ENABLE_WRAP_AT_EOL_OUTPUT) /* writes remaining on next line */
{
- int done;
-
for (done = 0; done < len; done += blk)
{
blk = min(len - done, csbi->dwSize.X - csbi->dwCursorPosition.X);
- if (write_char(hCon, ptr + done, blk, &csbi->dwCursorPosition) != blk)
+ if (CONSOLE_WriteChars(hCon, ptr + done, blk, &csbi->dwCursorPosition) != blk)
return 0;
if (csbi->dwCursorPosition.X == csbi->dwSize.X && !next_line(hCon, csbi))
return 0;
@@ -1670,19 +1674,19 @@
}
else
{
- blk = min(len, csbi->dwSize.X - csbi->dwCursorPosition.X);
-
- if (write_char(hCon, ptr, blk, &csbi->dwCursorPosition) != blk)
- return 0;
- if (blk < len)
+ int pos = csbi->dwCursorPosition.X;
+ /* FIXME: we could reduce the number of loops
+ * but, in most cases we wouldn't gain lots of time (it would only
+ * happen if we're asked to overwrite more than twice the part of the line,
+ * which is unlikely
+ */
+ for (blk = done = 0; done < len; done += blk)
{
- csbi->dwCursorPosition.X = csbi->dwSize.X - 1;
- /* all remaining chars should be written on last column,
- * so only overwrite the last column with last char in block
- */
- if (write_char(hCon, ptr + len - 1, 1, &csbi->dwCursorPosition) != 1)
+ blk = min(len - done, csbi->dwSize.X - csbi->dwCursorPosition.X);
+
+ csbi->dwCursorPosition.X = pos;
+ if (CONSOLE_WriteChars(hCon, ptr + done, blk, &csbi->dwCursorPosition) != blk)
return 0;
- csbi->dwCursorPosition.X = csbi->dwSize.X - 1;
}
}
More information about the wine-patches
mailing list