[CRT] Remove useless #undef abort from process.h
[reactos.git] / sdk / lib / conutils / stream.h
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 */