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)(IN PCON_STREAM, IN PTCHAR, IN DWORD); 59 // Stream, szStr, len 60 typedef INT (__stdcall *CON_WRITE_FUNC)(IN PCON_STREAM, IN PTCHAR, IN DWORD); 61 62 /* 63 * Standard console streams, initialized by 64 * calls to ConStreamInit/ConInitStdStreams. 65 */ 66 #if 0 // FIXME! 67 extern CON_STREAM StdStreams[3]; 68 #define StdIn (&StdStreams[0]) 69 #define StdOut (&StdStreams[1]) 70 #define StdErr (&StdStreams[2]) 71 #else 72 extern CON_STREAM csStdIn; 73 extern CON_STREAM csStdOut; 74 extern CON_STREAM csStdErr; 75 #define StdIn (&csStdIn ) 76 #define StdOut (&csStdOut) 77 #define StdErr (&csStdErr) 78 #endif 79 80 BOOL 81 ConStreamInitEx( 82 OUT PCON_STREAM Stream, 83 IN PVOID Handle, 84 IN CON_STREAM_MODE Mode, 85 IN UINT CacheCodePage OPTIONAL, 86 // IN ReadWriteMode ???? 87 // IN CON_READ_FUNC ReadFunc OPTIONAL, 88 IN CON_WRITE_FUNC WriteFunc OPTIONAL); 89 90 BOOL 91 ConStreamInit( 92 OUT PCON_STREAM Stream, 93 IN PVOID Handle, 94 // IN ReadWriteMode ???? 95 IN CON_STREAM_MODE Mode, 96 IN UINT CacheCodePage OPTIONAL); 97 98 99 /* Console Standard Streams initialization helpers */ 100 #ifdef USE_CRT 101 #define ConInitStdStreamsAndMode(Mode, CacheCodePage) \ 102 do { \ 103 ConStreamInit(StdIn , stdin , (Mode), (CacheCodePage)); \ 104 ConStreamInit(StdOut, stdout, (Mode), (CacheCodePage)); \ 105 ConStreamInit(StdErr, stderr, (Mode), (CacheCodePage)); \ 106 } while(0) 107 #else 108 #define ConInitStdStreamsAndMode(Mode, CacheCodePage) \ 109 do { \ 110 ConStreamInit(StdIn , GetStdHandle(STD_INPUT_HANDLE) , (Mode), (CacheCodePage)); \ 111 ConStreamInit(StdOut, GetStdHandle(STD_OUTPUT_HANDLE), (Mode), (CacheCodePage)); \ 112 ConStreamInit(StdErr, GetStdHandle(STD_ERROR_HANDLE) , (Mode), (CacheCodePage)); \ 113 } while(0) 114 #endif /* defined(USE_CRT) */ 115 116 /* 117 * Use ANSI by default for file output, with no cached code page. 118 * Note that setting the stream mode to AnsiText and the code page value 119 * to CP_UTF8 sets the stream to UTF8 mode, and has the same effect as if 120 * the stream mode UTF8Text had been specified instead. 121 */ 122 #define ConInitStdStreams() \ 123 ConInitStdStreamsAndMode(AnsiText, INVALID_CP) 124 125 /* Stream translation modes */ 126 BOOL 127 ConStreamSetMode( 128 IN PCON_STREAM Stream, 129 IN CON_STREAM_MODE Mode, 130 IN UINT CacheCodePage OPTIONAL); 131 132 #ifdef USE_CRT 133 // FIXME! 134 #warning The ConStreamSetCacheCodePage function does not make much sense with the CRT! 135 #else 136 BOOL 137 ConStreamSetCacheCodePage( 138 IN PCON_STREAM Stream, 139 IN UINT CacheCodePage); 140 #endif 141 142 HANDLE 143 ConStreamGetOSHandle( 144 IN PCON_STREAM Stream); 145 146 BOOL 147 ConStreamSetOSHandle( 148 IN PCON_STREAM Stream, 149 IN HANDLE Handle); 150 151 152 #ifdef __cplusplus 153 } 154 #endif 155 156 #endif /* __STREAM_H__ */ 157 158 /* EOF */ 159