- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-HBufferImageDoCharInput (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- ASCII key + Backspace + return\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_LOAD_ERROR\r
- EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- switch (Char) {\r
- case 0:\r
- break;\r
-\r
- case 0x08:\r
- Status = HBufferImageDoBackspace ();\r
- break;\r
-\r
- case 0x09:\r
- case 0x0a:\r
- case 0x0d:\r
- //\r
- // Tabs, Returns are thought as nothing\r
- //\r
- break;\r
-\r
- default:\r
- //\r
- // DEAL WITH ASCII CHAR, filter out thing like ctrl+f\r
- //\r
- if (Char > 127 || Char < 32) {\r
- Status = StatusBarSetStatusString (L"Unknown Command");\r
- } else {\r
- Status = HBufferImageAddChar (Char);\r
- }\r
-\r
- break;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-INTN\r
-HBufferImageCharToHex (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- change char to int value based on Hex\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- int value;\r
-\r
-\r
---*/\r
-{\r
- //\r
- // change the character to hex\r
- //\r
- if (Char >= L'0' && Char <= L'9') {\r
- return (INTN) (Char - L'0');\r
- }\r
-\r
- if (Char >= L'a' && Char <= L'f') {\r
- return (INTN) (Char - L'a' + 10);\r
- }\r
-\r
- if (Char >= L'A' && Char <= L'F') {\r
- return (INTN) (Char - L'A' + 10);\r
- }\r
-\r
- return -1;\r
-}\r
-\r
-EFI_STATUS\r
-HBufferImageAddChar (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Add character\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
- HEFI_EDITOR_LINE *Line;\r
- HEFI_EDITOR_LINE *NewLine;\r
- INTN Value;\r
- UINT8 Old;\r
- UINTN FRow;\r
- UINTN FCol;\r
- BOOLEAN High;\r
-\r
- Value = HBufferImageCharToHex (Char);\r
-\r
- //\r
- // invalid input\r
- //\r
- if (Value == -1) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Line = HBufferImage.CurrentLine;\r
- FRow = HBufferImage.BufferPosition.Row;\r
- FCol = HBufferImage.BufferPosition.Column;\r
- High = HBufferImage.HighBits;\r
-\r
- //\r
- // only needs to refresh current line\r
- //\r
- HBufferImageOnlyLineNeedRefresh = TRUE;\r
-\r
- //\r
- // not a full line and beyond the last character\r
- //\r
- if (FCol > Line->Size) {\r
- //\r
- // cursor always at high 4 bits\r
- // and always put input to the low 4 bits\r
- //\r
- Line->Buffer[Line->Size] = (UINT8) Value;\r
- Line->Size++;\r
- High = FALSE;\r
- } else {\r
-\r
- Old = Line->Buffer[FCol - 1];\r
-\r
- //\r
- // always put the input to the low 4 bits\r
- //\r
- Old = (UINT8) (Old & 0x0f);\r
- Old = (UINT8) (Old << 4);\r
- Old = (UINT8) (Value + Old);\r
- Line->Buffer[FCol - 1] = Old;\r
-\r
- //\r
- // at the low 4 bits of the last character of a full line\r
- // so if no next line, need to create a new line\r
- //\r
- if (High == FALSE && FCol == 0x10) {\r
-\r
- HBufferImageOnlyLineNeedRefresh = FALSE;\r
- HBufferImageNeedRefresh = TRUE;\r