[CONUTILS:PAGER][MORE] Code style/formatting.

- Shorten the names of the flags: CON_PAGER_FLAG_*** --> CON_PAGER_***.
- Reorder few members in the CON_PAGER pager structure where they make sense.
- ScreenColumns, ScreenRows --> PageColumns, PageRows: keeping the open
  possibility for having a pager controlling a region of different size
  than the screen.
- Add doxygen documentation for ConWritePaging().
This commit is contained in:
Hermès Bélusca-Maïto 2021-06-27 02:23:12 +02:00
parent 1c7f3476a0
commit f74a3f6e29
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
3 changed files with 77 additions and 49 deletions

View file

@ -88,7 +88,8 @@ static BOOL IsBlankLine(IN PCWCH line, IN DWORD cch)
return TRUE; return TRUE;
} }
static BOOL __stdcall static BOOL
__stdcall
MorePagerLine( MorePagerLine(
IN OUT PCON_PAGER Pager, IN OUT PCON_PAGER Pager,
IN PCWCH line, IN PCWCH line,
@ -100,7 +101,7 @@ MorePagerLine(
{ {
if (Pager->lineno < s_nNextLineNo) if (Pager->lineno < s_nNextLineNo)
{ {
Pager->dwFlags |= CON_PAGER_FLAG_DONT_OUTPUT; Pager->dwFlags |= CON_PAGER_DONT_OUTPUT;
s_bPrevLineIsBlank = FALSE; s_bPrevLineIsBlank = FALSE;
return TRUE; /* Don't output */ return TRUE; /* Don't output */
} }
@ -113,7 +114,7 @@ MorePagerLine(
{ {
if (s_bPrevLineIsBlank) if (s_bPrevLineIsBlank)
{ {
Pager->dwFlags |= CON_PAGER_FLAG_DONT_OUTPUT; Pager->dwFlags |= CON_PAGER_DONT_OUTPUT;
return TRUE; /* Don't output */ return TRUE; /* Don't output */
} }
@ -981,9 +982,9 @@ int wmain(int argc, WCHAR* argv[])
} }
Pager.PagerLine = MorePagerLine; Pager.PagerLine = MorePagerLine;
Pager.dwFlags |= CON_PAGER_FLAG_EXPAND_TABS; Pager.dwFlags |= CON_PAGER_EXPAND_TABS;
if (s_dwFlags & FLAG_P) if (s_dwFlags & FLAG_P)
Pager.dwFlags |= CON_PAGER_FLAG_EXPAND_FF; Pager.dwFlags |= CON_PAGER_EXPAND_FF;
Pager.nTabWidth = s_nTabWidth; Pager.nTabWidth = s_nTabWidth;
/* Special case where we run 'MORE' without any argument: we use STDIN */ /* Special case where we run 'MORE' without any argument: we use STDIN */

View file

@ -63,7 +63,7 @@ ConCallPagerLine(
IN PCTCH line, IN PCTCH line,
IN DWORD cch) IN DWORD cch)
{ {
Pager->dwFlags &= ~CON_PAGER_FLAG_DONT_OUTPUT; /* Clear the flag */ Pager->dwFlags &= ~CON_PAGER_DONT_OUTPUT; /* Clear the flag */
if (!Pager->PagerLine || !Pager->PagerLine(Pager, line, cch)) if (!Pager->PagerLine || !Pager->PagerLine(Pager, line, cch))
CON_STREAM_WRITE(Pager->Screen->Stream, line, cch); CON_STREAM_WRITE(Pager->Screen->Stream, line, cch);
@ -72,12 +72,12 @@ ConCallPagerLine(
static BOOL static BOOL
ConPagerWorker(IN PCON_PAGER Pager) ConPagerWorker(IN PCON_PAGER Pager)
{ {
const DWORD ScreenColumns = Pager->ScreenColumns; const DWORD PageColumns = Pager->PageColumns;
const DWORD ScrollRows = Pager->ScrollRows; const DWORD ScrollRows = Pager->ScrollRows;
const PCTCH TextBuff = Pager->TextBuff; const PCTCH TextBuff = Pager->TextBuff;
const DWORD cch = Pager->cch; const DWORD cch = Pager->cch;
BOOL bFinitePaging = ((ScreenColumns > 0) && (Pager->ScreenRows > 0)); BOOL bFinitePaging = ((PageColumns > 0) && (Pager->PageRows > 0));
LONG nTabWidth = Pager->nTabWidth; LONG nTabWidth = Pager->nTabWidth;
DWORD ich = Pager->ich; DWORD ich = Pager->ich;
@ -99,12 +99,12 @@ ConPagerWorker(IN PCON_PAGER Pager)
/* Normalize the tab width: if negative or too large, /* Normalize the tab width: if negative or too large,
* cap it to the number of columns. */ * cap it to the number of columns. */
if (ScreenColumns > 0) // if (bFinitePaging) if (PageColumns > 0) // if (bFinitePaging)
{ {
if (nTabWidth < 0) if (nTabWidth < 0)
nTabWidth = ScreenColumns - 1; nTabWidth = PageColumns - 1;
else else
nTabWidth = min(nTabWidth, ScreenColumns - 1); nTabWidth = min(nTabWidth, PageColumns - 1);
} }
else else
{ {
@ -114,7 +114,7 @@ ConPagerWorker(IN PCON_PAGER Pager)
nTabWidth = 8; nTabWidth = 8;
} }
if (Pager->dwFlags & CON_PAGER_FLAG_EXPAND_TABS) if (Pager->dwFlags & CON_PAGER_EXPAND_TABS)
{ {
ExpandTab: ExpandTab:
while (Pager->nSpacePending > 0) while (Pager->nSpacePending > 0)
@ -126,9 +126,9 @@ ExpandTab:
ConCallPagerLine(Pager, L" ", 1); ConCallPagerLine(Pager, L" ", 1);
--(Pager->nSpacePending); --(Pager->nSpacePending);
++iColumn; ++iColumn;
if ((ScreenColumns > 0) && (iColumn % ScreenColumns == 0)) if ((PageColumns > 0) && (iColumn % PageColumns == 0))
{ {
if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
++iLine; ++iLine;
} }
} }
@ -149,7 +149,7 @@ ExpandTab:
/* Output the pending text, including the newline */ /* Output the pending text, including the newline */
ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1); ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1);
ichStart = ich + 1; ichStart = ich + 1;
if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
++iLine; ++iLine;
iColumn = 0; iColumn = 0;
@ -160,7 +160,7 @@ ExpandTab:
/* TAB character */ /* TAB character */
if (TextBuff[ich] == TEXT('\t') && if (TextBuff[ich] == TEXT('\t') &&
(Pager->dwFlags & CON_PAGER_FLAG_EXPAND_TABS)) (Pager->dwFlags & CON_PAGER_EXPAND_TABS))
{ {
/* Output the pending text */ /* Output the pending text */
ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart);
@ -178,12 +178,12 @@ ExpandTab:
/* FORM-FEED character */ /* FORM-FEED character */
if (TextBuff[ich] == TEXT('\f') && if (TextBuff[ich] == TEXT('\f') &&
(Pager->dwFlags & CON_PAGER_FLAG_EXPAND_FF)) (Pager->dwFlags & CON_PAGER_EXPAND_FF))
{ {
/* Output the pending text, skipping the form-feed */ /* Output the pending text, skipping the form-feed */
ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart);
ichStart = ich + 1; ichStart = ich + 1;
// FIXME: Should we handle CON_PAGER_FLAG_DONT_OUTPUT ? // FIXME: Should we handle CON_PAGER_DONT_OUTPUT ?
if (bFinitePaging) if (bFinitePaging)
{ {
@ -192,7 +192,7 @@ ExpandTab:
{ {
ConCallPagerLine(Pager, L"\n", 1); ConCallPagerLine(Pager, L"\n", 1);
// CON_STREAM_WRITE(Pager->Screen->Stream, TEXT("\n"), 1); // CON_STREAM_WRITE(Pager->Screen->Stream, TEXT("\n"), 1);
// if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) // if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
++iLine; ++iLine;
} }
} }
@ -212,23 +212,23 @@ ExpandTab:
if (IsCJK) if (IsCJK)
{ {
nWidthOfChar = GetWidthOfCharCJK(nCodePage, TextBuff[ich]); nWidthOfChar = GetWidthOfCharCJK(nCodePage, TextBuff[ich]);
if (ScreenColumns > 0) if (PageColumns > 0)
{ {
IsDoubleWidthCharTrailing = (nWidthOfChar == 2) && IsDoubleWidthCharTrailing = (nWidthOfChar == 2) &&
((iColumn + 1) % ScreenColumns == 0); ((iColumn + 1) % PageColumns == 0);
} }
} }
/* Care about CJK character presentation only when outputting /* Care about CJK character presentation only when outputting
* to a device where the number of columns is known. */ * to a device where the number of columns is known. */
if (ScreenColumns > 0) if (PageColumns > 0)
{ {
if ((iColumn + nWidthOfChar) % ScreenColumns == 0) if ((iColumn + nWidthOfChar) % PageColumns == 0)
{ {
/* Output the pending text, including the last double-width character */ /* Output the pending text, including the last double-width character */
ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1); ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1);
ichStart = ich + 1; ichStart = ich + 1;
if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
++iLine; ++iLine;
iColumn += nWidthOfChar; iColumn += nWidthOfChar;
continue; continue;
@ -239,10 +239,10 @@ ExpandTab:
/* Output the pending text, excluding the last double-width character */ /* Output the pending text, excluding the last double-width character */
ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart);
ichStart = ich; ichStart = ich;
if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
CON_STREAM_WRITE(Pager->Screen->Stream, TEXT(" "), 1); CON_STREAM_WRITE(Pager->Screen->Stream, TEXT(" "), 1);
--ich; --ich;
if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) if (!(Pager->dwFlags & CON_PAGER_DONT_OUTPUT))
++iLine; ++iLine;
++iColumn; ++iColumn;
continue; continue;
@ -267,7 +267,31 @@ ExpandTab:
return (ich < cch); return (ich < cch);
} }
/* Returns TRUE when all the text is displayed, and FALSE if display is stopped */
/**
* @name ConWritePaging
* Pages the contents of a user-specified character buffer on the screen.
*
* @param[in] Pager
* Pager object that describes where the paged output is issued.
*
* @param[in] PagePrompt
* A user-specific callback, called when a page has been displayed.
*
* @param[in] StartPaging
* Set to TRUE for initializing the paging operation; FALSE during paging.
*
* @param[in] szStr
* Pointer to the character buffer whose contents are to be paged.
*
* @param[in] len
* Length of the character buffer pointed by @p szStr, specified
* in number of characters.
*
* @return
* TRUE when all the contents of the character buffer has been displayed;
* FALSE if the paging operation has been stopped (controlled via @p PagePrompt).
**/
BOOL BOOL
ConWritePaging( ConWritePaging(
IN PCON_PAGER Pager, IN PCON_PAGER Pager,
@ -288,14 +312,14 @@ ConWritePaging(
if (bIsConsole) if (bIsConsole)
{ {
/* Calculate the console screen extent */ /* Calculate the console screen extent */
Pager->ScreenColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; Pager->PageColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
Pager->ScreenRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; Pager->PageRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
} }
else else
{ {
/* We assume it's a file handle */ /* We assume it's a file handle */
Pager->ScreenColumns = 0; Pager->PageColumns = 0;
Pager->ScreenRows = 0; Pager->PageRows = 0;
} }
if (StartPaging) if (StartPaging)
@ -303,7 +327,7 @@ ConWritePaging(
if (bIsConsole) if (bIsConsole)
{ {
/* Reset to display one page by default */ /* Reset to display one page by default */
Pager->ScrollRows = Pager->ScreenRows - 1; Pager->ScrollRows = Pager->PageRows - 1;
} }
else else
{ {
@ -314,11 +338,11 @@ ConWritePaging(
if (StartPaging) if (StartPaging)
{ {
/* Reset the output line count, the column index and the line number */ /* Reset the paging state */
Pager->iLine = 0;
Pager->iColumn = 0;
Pager->lineno = 1;
Pager->nSpacePending = 0; Pager->nSpacePending = 0;
Pager->iColumn = 0;
Pager->iLine = 0;
Pager->lineno = 1;
} }
Pager->TextBuff = szStr; Pager->TextBuff = szStr;
@ -333,10 +357,10 @@ ConWritePaging(
/* Prompt the user only when we display to a console and the screen /* Prompt the user only when we display to a console and the screen
* is not too small: at least one line for the actual paged text and * is not too small: at least one line for the actual paged text and
* one line for the prompt. */ * one line for the prompt. */
if (bIsConsole && (Pager->ScreenRows >= 2)) if (bIsConsole && (Pager->PageRows >= 2))
{ {
/* Reset to display one page by default */ /* Reset to display one page by default */
Pager->ScrollRows = Pager->ScreenRows - 1; Pager->ScrollRows = Pager->PageRows - 1;
/* Prompt the user; give him some values for statistics */ /* Prompt the user; give him some values for statistics */
if (!PagePrompt(Pager, Pager->ich, Pager->cch)) if (!PagePrompt(Pager, Pager->ich, Pager->cch))
@ -347,8 +371,8 @@ ConWritePaging(
* in case the user has redimensioned it during the prompt. */ * in case the user has redimensioned it during the prompt. */
if (bIsConsole && ConGetScreenInfo(Pager->Screen, &csbi)) if (bIsConsole && ConGetScreenInfo(Pager->Screen, &csbi))
{ {
Pager->ScreenColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; Pager->PageColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
Pager->ScreenRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; Pager->PageRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
} }
} }

View file

@ -29,25 +29,28 @@ extern "C" {
// #include <wincon.h> // #include <wincon.h>
struct _CON_PAGER; struct _CON_PAGER;
typedef BOOL (__stdcall *CON_PAGER_LINE_FN)(
typedef BOOL
(__stdcall *CON_PAGER_LINE_FN)(
IN OUT struct _CON_PAGER *Pager, IN OUT struct _CON_PAGER *Pager,
IN PCTCH line, IN PCTCH line,
IN DWORD cch); IN DWORD cch);
/* Flags for CON_PAGER */ /* Flags for CON_PAGER */
#define CON_PAGER_FLAG_DONT_OUTPUT (1 << 0) #define CON_PAGER_DONT_OUTPUT (1 << 0)
#define CON_PAGER_FLAG_EXPAND_TABS (1 << 1) #define CON_PAGER_EXPAND_TABS (1 << 1)
#define CON_PAGER_FLAG_EXPAND_FF (1 << 2) #define CON_PAGER_EXPAND_FF (1 << 2)
typedef struct _CON_PAGER typedef struct _CON_PAGER
{ {
/* Console screen properties */ /* Console screen properties */
PCON_SCREEN Screen; PCON_SCREEN Screen;
DWORD ScreenColumns; DWORD PageColumns;
DWORD ScreenRows; DWORD PageRows;
/* Paging parameters */ /* Paging parameters */
CON_PAGER_LINE_FN PagerLine; /* The line function */ CON_PAGER_LINE_FN PagerLine; /* The line function */
DWORD dwFlags; /* The CON_PAGER_... flags */
LONG nTabWidth; LONG nTabWidth;
DWORD ScrollRows; DWORD ScrollRows;
@ -57,11 +60,10 @@ typedef struct _CON_PAGER
/* Paging state */ /* Paging state */
DWORD ich; /* The current index of character */ DWORD ich; /* The current index of character */
DWORD nSpacePending; /* Pending spaces for TAB expansion */
DWORD iColumn; /* The current index of column */ DWORD iColumn; /* The current index of column */
DWORD iLine; /* The physical output line count of screen */ DWORD iLine; /* The physical output line count of screen */
DWORD lineno; /* The logical line number */ DWORD lineno; /* The logical line number */
DWORD dwFlags; /* The CON_PAGER_FLAG_... flags */
DWORD nSpacePending;
} CON_PAGER, *PCON_PAGER; } CON_PAGER, *PCON_PAGER;
#define INIT_CON_PAGER(pScreen) {(pScreen), 0} #define INIT_CON_PAGER(pScreen) {(pScreen), 0}
@ -73,7 +75,8 @@ do { \
} while (0) } while (0)
typedef BOOL (__stdcall *PAGE_PROMPT)( typedef BOOL
(__stdcall *PAGE_PROMPT)(
IN PCON_PAGER Pager, IN PCON_PAGER Pager,
IN DWORD Done, IN DWORD Done,
IN DWORD Total); IN DWORD Total);