1/*++
2
3Copyright (c) 1998  Intel Corporation
4
5Module Name:
6
7    console.c
8
9Abstract:
10
11
12
13
14Revision History
15
16--*/
17
18#include "lib.h"
19
20
21
22VOID
23Output (
24    IN CHAR16   *Str
25    )
26// Write a string to the console at the current cursor location
27{
28    uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, Str);
29}
30
31
32VOID
33Input (
34    IN CHAR16    *Prompt OPTIONAL,
35    OUT CHAR16   *InStr,
36    IN UINTN     StrLen
37    )
38// Input a string at the current cursor location, for StrLen
39{
40    IInput (
41        ST->ConOut,
42        ST->ConIn,
43        Prompt,
44        InStr,
45        StrLen
46        );
47}
48
49VOID
50IInput (
51    IN SIMPLE_TEXT_OUTPUT_INTERFACE     *ConOut,
52    IN SIMPLE_INPUT_INTERFACE           *ConIn,
53    IN CHAR16                           *Prompt OPTIONAL,
54    OUT CHAR16                          *InStr,
55    IN UINTN                            StrLen
56    )
57// Input a string at the current cursor location, for StrLen
58{
59    EFI_INPUT_KEY                   Key;
60    EFI_STATUS                      Status;
61    UINTN                           Len;
62
63    if (Prompt) {
64        ConOut->OutputString (ConOut, Prompt);
65    }
66
67    Len = 0;
68    for (; ;) {
69        WaitForSingleEvent (ConIn->WaitForKey, 0);
70
71        Status = uefi_call_wrapper(ConIn->ReadKeyStroke, 2, ConIn, &Key);
72        if (EFI_ERROR(Status)) {
73            DEBUG((D_ERROR, "Input: error return from ReadKey %x\n", Status));
74            break;
75        }
76
77        if (Key.UnicodeChar == '\n' ||
78            Key.UnicodeChar == '\r') {
79            break;
80        }
81
82        if (Key.UnicodeChar == '\b') {
83            if (Len) {
84                uefi_call_wrapper(ConOut->OutputString, 2, ConOut, L"\b \b");
85                Len -= 1;
86            }
87            continue;
88        }
89
90        if (Key.UnicodeChar >= ' ') {
91            if (Len < StrLen-1) {
92                InStr[Len] = Key.UnicodeChar;
93
94                InStr[Len+1] = 0;
95                uefi_call_wrapper(ConOut->OutputString, 2, ConOut, &InStr[Len]);
96
97                Len += 1;
98            }
99            continue;
100        }
101    }
102
103    InStr[Len] = 0;
104}
105