1 /* 2 * PROJECT: ReactOS Console Utilities Library 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Provides basic abstraction wrappers around CRT streams or 5 * Win32 console API I/O functions, to deal with i18n + Unicode 6 * related problems. 7 * COPYRIGHT: Copyright 2017-2018 ReactOS Team 8 * Copyright 2017-2018 Hermes Belusca-Maito 9 */ 10 11 /** 12 * @file stream.h 13 * @ingroup ConUtils 14 * 15 * @brief Console I/O streams 16 **/ 17 18 #ifndef __STREAM_H__ 19 #define __STREAM_H__ 20 21 #pragma once 22 23 /* 24 * Enable this define if you want to only use CRT functions to output 25 * UNICODE stream to the console, as in the way explained by 26 * http://archives.miloush.net/michkap/archive/2008/03/18/8306597.html 27 */ 28 /** NOTE: Experimental! Don't use USE_CRT yet because output to console is a bit broken **/ 29 // #define USE_CRT 30 31 #ifndef _UNICODE 32 #error The ConUtils library at the moment only supports compilation with _UNICODE defined! 33 #endif 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* 40 * See http://archives.miloush.net/michkap/archive/2009/08/14/9869928.html 41 * for more information. 42 */ 43 typedef enum _CON_STREAM_MODE 44 { 45 Binary = 0, // #define _O_BINARY 0x8000 // file mode is binary (untranslated) 46 // #define _O_RAW _O_BINARY 47 AnsiText, // #define _O_TEXT 0x4000 // file mode is text (translated) -- "ANSI" 48 WideText, // #define _O_WTEXT 0x10000 // file mode is UTF16 with BOM (translated) -- "Unicode" of Windows 49 UTF16Text, // #define _O_U16TEXT 0x20000 // file mode is UTF16 no BOM (translated) -- "" "" 50 UTF8Text, // #define _O_U8TEXT 0x40000 // file mode is UTF8 no BOM (translated) 51 } CON_STREAM_MODE, *PCON_STREAM_MODE; 52 53 #define INVALID_CP ((UINT)-1) 54 55 // Shadow type, implementation-specific 56 typedef struct _CON_STREAM CON_STREAM, *PCON_STREAM; 57 58 // typedef INT (__stdcall *CON_READ_FUNC)( 59 // IN PCON_STREAM Stream, 60 // OUT PTCHAR szStr, 61 // IN OUT PDWORD len); 62 63 typedef INT (__stdcall *CON_WRITE_FUNC)( 64 IN PCON_STREAM Stream, 65 IN PCTCH szStr, 66 IN DWORD len); 67 68 /* 69 * Standard console streams, initialized by 70 * calls to ConStreamInit/ConInitStdStreams. 71 */ 72 #if 0 // FIXME! 73 extern CON_STREAM StdStreams[3]; 74 #define StdIn (&StdStreams[0]) 75 #define StdOut (&StdStreams[1]) 76 #define StdErr (&StdStreams[2]) 77 #else 78 extern CON_STREAM csStdIn; 79 extern CON_STREAM csStdOut; 80 extern CON_STREAM csStdErr; 81 #define StdIn (&csStdIn ) 82 #define StdOut (&csStdOut) 83 #define StdErr (&csStdErr) 84 #endif 85 86 BOOL 87 ConStreamInitEx( 88 OUT PCON_STREAM Stream, 89 IN PVOID Handle, 90 IN CON_STREAM_MODE Mode, 91 IN UINT CacheCodePage OPTIONAL, 92 // IN ReadWriteMode ???? 93 // IN CON_READ_FUNC ReadFunc OPTIONAL, 94 IN CON_WRITE_FUNC WriteFunc OPTIONAL); 95 96 BOOL 97 ConStreamInit( 98 OUT PCON_STREAM Stream, 99 IN PVOID Handle, 100 // IN ReadWriteMode ???? 101 IN CON_STREAM_MODE Mode, 102 IN UINT CacheCodePage OPTIONAL); 103 104 105 /* Console Standard Streams initialization helpers */ 106 #ifdef USE_CRT 107 #define ConInitStdStreamsAndMode(Mode, CacheCodePage) \ 108 do { \ 109 ConStreamInit(StdIn , stdin , (Mode), (CacheCodePage)); \ 110 ConStreamInit(StdOut, stdout, (Mode), (CacheCodePage)); \ 111 ConStreamInit(StdErr, stderr, (Mode), (CacheCodePage)); \ 112 } while(0) 113 #else 114 #define ConInitStdStreamsAndMode(Mode, CacheCodePage) \ 115 do { \ 116 ConStreamInit(StdIn , GetStdHandle(STD_INPUT_HANDLE) , (Mode), (CacheCodePage)); \ 117 ConStreamInit(StdOut, GetStdHandle(STD_OUTPUT_HANDLE), (Mode), (CacheCodePage)); \ 118 ConStreamInit(StdErr, GetStdHandle(STD_ERROR_HANDLE) , (Mode), (CacheCodePage)); \ 119 } while(0) 120 #endif /* defined(USE_CRT) */ 121 122 /* 123 * Use ANSI by default for file output, with no cached code page. 124 * Note that setting the stream mode to AnsiText and the code page value 125 * to CP_UTF8 sets the stream to UTF8 mode, and has the same effect as if 126 * the stream mode UTF8Text had been specified instead. 127 */ 128 #define ConInitStdStreams() \ 129 ConInitStdStreamsAndMode(AnsiText, INVALID_CP) 130 131 /* Stream translation modes */ 132 BOOL 133 ConStreamSetMode( 134 IN PCON_STREAM Stream, 135 IN CON_STREAM_MODE Mode, 136 IN UINT CacheCodePage OPTIONAL); 137 138 #ifdef USE_CRT 139 140 // FIXME! 141 #warning The ConStreamSetCacheCodePage function does not make much sense with the CRT! 142 143 #define ConStdStreamsSetCacheCodePage(InputCodePage, OutputCodePage) NOTHING 144 145 #else 146 147 BOOL 148 ConStreamSetCacheCodePage( 149 IN PCON_STREAM Stream, 150 IN UINT CacheCodePage); 151 152 #define ConStdStreamsSetCacheCodePage(InputCodePage, OutputCodePage) \ 153 do { \ 154 ConStreamSetCacheCodePage(StdIn , (InputCodePage )); \ 155 ConStreamSetCacheCodePage(StdOut, (OutputCodePage)); \ 156 ConStreamSetCacheCodePage(StdErr, (OutputCodePage)); \ 157 } while(0) 158 159 #endif /* defined(USE_CRT) */ 160 161 HANDLE 162 ConStreamGetOSHandle( 163 IN PCON_STREAM Stream); 164 165 BOOL 166 ConStreamSetOSHandle( 167 IN PCON_STREAM Stream, 168 IN HANDLE Handle); 169 170 171 #ifdef __cplusplus 172 } 173 #endif 174 175 #endif /* __STREAM_H__ */ 176 177 /* EOF */ 178