Ticket #2189: read-vs-readfile.c

File read-vs-readfile.c, 1.1 KB (added by Deewiant, 9 years ago)

read vs. ReadFile: handling of enter varies

Line 
1#include <io.h>
2#include <stdio.h>
3#include <windows.h>
4void perrorWin32();
5
6int main() {
7        char buf[1];
8        HANDLE hStdin;
9        DWORD mode;
10        DWORD got;
11
12        // Setting terminal to raw mode...
13        hStdin = GetStdHandle(STD_INPUT_HANDLE);
14
15        if (GetFileType(hStdin) == FILE_TYPE_CHAR) {
16                GetConsoleMode(hStdin, &mode);
17                if (
18                        !SetConsoleMode(
19                                hStdin,
20                                mode & ~(ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT))
21                ) {
22                        perrorWin32();
23                        return 1;
24                }
25        }
26
27        // Using a POSIX API
28
29        got = read(0, buf, 1);
30        if (got < 0)
31                perror(NULL);
32        else if (got == 0)
33                printf("Got nothing\n");
34        else
35                printf("'%c' %d\n", buf[0], buf[0]);
36
37        // Using the Windows API
38
39        if (!ReadFile(hStdin, buf, 1, &got, NULL))
40                perrorWin32();
41        else if (got < 1)
42                printf("Got nothing\n");
43        else
44                printf("'%c' %d\n", buf[0], buf[0]);
45
46        return 0;
47}
48
49void perrorWin32() {
50        LPTSTR message;
51        DWORD err = GetLastError();
52
53        FormatMessage(
54                FORMAT_MESSAGE_ALLOCATE_BUFFER |
55                FORMAT_MESSAGE_FROM_SYSTEM |
56                FORMAT_MESSAGE_IGNORE_INSERTS,
57                NULL,
58                err,
59                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
60                (LPTSTR)&message,
61                0, NULL);
62
63        printf("error code %lu: %s", err, message);
64        LocalFree(message);
65}