Reactos
at master 177 lines 5.0 kB view raw
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 36extern "C" { 37#endif 38 39/* 40 * See http://archives.miloush.net/michkap/archive/2009/08/14/9869928.html 41 * for more information. 42 */ 43typedef 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 56typedef 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 63typedef 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! 73extern CON_STREAM StdStreams[3]; 74#define StdIn (&StdStreams[0]) 75#define StdOut (&StdStreams[1]) 76#define StdErr (&StdStreams[2]) 77#else 78extern CON_STREAM csStdIn; 79extern CON_STREAM csStdOut; 80extern CON_STREAM csStdErr; 81#define StdIn (&csStdIn ) 82#define StdOut (&csStdOut) 83#define StdErr (&csStdErr) 84#endif 85 86BOOL 87ConStreamInitEx( 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 96BOOL 97ConStreamInit( 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) \ 108do { \ 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) \ 115do { \ 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 */ 132BOOL 133ConStreamSetMode( 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 147BOOL 148ConStreamSetCacheCodePage( 149 IN PCON_STREAM Stream, 150 IN UINT CacheCodePage); 151 152#define ConStdStreamsSetCacheCodePage(InputCodePage, OutputCodePage) \ 153do { \ 154 ConStreamSetCacheCodePage(StdIn , (InputCodePage )); \ 155 ConStreamSetCacheCodePage(StdOut, (OutputCodePage)); \ 156 ConStreamSetCacheCodePage(StdErr, (OutputCodePage)); \ 157} while(0) 158 159#endif /* defined(USE_CRT) */ 160 161HANDLE 162ConStreamGetOSHandle( 163 IN PCON_STREAM Stream); 164 165BOOL 166ConStreamSetOSHandle( 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 */