32#define CON_STREAM_WRITE ConStreamWrite
34#define CP_SHIFTJIS 932
41#define IsCJKCodePage(CodePage) \
42 ((CodePage) == CP_SHIFTJIS || (CodePage) == CP_HANGUL || \
44 (CodePage) == CP_BIG5 || (CodePage) == CP_GB2312)
87 if (Pager->CurrentLine)
90 if (Pager->CachedLine)
93 Pager->CachedLine =
NULL;
94 Pager->cchCachedLine = 0;
97 Pager->CurrentLine =
NULL;
104 if (Pager->CachedLine)
116 for (; ich <
cch; ++ich)
118 if (TextBuff[ich] ==
TEXT(
'\n'))
126 cchLine = (ich - ichStart);
143 (ich >=
cch) && (TextBuff[ich - 1] !=
TEXT(
'\n')));
146 if (bCacheLine && !Pager->CachedLine)
150 cchLine *
sizeof(
TCHAR));
151 Pager->cchCachedLine = 0;
153 if (!Pager->CachedLine)
159 else if (Pager->CachedLine)
163 (
PVOID)Pager->CachedLine,
164 (Pager->cchCachedLine + cchLine) *
sizeof(
TCHAR));
168 Pager->CachedLine =
NULL;
169 Pager->cchCachedLine = 0;
174 Pager->CachedLine =
ptr;
176 if (Pager->CachedLine)
181 cchLine *
sizeof(
TCHAR));
182 Pager->cchCachedLine += cchLine;
196 if (Pager->CachedLine)
198 Pager->iEndLine = Pager->cchCachedLine;
199 Pager->CurrentLine = Pager->CachedLine;
203 Pager->iEndLine = cchLine;
204 Pager->CurrentLine = &TextBuff[ichStart];
208 if ((Pager->iEndLine > 0) && (Pager->CurrentLine[Pager->iEndLine - 1] ==
TEXT(
'\n')))
223 const DWORD PageColumns = Pager->PageColumns;
224 const DWORD ScrollRows = Pager->ScrollRows;
226 BOOL bFinitePaging = ((PageColumns > 0) && (Pager->PageRows > 0));
227 LONG nTabWidth = Pager->nTabWidth;
233 DWORD iColumn = Pager->iColumn;
237 UINT nWidthOfChar = 1;
245 nTabWidth = PageColumns - 1;
247 nTabWidth =
min(nTabWidth, PageColumns - 1);
259 Line = Pager->CurrentLine;
260 ichStart = Pager->ichCurr;
261 iEndLine = Pager->iEndLine;
266 if (bFinitePaging && (Pager->iLine >= ScrollRows))
269 if (!
Line || (ichStart >= iEndLine))
275 Line = Pager->CurrentLine;
276 ichStart = Pager->ichCurr;
277 iEndLine = Pager->iEndLine;
287 Pager->iColumn = iColumn;
288 if (Pager->PagerLine && Pager->PagerLine(Pager, &
Line[ichStart], iEndLine - ichStart))
290 iColumn = Pager->iColumn;
293 Pager->nSpacePending = 0;
301 if (Pager->nSpacePending > 0)
304 while (Pager->nSpacePending > 0)
308 --(Pager->nSpacePending);
312 if ((PageColumns > 0) && (iColumn % PageColumns == 0))
317 if (!bFinitePaging || (PageColumns < Pager->
Screen->csbi.dwSize.X))
332 for (ich = ichStart; ich < iEndLine; ++ich)
365 if ((PageColumns > 0) && IsCJK)
367 IsDoubleWidthCharTrailing = (nWidthOfChar == 2) &&
368 ((iColumn + 1) % PageColumns == 0);
369 if (IsDoubleWidthCharTrailing)
378 iColumn += nWidthOfChar;
381 if ((PageColumns > 0) && (iColumn % PageColumns == 0))
389 if (ich - ichStart > 0)
414 Pager->nSpacePending = 0;
432 Pager->nSpacePending = nTabWidth - (iColumn % nTabWidth);
443 while (Pager->iLine < ScrollRows)
447 Pager->iColumn = iColumn;
448 if (Pager->PagerLine && Pager->PagerLine(Pager,
TEXT(
"\n"), 1))
469 Pager->nSpacePending = 0;
478 if (IsDoubleWidthCharTrailing)
480 IsDoubleWidthCharTrailing =
FALSE;
486 if ((PageColumns > 0) && (iColumn % PageColumns == 0))
489 if (!bFinitePaging || (PageColumns < Pager->
Screen->csbi.dwSize.X))
506 Pager->ichCurr = ichStart;
507 Pager->iColumn = iColumn;
511 if (bFinitePaging && (Pager->iLine >= ScrollRows))
567 Pager->PageColumns = csbi.
dwSize.
X;
573 Pager->PageColumns = 0;
579 if (bIsConsole && (Pager->PageRows >= 2))
582 Pager->ScrollRows = Pager->PageRows - 1;
587 Pager->ScrollRows = 0;
591 Pager->CachedLine =
NULL;
592 Pager->cchCachedLine = 0;
595 Pager->CurrentLine =
NULL;
598 Pager->nSpacePending = 0;
609 if (!Pager->CachedLine)
621 if (bIsConsole && (Pager->PageRows >= 2))
624 Pager->ScrollRows = Pager->PageRows - 1;
636 Pager->PageColumns = csbi.
dwSize.
X;
static LPTSTR ExpandTab(LPCTSTR line)
#define ERROR_NOT_ENOUGH_MEMORY
#define HeapFree(x, y, z)
#define WideCharToMultiByte
UINT WINAPI DECLSPEC_HOTPATCH GetConsoleOutputCP(void)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
static BOOL __stdcall PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total)
Console/terminal screen management.
BOOL ConGetScreenInfo(IN PCON_SCREEN Screen, OUT PCONSOLE_SCREEN_BUFFER_INFO pcsbi)
INT WINAPI K32LoadStringW(IN HINSTANCE hInstance OPTIONAL, IN UINT uID, OUT LPWSTR lpBuffer, IN INT nBufferMax)
PULONG MinorVersion OPTIONAL
#define RtlCopyMemory(Destination, Source, Length)