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