1 /*++
2
3 Copyright (c) 1998 Intel Corporation
4
5 Module Name:
6
7 console.c
8
9 Abstract:
10
11
12
13
14 Revision History
15
16 --*/
17
18 #include "lib.h"
19
20
21
22 VOID
Output(IN CHAR16 * Str)23 Output (
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
32 VOID
Input(IN CHAR16 * Prompt OPTIONAL,OUT CHAR16 * InStr,IN UINTN StrLen)33 Input (
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
49 VOID
IInput(IN SIMPLE_TEXT_OUTPUT_INTERFACE * ConOut,IN SIMPLE_INPUT_INTERFACE * ConIn,IN CHAR16 * Prompt OPTIONAL,OUT CHAR16 * InStr,IN UINTN StrLen)50 IInput (
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