Release 970914
[wine] / win32 / console.c
1 /*
2  * Win32 kernel functions
3  *
4  * Copyright 1995 Martin von Loewis and Cameron Heide
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "windows.h"
10 #include "winerror.h"
11 #include "wincon.h"
12 #include "heap.h"
13 #include "xmalloc.h"
14 #include "stddebug.h"
15 #include "debug.h"
16
17 static CONSOLE_SCREEN_BUFFER_INFO dummyinfo =
18 {
19     {80, 24},
20     {0, 0},
21     0,
22     {0, 0, 79, 23},
23     {80, 24}
24 };
25
26 /***********************************************************************
27  *           SetConsoleCtrlHandler               (KERNEL32.459)
28  */
29 BOOL32 WINAPI SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL32 a)
30 {
31         return 0;
32 }
33
34 /***********************************************************************
35  *           GetConsoleScreenBufferInfo   (KERNEL32.190)
36  */
37 BOOL32 WINAPI GetConsoleScreenBufferInfo( HANDLE32 hConsoleOutput,
38                                           LPCONSOLE_SCREEN_BUFFER_INFO csbi )
39 {
40     csbi->dwSize.x = 80;
41     csbi->dwSize.y = 24;
42     csbi->dwCursorPosition.x = 0;
43     csbi->dwCursorPosition.y = 0;
44     csbi->wAttributes = 0;
45     csbi->srWindow.Left = 0;
46     csbi->srWindow.Right        = 79;
47     csbi->srWindow.Top  = 0;
48     csbi->srWindow.Bottom       = 23;
49     csbi->dwMaximumWindowSize.x = 80;
50     csbi->dwMaximumWindowSize.y = 24;
51     return TRUE;
52 }
53
54 /***********************************************************************
55  *            GetLargestConsoleWindowSize   (KERNEL32.226)
56  */
57 DWORD WINAPI GetLargestConsoleWindowSize( HANDLE32 hConsoleOutput )
58 {
59     return (DWORD)MAKELONG(dummyinfo.dwMaximumWindowSize.x,dummyinfo.dwMaximumWindowSize.y);
60 }
61
62 /***********************************************************************
63  *            GetConsoleCP   (KERNEL32.226)
64  */
65 UINT32 WINAPI GetConsoleCP(VOID)
66 {
67     return GetACP();
68 }
69
70 /***********************************************************************
71  *            GetConsoleOutputCP   (KERNEL32.189)
72  */
73 UINT32 WINAPI GetConsoleOutputCP(VOID)
74 {
75     return GetConsoleCP();
76 }
77
78 /***********************************************************************
79  *            GetConsoleMode   (KERNEL32.188)
80  */
81 BOOL32 WINAPI GetConsoleMode(HANDLE32 hcon,LPDWORD mode)
82 {
83         *mode =         ENABLE_PROCESSED_INPUT  |
84                         ENABLE_LINE_INPUT       |
85                         ENABLE_ECHO_INPUT       |
86                         ENABLE_WINDOW_INPUT     |
87                         ENABLE_MOUSE_INPUT;
88         return TRUE;
89 }
90
91 /***********************************************************************
92  *            SetConsoleMode   (KERNEL32.188)
93  */
94 BOOL32 WINAPI SetConsoleMode(HANDLE32 hcon,DWORD mode)
95 {
96     fprintf(stdnimp,"SetConsoleMode(%08x,%08lx)\n",hcon,mode);
97     return TRUE;
98 }
99
100 /***********************************************************************
101  *            GetConsoleTitleA   (KERNEL32.191)
102  */
103 DWORD WINAPI GetConsoleTitle32A(LPSTR title,DWORD size)
104 {
105     lstrcpyn32A(title,"Console",size);
106     return strlen("Console");
107 }
108
109 /***********************************************************************
110  *            GetConsoleTitleW   (KERNEL32.192)
111  */
112 DWORD WINAPI GetConsoleTitle32W(LPWSTR title,DWORD size)
113 {
114     lstrcpynAtoW(title,"Console",size);
115     return strlen("Console");
116 }
117
118 /***********************************************************************
119  *            WriteConsoleA   (KERNEL32.567)
120  */
121 BOOL32 WINAPI WriteConsole32A( HANDLE32 hConsoleOutput,
122                                LPVOID lpBuffer,
123                                DWORD nNumberOfCharsToWrite,
124                                LPDWORD lpNumberOfCharsWritten,
125                                LPVOID lpReserved )
126 {
127         LPSTR   buf = (LPSTR)xmalloc(nNumberOfCharsToWrite+1);
128
129         lstrcpyn32A(buf,lpBuffer,nNumberOfCharsToWrite);
130         buf[nNumberOfCharsToWrite]=0;
131         fprintf(stderr,"%s",buf);
132         free(buf);
133         *lpNumberOfCharsWritten=nNumberOfCharsToWrite;
134         return TRUE;
135 }
136
137 /***********************************************************************
138  *            WriteConsoleW   (KERNEL32.577)
139  */
140 BOOL32 WINAPI WriteConsole32W( HANDLE32 hConsoleOutput,
141                                LPVOID lpBuffer,
142                                DWORD nNumberOfCharsToWrite,
143                                LPDWORD lpNumberOfCharsWritten,
144                                LPVOID lpReserved )
145 {
146         LPSTR   buf = (LPSTR)xmalloc(2*nNumberOfCharsToWrite+1);
147
148         lstrcpynWtoA(buf,lpBuffer,nNumberOfCharsToWrite);
149         buf[nNumberOfCharsToWrite]=0;
150         fprintf(stderr,"%s",buf);
151         free(buf);
152         *lpNumberOfCharsWritten=nNumberOfCharsToWrite;
153         return TRUE;
154 }
155
156 /***********************************************************************
157  *            ReadConsoleA   (KERNEL32.419)
158  */
159 BOOL32 WINAPI ReadConsole32A( HANDLE32 hConsoleInput,
160                               LPVOID lpBuffer,
161                               DWORD nNumberOfCharsToRead,
162                               LPDWORD lpNumberOfCharsRead,
163                               LPVOID lpReserved )
164 {
165         fgets(lpBuffer,nNumberOfCharsToRead,stdin);
166         *lpNumberOfCharsRead = strlen(lpBuffer);
167         return TRUE;
168 }
169
170 /***********************************************************************
171  *            ReadConsoleW   (KERNEL32.427)
172  */
173 BOOL32 WINAPI ReadConsole32W( HANDLE32 hConsoleInput,
174                               LPVOID lpBuffer,
175                               DWORD nNumberOfCharsToRead,
176                               LPDWORD lpNumberOfCharsRead,
177                               LPVOID lpReserved )
178 {
179         LPSTR   buf = (LPSTR)xmalloc(nNumberOfCharsToRead);
180
181         fgets(buf,nNumberOfCharsToRead,stdin);
182         lstrcpynAtoW(lpBuffer,buf,nNumberOfCharsToRead);
183         *lpNumberOfCharsRead = strlen(buf);
184         return TRUE;
185 }
186
187 /***********************************************************************
188  *            SetConsoleTitle32A   (KERNEL32.476)
189  */
190 BOOL32 WINAPI SetConsoleTitle32A(LPCSTR title)
191 {
192     fprintf(stderr,"SetConsoleTitle(%s)\n",title);
193     return TRUE;
194 }
195
196 /***********************************************************************
197  *            SetConsoleTitle32W   (KERNEL32.477)
198  */
199 BOOL32 WINAPI SetConsoleTitle32W( LPCWSTR title )
200 {
201     LPSTR titleA = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
202     fprintf(stderr,"SetConsoleTitle(%s)\n",titleA);
203     HeapFree( GetProcessHeap(), 0, titleA );
204     return TRUE;
205 }
206
207 /***********************************************************************
208  *            FlushConsoleInputBuffer   (KERNEL32.132)
209  */
210 BOOL32 WINAPI FlushConsoleInputBuffer(HANDLE32 hConsoleInput){
211     fprintf(stderr,"FlushConsoleInputBuffer(%d)\n",hConsoleInput);
212     return TRUE;
213 }
214
215 BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32 hcons,COORD c)
216 {
217     /* x are columns, y rows */
218     if (!c.y) {
219         fprintf(stderr,"\r");
220         if (c.x)
221                 fprintf(stderr,"\e[%dC",c.x);
222         return TRUE;
223     }
224     /* handle rest of the cases */
225     return FALSE;
226 }
227
228 /***********************************************************************
229  *            GetNumberOfConsoleInputEvents   (KERNEL32.246)
230  */
231 BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents)
232 {
233         *nrofevents = 1;
234         return TRUE;
235 }