1 /* 2 * PROJECT: ReactOS Console Utilities Library 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Console/terminal paging functionality. 5 * COPYRIGHT: Copyright 2017-2021 Hermes Belusca-Maito 6 * Copyright 2021 Katayama Hirofumi MZ 7 */ 8 9 /** 10 * @file pager.h 11 * @ingroup ConUtils 12 * 13 * @brief Console/terminal paging functionality. 14 **/ 15 16 #ifndef __PAGER_H__ 17 #define __PAGER_H__ 18 19 #pragma once 20 21 #ifndef _UNICODE 22 #error The ConUtils library at the moment only supports compilation with _UNICODE defined! 23 #endif 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 // #include <wincon.h> 30 31 struct _CON_PAGER; 32 33 typedef BOOL 34 (__stdcall *CON_PAGER_LINE_FN)( 35 IN OUT struct _CON_PAGER *Pager, 36 IN PCTCH line, 37 IN DWORD cch); 38 39 /* Flags for CON_PAGER */ 40 #define CON_PAGER_EXPAND_TABS (1 << 0) 41 #define CON_PAGER_EXPAND_FF (1 << 1) 42 // Whether or not the pager will cache the line if it's incomplete (not NEWLINE-terminated). 43 #define CON_PAGER_CACHE_INCOMPLETE_LINE (1 << 2) 44 45 typedef struct _CON_PAGER 46 { 47 /* Console screen properties */ 48 PCON_SCREEN Screen; 49 DWORD PageColumns; 50 DWORD PageRows; 51 52 /* Paging parameters */ 53 CON_PAGER_LINE_FN PagerLine; /* The line function */ 54 DWORD dwFlags; /* The CON_PAGER_... flags */ 55 LONG nTabWidth; 56 DWORD ScrollRows; 57 58 /* Data buffer */ 59 PCTCH CachedLine; /* Cached line, HeapAlloc'ated */ 60 SIZE_T cchCachedLine; /* Its length (number of characters) */ 61 SIZE_T ich; /* The current index of character in TextBuff (a user-provided source buffer) */ 62 63 /* Paging state */ 64 PCTCH CurrentLine; /* Pointer to the current line (either within a user-provided source buffer, or to CachedLine) */ 65 SIZE_T ichCurr; /* The current index of character in CurrentLine */ 66 SIZE_T iEndLine; /* End (length) of CurrentLine */ 67 DWORD nSpacePending; /* Pending spaces for TAB expansion */ 68 DWORD iColumn; /* The current index of column */ 69 DWORD iLine; /* The physical output line count of screen */ 70 DWORD lineno; /* The logical line number */ 71 } CON_PAGER, *PCON_PAGER; 72 73 #define INIT_CON_PAGER(pScreen) {(pScreen), 0} 74 75 #define InitializeConPager(pPager, pScreen) \ 76 do { \ 77 ZeroMemory((pPager), sizeof(*(pPager))); \ 78 (pPager)->Screen = (pScreen); \ 79 } while (0) 80 81 82 typedef BOOL 83 (__stdcall *PAGE_PROMPT)( 84 IN PCON_PAGER Pager, 85 IN DWORD Done, 86 IN DWORD Total); 87 88 BOOL 89 ConWritePaging( 90 IN PCON_PAGER Pager, 91 IN PAGE_PROMPT PagePrompt, 92 IN BOOL StartPaging, 93 IN PCTCH szStr, 94 IN DWORD len); 95 96 BOOL 97 ConPutsPaging( 98 IN PCON_PAGER Pager, 99 IN PAGE_PROMPT PagePrompt, 100 IN BOOL StartPaging, 101 IN PCTSTR szStr); 102 103 BOOL 104 ConResPagingEx( 105 IN PCON_PAGER Pager, 106 IN PAGE_PROMPT PagePrompt, 107 IN BOOL StartPaging, 108 IN HINSTANCE hInstance OPTIONAL, 109 IN UINT uID); 110 111 BOOL 112 ConResPaging( 113 IN PCON_PAGER Pager, 114 IN PAGE_PROMPT PagePrompt, 115 IN BOOL StartPaging, 116 IN UINT uID); 117 118 #ifdef __cplusplus 119 } 120 #endif 121 122 #endif /* __PAGER_H__ */ 123 124 /* EOF */ 125