xref: /reactos/sdk/lib/conutils/stream.h (revision 9393fc32)
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