]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c
add comments to function declarations and definitions and updated to match coding...
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / BufferImage.c
index 60e0b75435adad5fa3125074fc9fd64458af5b37..469642245d0e704c258e1098f5c495264bf7f000 100644 (file)
@@ -74,26 +74,16 @@ BOOLEAN                           HBufferImageOnlyLineNeedRefresh;
 \r
 BOOLEAN                           HBufferImageMouseNeedRefresh;\r
 \r
+/**\r
+  Initialization function for HBufferImage\r
+\r
+  @retval EFI_SUCCESS       The operation was successful.\r
+  @retval EFI_LOAD_ERROR    A load error occured.\r
+**/\r
 EFI_STATUS\r
 HBufferImageInit (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Initialization function for HBufferImage\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-  EFI_LOAD_ERROR\r
-\r
---*/\r
 {\r
   EFI_STATUS  Status;\r
 \r
@@ -147,28 +137,16 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Backup function for HBufferImage. Only a few fields need to be backup. \r
+  This is for making the file buffer refresh as few as possible.\r
+\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageBackup (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Backup function for HBufferImage\r
-  Only a few fields need to be backup. \r
-  This is for making the file buffer refresh \r
-  as few as possible.\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HBufferImageBackupVar.MousePosition   = HBufferImage.MousePosition;\r
 \r
@@ -203,30 +181,20 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageFreeLines (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Free all the lines in HBufferImage\r
+/**\r
+  Free all the lines in HBufferImage.\r
     Fields affected:\r
     Lines\r
     CurrentLine\r
     NumLines\r
     ListHead \r
 \r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
+EFI_STATUS\r
+HBufferImageFreeLines (\r
+  VOID\r
+  )\r
 {\r
   HFreeLines (HBufferImage.ListHead, HBufferImage.Lines);\r
 \r
@@ -237,25 +205,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Cleanup function for HBufferImage\r
+\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageCleanup (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Cleanup function for HBufferImage\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   EFI_STATUS  Status;\r
 \r
@@ -269,12 +227,22 @@ Returns:
 \r
   HFileImageCleanup ();\r
   HDiskImageCleanup ();\r
-  HMemImageCleanup ();\r
 \r
   return Status;\r
 \r
 }\r
 \r
+/**\r
+  Print Line on Row\r
+\r
+  @param[in] Line     The lline to print.\r
+  @param[in] Row      The row on screen ( begin from 1 ).\r
+  @param[in] FRow     The FRow.\r
+  @param[in] Orig     The original color.\r
+  @param[in] New      The color to print with.\r
+\r
+  @retval EFI_SUCCESS The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImagePrintLine (\r
   IN HEFI_EDITOR_LINE           *Line,\r
@@ -284,25 +252,6 @@ HBufferImagePrintLine (
   IN HEFI_EDITOR_COLOR_UNION    New\r
 \r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Print Line on Row\r
-\r
-Arguments:  \r
-\r
-  Line - Line to print\r
-  Row  - Row on screen ( begin from 1 )\r
-  FRow - FRow\r
-  Orig - Orig\r
-  New  - Light display\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
 \r
   UINTN   Index;\r
@@ -345,7 +294,7 @@ Returns:
 \r
   }\r
 \r
-  if (HEditorMouseAction == FALSE) {\r
+  if (!HEditorMouseAction) {\r
     ShellPrintEx (\r
       0,\r
       (INT32)Row - 1,\r
@@ -432,7 +381,7 @@ Returns:
   //\r
   // PRINT the buffer content\r
   //\r
-  if (HEditorMouseAction == FALSE) {\r
+  if (!HEditorMouseAction) {\r
     for (Index = 0; Index < 0x10 && Index < Line->Size; Index++) {\r
       Pos = ASCII_POSITION + Index;\r
 \r
@@ -471,6 +420,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Function to decide if a column number is stored in the high bits.\r
+\r
+  @param[in] Column     The column to examine.\r
+  @param[out] FCol      The actual column number.\r
+\r
+  @retval TRUE      The actual column was in high bits and is now in FCol.\r
+  @retval FALSE     There was not a column number in the high bits.\r
+**/\r
 BOOLEAN\r
 HBufferImageIsAtHighBits (\r
   IN  UINTN Column,\r
@@ -494,7 +452,7 @@ HBufferImageIsAtHighBits (
 \r
   *FCol = (Column / 3) + 1;\r
 \r
-  if (!(Column % 3)) {\r
+  if (Column % 3 == 0) {\r
     return TRUE;\r
   }\r
 \r
@@ -505,6 +463,15 @@ HBufferImageIsAtHighBits (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Decide if a point is in the already selected area.\r
+\r
+  @param[in] MouseRow     The row of the point to test.\r
+  @param[in] MouseCol     The col of the point to test.\r
+\r
+  @retval TRUE      The point is in the selected area.\r
+  @retval FALSE     The point is not in the selected area.\r
+**/\r
 BOOLEAN\r
 HBufferImageIsInSelectedArea (\r
   IN UINTN MouseRow,\r
@@ -567,6 +534,11 @@ HBufferImageIsInSelectedArea (
   return TRUE;\r
 }\r
 \r
+/**\r
+  Set mouse position according to HBufferImage.MousePosition.\r
+\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageRestoreMousePosition (\r
   VOID\r
@@ -637,7 +609,7 @@ HBufferImageRestoreMousePosition (
         CurrentLine = HBufferImage.CurrentLine;\r
         Line        = HMoveLine (FRow - HBufferImage.BufferPosition.Row);\r
 \r
-        if (FColumn > Line->Size) {\r
+        if (Line == NULL || FColumn > Line->Size) {\r
           HasCharacter = FALSE;\r
         }\r
 \r
@@ -691,7 +663,7 @@ HBufferImageRestoreMousePosition (
         CurrentLine = HBufferImage.CurrentLine;\r
         Line        = HMoveLine (FRow - HBufferImage.BufferPosition.Row);\r
 \r
-        if (FColumn > Line->Size) {\r
+        if (Line == NULL || FColumn > Line->Size) {\r
           HasCharacter = FALSE;\r
         }\r
 \r
@@ -734,25 +706,15 @@ HBufferImageRestoreMousePosition (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Set cursor position according to HBufferImage.DisplayPosition.\r
+\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageRestorePosition (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Set cursor position according to HBufferImage.DisplayPosition.\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   //\r
   // set cursor position\r
@@ -766,26 +728,17 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Refresh function for HBufferImage.\r
+\r
+  @retval EFI_SUCCESS     The operation was successful.\r
+  @retval EFI_LOAD_ERROR  A Load error occured.\r
+\r
+**/\r
 EFI_STATUS\r
 HBufferImageRefresh (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Refresh function for HBufferImage\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-  EFI_LOAD_ERROR \r
-\r
---*/\r
 {\r
   LIST_ENTRY          *Link;\r
   HEFI_EDITOR_LINE        *Line;\r
@@ -811,8 +764,8 @@ Returns:
     // no definite required refresh\r
     // and file position displayed on screen has not been changed\r
     //\r
-    if (HBufferImageNeedRefresh == FALSE &&\r
-        HBufferImageOnlyLineNeedRefresh == FALSE &&\r
+    if (!HBufferImageNeedRefresh &&\r
+        !HBufferImageOnlyLineNeedRefresh &&\r
         HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow\r
         ) {\r
       HBufferImageRestoreMousePosition ();\r
@@ -826,7 +779,7 @@ Returns:
   //\r
   // only need to refresh current line\r
   //\r
-  if (HBufferImageOnlyLineNeedRefresh == TRUE && HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow) {\r
+  if (HBufferImageOnlyLineNeedRefresh && HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow) {\r
 \r
     HBufferImagePrintLine (\r
       HBufferImage.CurrentLine,\r
@@ -917,7 +870,7 @@ Returns:
     } while (Link != HBufferImage.ListHead && Row <= EndRow);\r
 \r
     while (Row <= EndRow) {\r
-      HEditorClearLine (Row);\r
+      EditorClearLine (Row, HMainEditor.ScreenSize.Column, HMainEditor.ScreenSize.Row);\r
       Row++;\r
     }\r
     //\r
@@ -935,7 +888,22 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Read an image into a buffer friom a source.\r
+\r
+  @param[in] FileName     Pointer to the file name.  OPTIONAL and ignored if not FileTypeFileBuffer.\r
+  @param[in] DiskName     Pointer to the disk name.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] DiskOffset   Offset into the disk.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] DiskSize     Size of the disk buffer.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] MemOffset    Offset into the Memory.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
+  @param[in] MemSize      Size of the Memory buffer.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
+  @param[in] BufferType   The type of buffer to save.  IGNORED.\r
+  @param[in] Recover      TRUE for recovermode, FALSE otherwise.\r
+\r
+  @return EFI_SUCCESS     The operation was successful.\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 HBufferImageRead (\r
   IN CONST CHAR16                   *FileName,\r
   IN CONST CHAR16                   *DiskName,\r
@@ -985,6 +953,19 @@ HBufferImageRead (
   return Status;\r
 }\r
 \r
+/**\r
+  Save the current image.\r
+\r
+  @param[in] FileName     Pointer to the file name.  OPTIONAL and ignored if not FileTypeFileBuffer.\r
+  @param[in] DiskName     Pointer to the disk name.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] DiskOffset   Offset into the disk.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] DiskSize     Size of the disk buffer.  OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+  @param[in] MemOffset    Offset into the Memory.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
+  @param[in] MemSize      Size of the Memory buffer.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
+  @param[in] BufferType   The type of buffer to save.  IGNORED.\r
+\r
+  @return EFI_SUCCESS     The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageSave (\r
   IN CHAR16                         *FileName,\r
@@ -1035,29 +1016,20 @@ HBufferImageSave (
   return Status;\r
 }\r
 \r
-HEFI_EDITOR_LINE *\r
-HBufferImageCreateLine (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Create a new line and append it to the line list\r
+/**\r
+  Create a new line and append it to the line list.\r
     Fields affected:\r
     NumLines\r
     Lines \r
 \r
-Arguments:  \r
-\r
-  None\r
+  @retval NULL    create line failed.\r
+  @return         the line created.\r
 \r
-Returns:  \r
-\r
-  NULL -- create line failed\r
-  Not NULL -- the line created\r
-\r
---*/\r
+**/\r
+HEFI_EDITOR_LINE *\r
+HBufferImageCreateLine (\r
+  VOID\r
+  )\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
 \r
@@ -1091,26 +1063,15 @@ Returns:
   return Line;\r
 }\r
 \r
+/**\r
+  Free the current image.\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageFree (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Function called when load a new file in. It will free all the old lines\r
-  and set FileModified field to FALSE\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   //\r
   // free all lines\r
@@ -1120,293 +1081,110 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageHandleInput (\r
-  IN  EFI_INPUT_KEY *Key\r
-  )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Dispatch input to different handler\r
-\r
-Arguments:  \r
+/**\r
+  change char to int value based on Hex.\r
 \r
-  Key -- input key\r
-   the keys can be:\r
-     ASCII KEY\r
-      Backspace/Delete\r
-      Direction key: up/down/left/right/pgup/pgdn\r
-      Home/End\r
-      INS\r
+  @param[in] Char     The input char.\r
 \r
-Returns:  \r
+  @return The character's index value.\r
+  @retval -1  The operation failed.\r
+**/\r
+INTN\r
+EFIAPI\r
+HBufferImageCharToHex (\r
+  IN CHAR16 Char\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
-  EFI_SUCCESS\r
-  EFI_LOAD_ERROR\r
-  EFI_OUT_OF_RESOURCES\r
+  if (Char >= L'a' && Char <= L'f') {\r
+    return (INTN) (Char - L'a' + 10);\r
+  }\r
 \r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
+  if (Char >= L'A' && Char <= L'F') {\r
+    return (INTN) (Char - L'A' + 10);\r
+  }\r
 \r
-  Status = EFI_SUCCESS;\r
+  return -1;\r
+}\r
 \r
-  switch (Key->ScanCode) {\r
-  //\r
-  // ordinary key\r
-  //\r
-  case SCAN_NULL:\r
-    Status = HBufferImageDoCharInput (Key->UnicodeChar);\r
-    break;\r
+/**\r
+  Add character.\r
 \r
-  //\r
-  // up arrow\r
-  //\r
-  case SCAN_UP:\r
-    Status = HBufferImageScrollUp ();\r
-    break;\r
+  @param[in] Char -- input char.\r
 \r
-  //\r
-  // down arrow\r
-  //\r
-  case SCAN_DOWN:\r
-    Status = HBufferImageScrollDown ();\r
-    break;\r
+  @retval EFI_SUCCESS             The operation was successful.\r
+  @retval EFI_OUT_OF_RESOURCES    A memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageAddChar (\r
+  IN  CHAR16  Char\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
-  //\r
-  // right arrow\r
-  //\r
-  case SCAN_RIGHT:\r
-    Status = HBufferImageScrollRight ();\r
-    break;\r
+  Value = HBufferImageCharToHex (Char);\r
 \r
   //\r
-  // left arrow\r
+  // invalid input\r
   //\r
-  case SCAN_LEFT:\r
-    Status = HBufferImageScrollLeft ();\r
-    break;\r
+  if (Value == -1) {\r
+    return EFI_SUCCESS;\r
+  }\r
 \r
-  //\r
-  // page up\r
-  //\r
-  case SCAN_PAGE_UP:\r
-    Status = HBufferImagePageUp ();\r
-    break;\r
+  Line  = HBufferImage.CurrentLine;\r
+  FRow  = HBufferImage.BufferPosition.Row;\r
+  FCol  = HBufferImage.BufferPosition.Column;\r
+  High  = HBufferImage.HighBits;\r
 \r
   //\r
-  // page down\r
+  // only needs to refresh current line\r
   //\r
-  case SCAN_PAGE_DOWN:\r
-    Status = HBufferImagePageDown ();\r
-    break;\r
+  HBufferImageOnlyLineNeedRefresh = TRUE;\r
 \r
   //\r
-  // delete\r
+  // not a full line and beyond the last character\r
   //\r
-  case SCAN_DELETE:\r
-    Status = HBufferImageDoDelete ();\r
-    break;\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
-  //\r
-  // home\r
-  //\r
-  case SCAN_HOME:\r
-    Status = HBufferImageHome ();\r
-    break;\r
+    Old = Line->Buffer[FCol - 1];\r
 \r
-  //\r
-  // end\r
-  //\r
-  case SCAN_END:\r
-    Status = HBufferImageEnd ();\r
-    break;\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
-  default:\r
-    Status = StatusBarSetStatusString (L"Unknown Command");\r
-    break;\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 && FCol == 0x10) {\r
 \r
-  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
+      HBufferImageOnlyLineNeedRefresh = FALSE;\r
+      HBufferImageNeedRefresh         = TRUE;\r
 \r
       if (Line->Link.ForwardLink == HBufferImage.ListHead) {\r
         //\r
@@ -1431,7 +1209,7 @@ Returns:
     //\r
     // if already at end of this line, scroll it to the start of next line\r
     //\r
-    if (FCol == 0x10 && High == FALSE) {\r
+    if (FCol == 0x10 && !High) {\r
       //\r
       // definitely has next line\r
       //\r
@@ -1469,83 +1247,151 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-BOOLEAN\r
-HInCurrentScreen (\r
-  IN  UINTN FileRow\r
+/**\r
+  Delete the previous character.\r
+\r
+  @retval EFI_SUCCESS   The operationw as successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoBackspace (\r
+  VOID\r
   )\r
-/*++\r
+{\r
+  HEFI_EDITOR_LINE  *Line;\r
 \r
-Routine Description: \r
+  UINTN             FileColumn;\r
+  UINTN             FPos;\r
+  BOOLEAN           LastLine;\r
 \r
-  Check user specified FileRow and FileCol is in current screen\r
+  //\r
+  // variable initialization\r
+  //\r
+  LastLine = FALSE;\r
 \r
-Arguments:  \r
+  //\r
+  // already the first character\r
+  //\r
+  if (HBufferImage.BufferPosition.Row == 1 && HBufferImage.BufferPosition.Column == 1) {\r
+    return EFI_SUCCESS;\r
+  }\r
 \r
-  FileRow -- Row of file position ( start from 1 )\r
+  FPos        = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
 \r
+  FileColumn  = HBufferImage.BufferPosition.Column;\r
 \r
-Returns:  \r
+  Line        = HBufferImage.CurrentLine;\r
+  LastLine    = FALSE;\r
+  if (Line->Link.ForwardLink == HBufferImage.ListHead && FileColumn > 1) {\r
+    LastLine = TRUE;\r
+  }\r
 \r
-  TRUE\r
-  FALSE\r
+  HBufferImageDeleteCharacterFromBuffer (FPos - 1, 1, NULL);\r
 \r
---*/\r
-{\r
-  if (FileRow >= HBufferImage.LowVisibleRow && FileRow <= HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
-    return TRUE;\r
+  //\r
+  // if is the last line\r
+  // then only this line need to be refreshed\r
+  //\r
+  if (LastLine) {\r
+    HBufferImageNeedRefresh         = FALSE;\r
+    HBufferImageOnlyLineNeedRefresh = TRUE;\r
+  } else {\r
+    HBufferImageNeedRefresh         = TRUE;\r
+    HBufferImageOnlyLineNeedRefresh = FALSE;\r
   }\r
 \r
-  return FALSE;\r
+  if (!HBufferImage.Modified) {\r
+    HBufferImage.Modified = TRUE;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
-BOOLEAN\r
-HAboveCurrentScreen (\r
-  IN  UINTN FileRow\r
+/**\r
+  ASCII key + Backspace + return.\r
+\r
+  @param[in] Char               The input char.\r
+\r
+  @retval EFI_SUCCESS           The operation was successful.\r
+  @retval EFI_LOAD_ERROR        A load error occured.\r
+  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoCharInput (\r
+  IN  CHAR16  Char\r
   )\r
-/*++\r
+{\r
+  EFI_STATUS  Status;\r
 \r
-Routine Description: \r
+  Status = EFI_SUCCESS;\r
 \r
-  Check user specified FileRow is above current screen\r
+  switch (Char) {\r
+  case 0:\r
+    break;\r
 \r
-Arguments:  \r
+  case 0x08:\r
+    Status = HBufferImageDoBackspace ();\r
+    break;\r
 \r
-  FileRow -- Row of file position ( start from 1 )\r
-  \r
-Returns:  \r
+  case 0x09:\r
+  case 0x0a:\r
+  case 0x0d:\r
+    //\r
+    // Tabs, Returns are thought as nothing\r
+    //\r
+    break;\r
 \r
-  TRUE\r
-  FALSE\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
---*/\r
-{\r
-  if (FileRow < HBufferImage.LowVisibleRow) {\r
-    return TRUE;\r
+    break;\r
   }\r
 \r
-  return FALSE;\r
+  return Status;\r
 }\r
 \r
+/**\r
+  Check user specified FileRow is above current screen.\r
+\r
+  @param[in] FileRow  Row of file position ( start from 1 ).\r
+  \r
+  @retval TRUE   It is above the current screen.\r
+  @retval FALSE  It is not above the current screen.\r
+\r
+**/\r
 BOOLEAN\r
-HUnderCurrentScreen (\r
+HAboveCurrentScreen (\r
   IN  UINTN FileRow\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Check user specified FileRow is under current screen\r
+{\r
+  if (FileRow < HBufferImage.LowVisibleRow) {\r
+    return TRUE;\r
+  }\r
 \r
-Arguments:  \r
+  return FALSE;\r
+}\r
 \r
-  FileRow -- Row of file position ( start from 1 )\r
+/**\r
+  Check user specified FileRow is under current screen.\r
 \r
-Returns:  \r
+  @param[in] FileRow    Row of file position ( start from 1 ).\r
 \r
-  TRUE\r
-  FALSE\r
+  @retval TRUE      It is under the current screen.\r
+  @retval FALSE     It is not under the current screen.\r
 \r
---*/\r
+**/\r
+BOOLEAN\r
+HUnderCurrentScreen (\r
+  IN  UINTN FileRow\r
+  )\r
 {\r
   if (FileRow > HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
     return TRUE;\r
@@ -1554,29 +1400,19 @@ Returns:
   return FALSE;\r
 }\r
 \r
+/**\r
+  According to cursor's file position, adjust screen display.\r
+\r
+  @param[in] NewFilePosRow    Row of file position ( start from 1 ).\r
+  @param[in] NewFilePosCol    Column of file position ( start from 1 ).\r
+  @param[in] HighBits         Cursor will on high4 bits or low4 bits.\r
+**/\r
 VOID\r
 HBufferImageMovePosition (\r
   IN UINTN    NewFilePosRow,\r
   IN UINTN    NewFilePosCol,\r
   IN BOOLEAN  HighBits\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  According to cursor's file position, adjust screen display\r
-\r
-Arguments:  \r
-\r
-  NewFilePosRow -- Row of file position ( start from 1 )\r
-  NewFilePosCol -- Column of file position ( start from 1 )   \r
-  HighBits      -- cursor will on high4 bits or low4 bits\r
-\r
-Returns:  \r
-\r
-  None\r
-\r
---*/\r
 {\r
   INTN    RowGap;\r
   UINTN   Abs;\r
@@ -1620,7 +1456,7 @@ Returns:
       //\r
       HBufferImage.BufferPosition.Row = NewFilePosRow;\r
       if (RowGap <= 0) {\r
-        Abs = -RowGap;\r
+        Abs = (UINTN)ABS(RowGap);\r
         HBufferImage.DisplayPosition.Row -= Abs;\r
       } else {\r
         HBufferImage.DisplayPosition.Row += RowGap;\r
@@ -1641,7 +1477,7 @@ Returns:
     NewDisplayCol++;\r
   }\r
 \r
-  if (HighBits == FALSE) {\r
+  if (!HighBits) {\r
     NewDisplayCol++;\r
   }\r
 \r
@@ -1654,25 +1490,15 @@ Returns:
 \r
 }\r
 \r
+/**\r
+  Scroll cursor to right.\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageScrollRight (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to right\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -1722,25 +1548,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageScrollLeft (\r
-  VOID\r
-  )\r
-/*++\r
+/**\r
+  Scroll cursor to left.\r
 \r
-Routine Description: \r
-\r
-  Scroll cursor to left\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
+EFI_STATUS\r
+HBufferImageScrollLeft (\r
+  VOID\r
+  )\r
 {\r
 \r
   HEFI_EDITOR_LINE  *Line;\r
@@ -1781,25 +1597,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to the next line\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageScrollDown (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to the next line\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -1836,25 +1642,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to previous line\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageScrollUp (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to previous line\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -1880,25 +1676,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to next page\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImagePageDown (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to next page\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -1931,7 +1717,7 @@ Returns:
   //\r
   // if that line, is not that long, so move to the end of that line\r
   //\r
-  if (FCol > Line->Size) {\r
+  if (Line != NULL && FCol > Line->Size) {\r
     FCol      = Line->Size + 1;\r
     HighBits  = TRUE;\r
   }\r
@@ -1943,25 +1729,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to previous page\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImagePageUp (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to previous page\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -2001,25 +1777,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to start of line\r
+\r
+  @retval EFI_SUCCESS  The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageHome (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to start of line\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -2043,25 +1809,15 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to end of line.\r
+\r
+  @retval EFI_SUCCESS  Teh operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageEnd (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Scroll cursor to end of line\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
@@ -2092,6 +1848,11 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Get the size of the open buffer.\r
+\r
+  @retval The size in bytes.\r
+**/\r
 UINTN\r
 HBufferImageGetTotalSize (\r
   VOID\r
@@ -2122,28 +1883,21 @@ HBufferImageGetTotalSize (
   return Size;\r
 }\r
 \r
+/**\r
+  Delete character from buffer.\r
+  \r
+  @param[in] Pos      Position, Pos starting from 0.\r
+  @param[in] Count    The Count of characters to delete.\r
+  @param[out] DeleteBuffer    The DeleteBuffer.\r
+\r
+  @retval EFI_SUCCESS Success \r
+**/\r
 EFI_STATUS\r
 HBufferImageDeleteCharacterFromBuffer (\r
   IN  UINTN         Pos,\r
   IN  UINTN         Count,\r
   OUT UINT8         *DeleteBuffer\r
   )\r
-/*++\r
-Routine Description:\r
-\r
-  Delete character from buffer\r
-  \r
-Arguments:\r
-\r
-  Pos - Position, Pos starting from 0\r
-  Count - Count\r
-  DeleteBuffer - DeleteBuffer\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS Success\r
-  \r
---*/\r
 {\r
   UINTN             Index;\r
 \r
@@ -2264,28 +2018,21 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Add character to buffer, add before pos.\r
+\r
+  @param[in] Pos        Position, Pos starting from 0.\r
+  @param[in] Count      Count of characters to add.\r
+  @param[in] AddBuffer  Add buffer.\r
+\r
+  @retval EFI_SUCCESS   Success.  \r
+**/\r
 EFI_STATUS\r
 HBufferImageAddCharacterToBuffer (\r
   IN  UINTN          Pos,\r
   IN  UINTN          Count,\r
   IN  UINT8          *AddBuffer\r
   )\r
-/*++'\r
-Routine Description:\r
-\r
-  Add character to buffer, add before pos\r
-\r
-Arguments:\r
-\r
-  Pos - Position, Pos starting from 0\r
-  Count - Count\r
-  AddBuffer - Add buffer\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS Success\r
-  \r
---*/\r
 {\r
   INTN              Index;\r
 \r
@@ -2378,94 +2125,16 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageDoBackspace (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  delete the previous character\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
-{\r
-  HEFI_EDITOR_LINE  *Line;\r
-\r
-  UINTN             FileColumn;\r
-  UINTN             FPos;\r
-  BOOLEAN           LastLine;\r
-\r
-  //\r
-  // variable initialization\r
-  //\r
-  LastLine = FALSE;\r
-\r
-  //\r
-  // already the first character\r
-  //\r
-  if (HBufferImage.BufferPosition.Row == 1 && HBufferImage.BufferPosition.Column == 1) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  FPos        = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
-\r
-  FileColumn  = HBufferImage.BufferPosition.Column;\r
-\r
-  Line        = HBufferImage.CurrentLine;\r
-  LastLine    = FALSE;\r
-  if (Line->Link.ForwardLink == HBufferImage.ListHead && FileColumn > 1) {\r
-    LastLine = TRUE;\r
-  }\r
-\r
-  HBufferImageDeleteCharacterFromBuffer (FPos - 1, 1, NULL);\r
-\r
-  //\r
-  // if is the last line\r
-  // then only this line need to be refreshed\r
-  //\r
-  if (LastLine) {\r
-    HBufferImageNeedRefresh         = FALSE;\r
-    HBufferImageOnlyLineNeedRefresh = TRUE;\r
-  } else {\r
-    HBufferImageNeedRefresh         = TRUE;\r
-    HBufferImageOnlyLineNeedRefresh = FALSE;\r
-  }\r
-\r
-  if (!HBufferImage.Modified) {\r
-    HBufferImage.Modified = TRUE;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
+/**\r
+  Delete current character from line.\r
 \r
+  @retval EFI_SUCCESS   The operationw as successful.\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 HBufferImageDoDelete (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description: \r
-\r
-  Delete current character from line\r
-\r
-Arguments:  \r
-\r
-  None\r
-\r
-Returns:  \r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
 {\r
 \r
   HEFI_EDITOR_LINE  *Line;\r
@@ -2513,30 +2182,40 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Change the raw buffer to a list of lines for the UI.\r
+  \r
+  @param[in] Buffer   The pointer to the buffer to fill.\r
+  @param[in] Bytes    The size of the buffer in bytes.\r
+\r
+  @retval EFI_SUCCESS           The operation was successful.\r
+  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 HBufferImageBufferToList (\r
   IN VOID   *Buffer,\r
   IN UINTN  Bytes\r
   )\r
 {\r
-  UINTN             i;\r
-  UINTN             j;\r
+  UINTN             TempI;\r
+  UINTN             TempJ;\r
   UINTN             Left;\r
   HEFI_EDITOR_LINE  *Line;\r
   UINT8             *BufferPtr;\r
 \r
-  i         = 0;\r
+  TempI         = 0;\r
   Left      = 0;\r
   BufferPtr = (UINT8 *) Buffer;\r
 \r
   //\r
   // parse file content line by line\r
   //\r
-  while (i < Bytes) {\r
-    if (Bytes - i >= 0x10) {\r
+  while (TempI < Bytes) {\r
+    if (Bytes - TempI >= 0x10) {\r
       Left = 0x10;\r
     } else {\r
-      Left = Bytes - i;\r
+      Left = Bytes - TempI;\r
     }\r
 \r
     //\r
@@ -2549,9 +2228,9 @@ HBufferImageBufferToList (
 \r
     Line->Size = Left;\r
 \r
-    for (j = 0; j < Left; j++) {\r
-      Line->Buffer[j] = BufferPtr[i];\r
-      i++;\r
+    for (TempJ = 0; TempJ < Left; TempJ++) {\r
+      Line->Buffer[TempJ] = BufferPtr[TempI];\r
+      TempI++;\r
     }\r
 \r
   }\r
@@ -2569,7 +2248,16 @@ HBufferImageBufferToList (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Change the list of lines from the UI to a raw buffer.\r
+  \r
+  @param[in] Buffer   The pointer to the buffer to fill.\r
+  @param[in] Bytes    The size of the buffer in bytes.\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 HBufferImageListToBuffer (\r
   IN VOID   *Buffer,\r
   IN UINTN  Bytes\r
@@ -2599,6 +2287,7 @@ HBufferImageListToBuffer (
 \r
     Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
 \r
+    //@todo shouldn't this be an error???\r
     if (Count + Line->Size > Bytes) {\r
       return EFI_SUCCESS;\r
     }\r
@@ -2616,14 +2305,21 @@ HBufferImageListToBuffer (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Move the mouse in the image buffer.\r
+\r
+  @param[in] TextX    The x-coordinate.\r
+  @param[in] TextY    The y-coordinate.\r
+**/\r
 VOID\r
+EFIAPI\r
 HBufferImageAdjustMousePosition (\r
   IN INT32 TextX,\r
   IN INT32 TextY\r
   )\r
 {\r
-  UINTN X;\r
-  UINTN Y;\r
+  UINTN TempX;\r
+  UINTN TempY;\r
   UINTN AbsX;\r
   UINTN AbsY;\r
 \r
@@ -2632,7 +2328,7 @@ HBufferImageAdjustMousePosition (
   // This function will change it to MousePosition\r
   //\r
   //\r
-  // get absolute X value\r
+  // get absolute TempX value\r
   //\r
   if (TextX >= 0) {\r
     AbsX = TextX;\r
@@ -2640,7 +2336,7 @@ HBufferImageAdjustMousePosition (
     AbsX = -TextX;\r
   }\r
   //\r
-  // get absolute Y value\r
+  // get absolute TempY value\r
   //\r
   if (TextY >= 0) {\r
     AbsY = TextY;\r
@@ -2648,49 +2344,153 @@ HBufferImageAdjustMousePosition (
     AbsY = -TextY;\r
   }\r
 \r
-  X = HBufferImage.MousePosition.Column;\r
-  Y = HBufferImage.MousePosition.Row;\r
+  TempX = HBufferImage.MousePosition.Column;\r
+  TempY = HBufferImage.MousePosition.Row;\r
 \r
   if (TextX >= 0) {\r
-    X += TextX;\r
+    TempX += TextX;\r
   } else {\r
-    if (X >= AbsX) {\r
-      X -= AbsX;\r
+    if (TempX >= AbsX) {\r
+      TempX -= AbsX;\r
     } else {\r
-      X = 0;\r
+      TempX = 0;\r
     }\r
   }\r
 \r
   if (TextY >= 0) {\r
-    Y += TextY;\r
+    TempY += TextY;\r
   } else {\r
-    if (Y >= AbsY) {\r
-      Y -= AbsY;\r
+    if (TempY >= AbsY) {\r
+      TempY -= AbsY;\r
     } else {\r
-      Y = 0;\r
+      TempY = 0;\r
     }\r
   }\r
   //\r
   // check whether new mouse column position is beyond screen\r
   // if not, adjust it\r
   //\r
-  if (X >= 10 && X <= (10 + 0x10 * 3 - 1)) {\r
-    HBufferImage.MousePosition.Column = X;\r
-  } else if (X < 10) {\r
+  if (TempX >= 10 && TempX <= (10 + 0x10 * 3 - 1)) {\r
+    HBufferImage.MousePosition.Column = TempX;\r
+  } else if (TempX < 10) {\r
     HBufferImage.MousePosition.Column = 10;\r
-  } else if (X > (10 + 0x10 * 3 - 1)) {\r
+  } else if (TempX > (10 + 0x10 * 3 - 1)) {\r
     HBufferImage.MousePosition.Column = 10 + 0x10 * 3 - 1;\r
   }\r
   //\r
   // check whether new mouse row position is beyond screen\r
   // if not, adjust it\r
   //\r
-  if (Y >= 2 && Y <= (HMainEditor.ScreenSize.Row - 4)) {\r
-    HBufferImage.MousePosition.Row = Y;\r
-  } else if (Y < 2) {\r
+  if (TempY >= 2 && TempY <= (HMainEditor.ScreenSize.Row - 4)) {\r
+    HBufferImage.MousePosition.Row = TempY;\r
+  } else if (TempY < 2) {\r
     HBufferImage.MousePosition.Row = 2;\r
-  } else if (Y > (HMainEditor.ScreenSize.Row - 4)) {\r
+  } else if (TempY > (HMainEditor.ScreenSize.Row - 4)) {\r
     HBufferImage.MousePosition.Row = (HMainEditor.ScreenSize.Row - 4);\r
   }\r
 \r
 }\r
+\r
+/**\r
+  Dispatch input to different handler\r
+\r
+  @param[in] Key    The input key:\r
+                     the keys can be:\r
+                       ASCII KEY\r
+                        Backspace/Delete\r
+                        Direction key: up/down/left/right/pgup/pgdn\r
+                        Home/End\r
+                        INS\r
+\r
+  @retval EFI_SUCCESS           The operation was successful.\r
+  @retval EFI_LOAD_ERROR        A load error occured.\r
+  @retval EFI_OUT_OF_RESOURCES  A Memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+HBufferImageHandleInput (\r
+  IN  EFI_INPUT_KEY *Key\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  switch (Key->ScanCode) {\r
+  //\r
+  // ordinary key\r
+  //\r
+  case SCAN_NULL:\r
+    Status = HBufferImageDoCharInput (Key->UnicodeChar);\r
+    break;\r
+\r
+  //\r
+  // up arrow\r
+  //\r
+  case SCAN_UP:\r
+    Status = HBufferImageScrollUp ();\r
+    break;\r
+\r
+  //\r
+  // down arrow\r
+  //\r
+  case SCAN_DOWN:\r
+    Status = HBufferImageScrollDown ();\r
+    break;\r
+\r
+  //\r
+  // right arrow\r
+  //\r
+  case SCAN_RIGHT:\r
+    Status = HBufferImageScrollRight ();\r
+    break;\r
+\r
+  //\r
+  // left arrow\r
+  //\r
+  case SCAN_LEFT:\r
+    Status = HBufferImageScrollLeft ();\r
+    break;\r
+\r
+  //\r
+  // page up\r
+  //\r
+  case SCAN_PAGE_UP:\r
+    Status = HBufferImagePageUp ();\r
+    break;\r
+\r
+  //\r
+  // page down\r
+  //\r
+  case SCAN_PAGE_DOWN:\r
+    Status = HBufferImagePageDown ();\r
+    break;\r
+\r
+  //\r
+  // delete\r
+  //\r
+  case SCAN_DELETE:\r
+    Status = HBufferImageDoDelete ();\r
+    break;\r
+\r
+  //\r
+  // home\r
+  //\r
+  case SCAN_HOME:\r
+    Status = HBufferImageHome ();\r
+    break;\r
+\r
+  //\r
+  // end\r
+  //\r
+  case SCAN_END:\r
+    Status = HBufferImageEnd ();\r
+    break;\r
+\r
+  default:\r
+    Status = StatusBarSetStatusString (L"Unknown Command");\r
+    break;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r