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