Ignore:
Timestamp:
Jan 10, 2013, 10:47:04 PM (13 years ago)
Author:
dmik
Message:

kernel32: Fix long string output to stdout in console I/O mode.

Kind of a regression of changes made for #90. See Java ticket 201 for details.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/conbuffervio.cpp

    r22052 r22059  
    265265        numchar = numchar - ulCounter;
    266266
    267         if(pConsoleBuffer->coordCursorPosition.X + numchar > pConsoleBuffer->coordWindowSize.X)
     267        while (numchar)
    268268        {
    269             int tmp = pConsoleBuffer->coordWindowSize.X - pConsoleBuffer->coordCursorPosition.X;
    270 
    271             VioWrtCharStr(&pszBuffer[ulCounter], tmp, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
    272             ulCounter += tmp;
    273             numchar   -= tmp;
    274 
    275             pConsoleBuffer->coordCursorPosition.X = 0;
    276             pConsoleBuffer->coordCursorPosition.Y++;
    277             if(pConsoleBuffer->coordCursorPosition.Y >= pConsoleBuffer->coordWindowSize.Y) {
    278                 dprintf(("scrollup"));
    279                 VioScrollUp(0, 0, pConsoleBuffer->coordWindowSize.Y-1, pConsoleBuffer->coordWindowSize.X-1,
    280                             1, &filler[0], 0);
    281                 pConsoleBuffer->coordCursorPosition.Y = pConsoleBuffer->coordWindowSize.Y-1;
    282             }
    283             VioWrtCharStr(&pszBuffer[ulCounter], numchar, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
    284             pConsoleBuffer->coordCursorPosition.X += numchar;
    285             VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     269          if(pConsoleBuffer->coordCursorPosition.X + numchar > pConsoleBuffer->coordWindowSize.X)
     270          {
     271              int tmp = pConsoleBuffer->coordWindowSize.X - pConsoleBuffer->coordCursorPosition.X;
     272
     273              VioWrtCharStr(&pszBuffer[ulCounter], tmp, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     274              ulCounter += tmp;
     275              numchar   -= tmp;
     276
     277              pConsoleBuffer->coordCursorPosition.X = 0;
     278              pConsoleBuffer->coordCursorPosition.Y++;
     279              if(pConsoleBuffer->coordCursorPosition.Y >= pConsoleBuffer->coordWindowSize.Y) {
     280                  dprintf(("scrollup"));
     281                  VioScrollUp(0, 0, pConsoleBuffer->coordWindowSize.Y-1, pConsoleBuffer->coordWindowSize.X-1,
     282                              1, &filler[0], 0);
     283                  pConsoleBuffer->coordCursorPosition.Y = pConsoleBuffer->coordWindowSize.Y-1;
     284              }
     285              VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     286          }
     287          else {
     288              VioWrtCharStr(&pszBuffer[ulCounter], numchar, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     289              ulCounter += numchar;
     290              pConsoleBuffer->coordCursorPosition.X += numchar;
     291              VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
     292              numchar = 0;
     293          }
    286294        }
    287         else {
    288             VioWrtCharStr(&pszBuffer[ulCounter], numchar, pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
    289             pConsoleBuffer->coordCursorPosition.X += numchar;
    290             VioSetCurPos(pConsoleBuffer->coordCursorPosition.Y, pConsoleBuffer->coordCursorPosition.X, 0);
    291         }
    292         ulCounter += numchar;
    293295    }
    294296  }
Note: See TracChangeset for help on using the changeset viewer.