]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c
ShellPkg: Fix ARM build errors.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / BufferImage.c
index 8aa75b419ade36d224bcd47bc58079051cb896c7..ba15a49ce101d338f1d3f66ae27619531b5145e2 100644 (file)
@@ -74,23 +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
-/**
-  Initialization function for HBufferImage\r
-\r
-  \r
-\r
-  None\r
-\r
\r
-\r
-  EFI_SUCCESS\r
-  EFI_LOAD_ERROR\r
-\r
-**/\r
 {\r
   EFI_STATUS  Status;\r
 \r
@@ -144,25 +137,16 @@ HBufferImageInit (
   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
-/**
-  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
-  \r
-\r
-  None\r
-\r
\r
-\r
-  EFI_SUCCESS\r
-\r
-**/\r
 {\r
   HBufferImageBackupVar.MousePosition   = HBufferImage.MousePosition;\r
 \r
@@ -192,32 +176,28 @@ HBufferImageBackup (
   case FileTypeMemBuffer:\r
     HMemImageBackup ();\r
     break;\r
+\r
+  default:\r
+    break;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageFreeLines (\r
-  VOID\r
-  )\r
 /**
-  Free all the lines in HBufferImage\r
+  Free all the lines in HBufferImage.\r
     Fields affected:\r
     Lines\r
     CurrentLine\r
     NumLines\r
     ListHead \r
 \r
-  \r
-\r
-  None\r
-\r
\r
-\r
-  EFI_SUCCESS\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
@@ -228,22 +208,15 @@ HBufferImageFreeLines (
   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
-/**
-  Cleanup function for HBufferImage\r
-\r
-  \r
-\r
-  None\r
-\r
\r
-\r
-  EFI_SUCCESS\r
-\r
-**/\r
 {\r
   EFI_STATUS  Status;\r
 \r
@@ -257,12 +230,22 @@ HBufferImageCleanup (
 \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
@@ -272,22 +255,6 @@ HBufferImagePrintLine (
   IN HEFI_EDITOR_COLOR_UNION    New\r
 \r
   )\r
-/**
-  Print Line on Row\r
-\r
-  \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
\r
-\r
-  EFI_SUCCESS\r
-\r
-**/\r
 {\r
 \r
   UINTN   Index;\r
@@ -330,7 +297,7 @@ HBufferImagePrintLine (
 \r
   }\r
 \r
-  if (HEditorMouseAction == FALSE) {\r
+  if (!HEditorMouseAction) {\r
     ShellPrintEx (\r
       0,\r
       (INT32)Row - 1,\r
@@ -417,7 +384,7 @@ HBufferImagePrintLine (
   //\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
@@ -456,6 +423,15 @@ HBufferImagePrintLine (
   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
@@ -479,7 +455,7 @@ HBufferImageIsAtHighBits (
 \r
   *FCol = (Column / 3) + 1;\r
 \r
-  if (!(Column % 3)) {\r
+  if (Column % 3 == 0) {\r
     return TRUE;\r
   }\r
 \r
@@ -490,6 +466,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
@@ -552,6 +537,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
@@ -590,6 +580,7 @@ HBufferImageRestoreMousePosition (
       // backup the old screen attributes\r
       //\r
       Orig                  = HMainEditor.ColorAttributes;\r
+      New.Data              = 0;\r
       New.Colors.Foreground = Orig.Colors.Background;\r
       New.Colors.Background = Orig.Colors.Foreground;\r
 \r
@@ -719,22 +710,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
-/**
-  Set cursor position according to HBufferImage.DisplayPosition.\r
-\r
-  \r
-\r
-  None\r
-\r
\r
-\r
-  EFI_SUCCESS\r
-\r
-**/\r
 {\r
   //\r
   // set cursor position\r
@@ -769,10 +753,10 @@ HBufferImageRefresh (
   UINTN                   StartRow;\r
   UINTN                   EndRow;\r
   UINTN                   FStartRow;\r
-  UINTN                   FEndRow;\r
   UINTN                   Tmp;\r
 \r
   Orig                  = HMainEditor.ColorAttributes;\r
+  New.Data              = 0;\r
   New.Colors.Foreground = Orig.Colors.Background;\r
   New.Colors.Background = Orig.Colors.Foreground;\r
 \r
@@ -838,7 +822,6 @@ HBufferImageRefresh (
       }\r
 \r
       FStartRow = StartRow;\r
-      FEndRow   = EndRow;\r
 \r
       StartRow  = 2 + StartRow - HBufferImage.LowVisibleRow;\r
       EndRow    = 2 + EndRow - HBufferImage.LowVisibleRow;\r
@@ -849,7 +832,7 @@ HBufferImageRefresh (
       //\r
       FStartRow = HBufferImage.LowVisibleRow;\r
       StartRow  = 2;\r
-      EndRow    = (HMainEditor.ScreenSize.Row - 4);\r
+      EndRow    = (HMainEditor.ScreenSize.Row - 1);\r
     }\r
     //\r
     // no line\r
@@ -890,7 +873,7 @@ HBufferImageRefresh (
     } 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
@@ -915,8 +898,8 @@ HBufferImageRefresh (
   @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] MemoryOffset Offset into the Memory.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
-  @param[in] MemorySize   Size of the Memory buffer.  OPTIONAL and ignored if not FileTypeMemBuffer.\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
@@ -964,6 +947,10 @@ HBufferImageRead (
   case FileTypeMemBuffer:\r
     Status = HMemImageRead (MemOffset, MemSize, Recover);\r
     break;\r
+    \r
+  default:\r
+    Status = EFI_NOT_FOUND;\r
+    break;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -980,8 +967,8 @@ HBufferImageRead (
   @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] MemoryOffset Offset into the Memory.  OPTIONAL and ignored if not FileTypeMemBuffer.\r
-  @param[in] MemorySize   Size of the Memory buffer.  OPTIONAL and ignored if not FileTypeMemBuffer.\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
@@ -1027,6 +1014,10 @@ HBufferImageSave (
   case FileTypeMemBuffer:\r
     Status = HMemImageSave (MemOffset, MemSize);\r
     break;\r
+    \r
+  default:\r
+    Status = EFI_NOT_FOUND;\r
+    break;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1102,160 +1093,6 @@ HBufferImageFree (
 }\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
-/**
-  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
-  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
-/**\r
   change char to int value based on Hex.\r
 \r
   @param[in] Char     The input char.\r
@@ -1422,23 +1259,114 @@ HBufferImageAddChar (
 }\r
 \r
 /**\r
-  Check user specified FileRow and FileCol is in current screen.\r
+  Delete the previous character.\r
 \r
-  @param[in] FileRow    Row of file position ( start from 1 ).\r
+  @retval EFI_SUCCESS   The operationw as successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoBackspace (\r
+  VOID\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
+/**\r
+  ASCII key + Backspace + return.\r
 \r
-  @retval TRUE   It's on the current screen.\r
-  @retval FALSE  It's not on the current screen.\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
-BOOLEAN\r
-HInCurrentScreen (\r
-  IN  UINTN FileRow\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoCharInput (\r
+  IN  CHAR16  Char\r
   )\r
 {\r
-  if (FileRow >= HBufferImage.LowVisibleRow && FileRow <= HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
-    return TRUE;\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 FALSE;\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -1476,7 +1404,7 @@ HUnderCurrentScreen (
   IN  UINTN FileRow\r
   )\r
 {\r
-  if (FileRow > HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
+  if (FileRow > HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 2) - 1) {\r
     return TRUE;\r
   }\r
 \r
@@ -1496,7 +1424,6 @@ HBufferImageMovePosition (
   IN UINTN    NewFilePosCol,\r
   IN BOOLEAN  HighBits\r
   )\r
-\r
 {\r
   INTN    RowGap;\r
   UINTN   Abs;\r
@@ -1785,8 +1712,8 @@ HBufferImagePageDown (
   //\r
   // has next page\r
   //\r
-  if (HBufferImage.NumLines >= FRow + (HMainEditor.ScreenSize.Row - 5)) {\r
-    Gap = (HMainEditor.ScreenSize.Row - 5);\r
+  if (HBufferImage.NumLines >= FRow + (HMainEditor.ScreenSize.Row - 2)) {\r
+    Gap = (HMainEditor.ScreenSize.Row - 2);\r
   } else {\r
     //\r
     // MOVE CURSOR TO LAST LINE\r
@@ -1823,22 +1750,19 @@ HBufferImagePageUp (
   VOID\r
   )\r
 {\r
-  HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
   UINTN             FCol;\r
   UINTN             Gap;\r
   INTN              Retreat;\r
 \r
-  Line  = HBufferImage.CurrentLine;\r
-\r
   FRow  = HBufferImage.BufferPosition.Row;\r
   FCol  = HBufferImage.BufferPosition.Column;\r
 \r
   //\r
   // has previous page\r
   //\r
-  if (FRow > (HMainEditor.ScreenSize.Row - 5)) {\r
-    Gap = (HMainEditor.ScreenSize.Row - 5);\r
+  if (FRow > (HMainEditor.ScreenSize.Row - 2)) {\r
+    Gap = (HMainEditor.ScreenSize.Row - 2);\r
   } else {\r
     //\r
     // the first line of file will displayed on the first line of screen\r
@@ -1849,11 +1773,6 @@ HBufferImagePageUp (
   Retreat = Gap;\r
   Retreat = -Retreat;\r
 \r
-  //\r
-  // get correct line\r
-  //\r
-  Line = HMoveLine (Retreat);\r
-\r
   FRow -= Gap;\r
 \r
   HBufferImageMovePosition (FRow, FCol, HBufferImage.HighBits);\r
@@ -1871,13 +1790,10 @@ HBufferImageHome (
   VOID\r
   )\r
 {\r
-  HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
   UINTN             FCol;\r
   BOOLEAN           HighBits;\r
 \r
-  Line = HBufferImage.CurrentLine;\r
-\r
   //\r
   // curosr will at the high bit\r
   //\r
@@ -1972,7 +1888,7 @@ HBufferImageGetTotalSize (
   \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
+  @param[out] DeleteBuffer    The DeleteBuffer.\r
 \r
   @retval EFI_SUCCESS Success \r
 **/\r
@@ -1991,7 +1907,6 @@ HBufferImageDeleteCharacterFromBuffer (
 \r
   HEFI_EDITOR_LINE  *Line;\r
   LIST_ENTRY    *Link;\r
-  UINTN             StartRow;\r
 \r
   UINTN             OldFCol;\r
   UINTN             OldFRow;\r
@@ -2001,11 +1916,6 @@ HBufferImageDeleteCharacterFromBuffer (
 \r
   EFI_STATUS        Status;\r
 \r
-  //\r
-  // get the line that start position is at\r
-  //\r
-  StartRow  = Pos / 0x10;\r
-\r
   Size      = HBufferImageGetTotalSize ();\r
 \r
   if (Size < Count) {\r
@@ -2127,7 +2037,6 @@ HBufferImageAddCharacterToBuffer (
   HEFI_EDITOR_LINE  *Line;\r
 \r
   LIST_ENTRY    *Link;\r
-  UINTN             StartRow;\r
 \r
   UINTN             OldFCol;\r
   UINTN             OldFRow;\r
@@ -2135,11 +2044,6 @@ HBufferImageAddCharacterToBuffer (
 \r
   UINTN             NewPos;\r
 \r
-  //\r
-  // get the line that start position is at\r
-  //\r
-  StartRow  = Pos / 0x10;\r
-\r
   Size      = HBufferImageGetTotalSize ();\r
 \r
   //\r
@@ -2209,66 +2113,6 @@ HBufferImageAddCharacterToBuffer (
   return EFI_SUCCESS;\r
 }\r
 \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
-  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
 /**\r
   Delete current character from line.\r
 \r
@@ -2525,12 +2369,116 @@ HBufferImageAdjustMousePosition (
   // check whether new mouse row position is beyond screen\r
   // if not, adjust it\r
   //\r
-  if (TempY >= 2 && TempY <= (HMainEditor.ScreenSize.Row - 4)) {\r
+  if (TempY >= 2 && TempY <= (HMainEditor.ScreenSize.Row - 1)) {\r
     HBufferImage.MousePosition.Row = TempY;\r
   } else if (TempY < 2) {\r
     HBufferImage.MousePosition.Row = 2;\r
-  } else if (TempY > (HMainEditor.ScreenSize.Row - 4)) {\r
-    HBufferImage.MousePosition.Row = (HMainEditor.ScreenSize.Row - 4);\r
+  } else if (TempY > (HMainEditor.ScreenSize.Row - 1)) {\r
+    HBufferImage.MousePosition.Row = (HMainEditor.ScreenSize.Row - 1);\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