xref: /DragonStub/lib/console.c (revision b95f138fa1550040e68ac3dd34cfce7d148d7984)
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
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
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
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