ReactOS  0.4.12-dev-409-g9f418243
stream.h
Go to the documentation of this file.
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 
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  */
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)
52 
53 #define INVALID_CP ((UINT)-1)
54 
55 // Shadow type, implementation-specific
57 
58 // typedef INT (__stdcall *CON_READ_FUNC)(IN PCON_STREAM, IN PTCHAR, IN DWORD);
59  // Stream, szStr, len
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
83  IN PVOID Handle,
85  IN UINT CacheCodePage OPTIONAL,
86  // IN ReadWriteMode ????
87  // IN CON_READ_FUNC ReadFunc OPTIONAL,
89 
90 BOOL
93  IN PVOID Handle,
94  // IN ReadWriteMode ????
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
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
139  IN UINT CacheCodePage);
140 #endif
141 
142 HANDLE
145 
146 BOOL
149  IN HANDLE Handle);
150 
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 
156 #endif /* __STREAM_H__ */
157 
158 /* EOF */
#define IN
Definition: typedefs.h:38
BOOL ConStreamInitEx(OUT PCON_STREAM Stream, IN PVOID Handle, IN CON_STREAM_MODE Mode, IN UINT CacheCodePage OPTIONAL, IN CON_WRITE_FUNC WriteFunc OPTIONAL)
Definition: stream.c:127
_In_ ULONG Mode
Definition: hubbusif.h:303
INT(__stdcall * CON_WRITE_FUNC)(IN PCON_STREAM, IN PTCHAR, IN DWORD)
Definition: stream.h:60
#define DWORD
Definition: msvc.h:34
BOOL ConStreamSetOSHandle(IN PCON_STREAM Stream, IN HANDLE Handle)
Definition: stream.c:263
BOOL ConStreamSetMode(IN PCON_STREAM Stream, IN CON_STREAM_MODE Mode, IN UINT CacheCodePage OPTIONAL)
Definition: stream.c:195
struct _CON_STREAM * PCON_STREAM
Definition: stream.h:56
_CON_STREAM_MODE
Definition: stream.h:43
CON_STREAM csStdErr
Definition: stream.c:61
CON_STREAM csStdOut
Definition: stream.c:60
BOOL ConStreamSetCacheCodePage(IN PCON_STREAM Stream, IN UINT CacheCodePage)
Definition: stream.c:215
CON_STREAM csStdIn
Definition: stream.c:59
_In_ HANDLE Handle
Definition: extypes.h:390
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned int UINT
Definition: ndis.h:50
static const PCON_STREAM StdStreams[]
Definition: redir.c:36
#define __stdcall
Definition: typedefs.h:25
enum _CON_STREAM_MODE * PCON_STREAM_MODE
BOOL ConStreamInit(OUT PCON_STREAM Stream, IN PVOID Handle, IN CON_STREAM_MODE Mode, IN UINT CacheCodePage OPTIONAL)
Definition: stream.c:185
Definition: stream.h:45
CON_WRITE_FUNC WriteFunc
enum _CON_STREAM_MODE CON_STREAM_MODE
#define INT
Definition: msvc.h:26
#define OUT
Definition: typedefs.h:39
_Inout_opt_ PUNICODE_STRING _Inout_opt_ PUNICODE_STRING Stream
Definition: fltkernel.h:1092
char * PTCHAR
Definition: ntbasedef.h:483
HANDLE ConStreamGetOSHandle(IN PCON_STREAM Stream)
Definition: stream.c:240
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68