]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / BufferImage.c
index 04ebd24edc862655e5027977257dbce93f272261..be77e31a40b70c9b276f2b77eaf4bdd13f32d3b2 100644 (file)
@@ -1,42 +1,36 @@
 /** @file\r
   Defines HBufferImage - the view of the file that is visible at any point,\r
   as well as the event handlers for editing the file\r
-  \r
-  Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
 \r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "HexEditor.h"\r
 \r
-extern EFI_HANDLE                 HImageHandleBackup;\r
+extern EFI_HANDLE  HImageHandleBackup;\r
 \r
-extern HEFI_EDITOR_FILE_IMAGE     HFileImage;\r
-extern HEFI_EDITOR_DISK_IMAGE     HDiskImage;\r
-extern HEFI_EDITOR_MEM_IMAGE      HMemImage;\r
+extern HEFI_EDITOR_FILE_IMAGE  HFileImage;\r
+extern HEFI_EDITOR_DISK_IMAGE  HDiskImage;\r
+extern HEFI_EDITOR_MEM_IMAGE   HMemImage;\r
 \r
-extern HEFI_EDITOR_FILE_IMAGE     HFileImageBackupVar;\r
-extern HEFI_EDITOR_DISK_IMAGE     HDiskImageBackupVar;\r
-extern HEFI_EDITOR_MEM_IMAGE      HMemImageBackupVar;\r
+extern HEFI_EDITOR_FILE_IMAGE  HFileImageBackupVar;\r
+extern HEFI_EDITOR_DISK_IMAGE  HDiskImageBackupVar;\r
+extern HEFI_EDITOR_MEM_IMAGE   HMemImageBackupVar;\r
 \r
-extern BOOLEAN                    HEditorMouseAction;\r
+extern BOOLEAN  HEditorMouseAction;\r
 \r
 extern HEFI_EDITOR_GLOBAL_EDITOR  HMainEditor;\r
 extern HEFI_EDITOR_GLOBAL_EDITOR  HMainEditorBackupVar;\r
 \r
-HEFI_EDITOR_BUFFER_IMAGE          HBufferImage;\r
-HEFI_EDITOR_BUFFER_IMAGE          HBufferImageBackupVar;\r
+HEFI_EDITOR_BUFFER_IMAGE  HBufferImage;\r
+HEFI_EDITOR_BUFFER_IMAGE  HBufferImageBackupVar;\r
 \r
 //\r
 // for basic initialization of HBufferImage\r
 //\r
-HEFI_EDITOR_BUFFER_IMAGE          HBufferImageConst = {\r
+HEFI_EDITOR_BUFFER_IMAGE  HBufferImageConst = {\r
   NULL,\r
   NULL,\r
   0,\r
@@ -65,35 +59,25 @@ HEFI_EDITOR_BUFFER_IMAGE          HBufferImageConst = {
 //\r
 // the whole edit area needs to be refreshed\r
 //\r
-BOOLEAN                           HBufferImageNeedRefresh;\r
+BOOLEAN  HBufferImageNeedRefresh;\r
 \r
 //\r
 // only the current line in edit area needs to be refresh\r
 //\r
-BOOLEAN                           HBufferImageOnlyLineNeedRefresh;\r
+BOOLEAN  HBufferImageOnlyLineNeedRefresh;\r
 \r
-BOOLEAN                           HBufferImageMouseNeedRefresh;\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 occurred.\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
@@ -117,17 +101,17 @@ Returns:
   HBufferImage.MousePosition.Row      = 2;\r
   HBufferImage.MousePosition.Column   = 10;\r
 \r
-  HBufferImage.FileImage              = &HFileImage;\r
-  HBufferImage.DiskImage              = &HDiskImage;\r
-  HBufferImage.MemImage               = &HMemImage;\r
+  HBufferImage.FileImage = &HFileImage;\r
+  HBufferImage.DiskImage = &HDiskImage;\r
+  HBufferImage.MemImage  = &HMemImage;\r
 \r
-  HBufferImageNeedRefresh             = FALSE;\r
-  HBufferImageOnlyLineNeedRefresh     = FALSE;\r
-  HBufferImageMouseNeedRefresh        = FALSE;\r
+  HBufferImageNeedRefresh         = FALSE;\r
+  HBufferImageOnlyLineNeedRefresh = FALSE;\r
+  HBufferImageMouseNeedRefresh    = FALSE;\r
 \r
-  HBufferImageBackupVar.FileImage     = &HFileImageBackupVar;\r
-  HBufferImageBackupVar.DiskImage     = &HDiskImageBackupVar;\r
-  HBufferImageBackupVar.MemImage      = &HMemImageBackupVar;\r
+  HBufferImageBackupVar.FileImage = &HFileImageBackupVar;\r
+  HBufferImageBackupVar.DiskImage = &HDiskImageBackupVar;\r
+  HBufferImageBackupVar.MemImage  = &HMemImageBackupVar;\r
 \r
   Status = HFileImageInit ();\r
   if (EFI_ERROR (Status)) {\r
@@ -147,38 +131,26 @@ 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
+  HBufferImageBackupVar.MousePosition = HBufferImage.MousePosition;\r
 \r
-  HBufferImageBackupVar.BufferPosition  = HBufferImage.BufferPosition;\r
+  HBufferImageBackupVar.BufferPosition = HBufferImage.BufferPosition;\r
 \r
-  HBufferImageBackupVar.Modified        = HBufferImage.Modified;\r
+  HBufferImageBackupVar.Modified = HBufferImage.Modified;\r
 \r
-  HBufferImageBackupVar.BufferType      = HBufferImage.BufferType;\r
-  HBufferImageBackupVar.LowVisibleRow   = HBufferImage.LowVisibleRow;\r
-  HBufferImageBackupVar.HighBits        = HBufferImage.HighBits;\r
+  HBufferImageBackupVar.BufferType    = HBufferImage.BufferType;\r
+  HBufferImageBackupVar.LowVisibleRow = HBufferImage.LowVisibleRow;\r
+  HBufferImageBackupVar.HighBits      = HBufferImage.HighBits;\r
 \r
   //\r
   // three kinds of buffer supported\r
@@ -187,75 +159,58 @@ Returns:
   //   memory buffer\r
   //\r
   switch (HBufferImage.BufferType) {\r
-  case FileTypeFileBuffer:\r
-    HFileImageBackup ();\r
-    break;\r
+    case FileTypeFileBuffer:\r
+      HFileImageBackup ();\r
+      break;\r
 \r
-  case FileTypeDiskBuffer:\r
-    HDiskImageBackup ();\r
-    break;\r
+    case FileTypeDiskBuffer:\r
+      HDiskImageBackup ();\r
+      break;\r
 \r
-  case FileTypeMemBuffer:\r
-    HMemImageBackup ();\r
-    break;\r
+    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
-/*++\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
+    ListHead\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
-  HBufferImage.Lines        = NULL;\r
-  HBufferImage.CurrentLine  = NULL;\r
-  HBufferImage.NumLines     = 0;\r
+  HBufferImage.Lines       = NULL;\r
+  HBufferImage.CurrentLine = NULL;\r
+  HBufferImage.NumLines    = 0;\r
 \r
   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,69 +224,58 @@ Returns:
 \r
   HFileImageCleanup ();\r
   HDiskImageCleanup ();\r
-  HMemImageCleanup ();\r
 \r
   return Status;\r
-\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImagePrintLine (\r
-  IN HEFI_EDITOR_LINE           *Line,\r
-  IN UINTN                      Row,\r
-  IN UINTN                      FRow,\r
-  IN HEFI_EDITOR_COLOR_UNION    Orig,\r
-  IN HEFI_EDITOR_COLOR_UNION    New\r
-\r
-  )\r
-/*++\r
-\r
-Routine Description: \r
-\r
+/**\r
   Print Line on Row\r
 \r
-Arguments:  \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
-  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
+  @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+HBufferImagePrintLine (\r
+  IN HEFI_EDITOR_LINE         *Line,\r
+  IN UINTN                    Row,\r
+  IN UINTN                    FRow,\r
+  IN HEFI_EDITOR_COLOR_UNION  Orig,\r
+  IN HEFI_EDITOR_COLOR_UNION  New\r
 \r
---*/\r
+  )\r
 {\r
-\r
-  UINTN   Index;\r
-  UINTN   Pos;\r
-  BOOLEAN Selected;\r
-  BOOLEAN BeNewColor;\r
-  UINTN   RowStart;\r
-  UINTN   RowEnd;\r
-  UINTN   ColStart;\r
-  UINTN   ColEnd;\r
+  UINTN    Index;\r
+  UINTN    Pos;\r
+  BOOLEAN  Selected;\r
+  BOOLEAN  BeNewColor;\r
+  UINTN    RowStart;\r
+  UINTN    RowEnd;\r
+  UINTN    ColStart;\r
+  UINTN    ColEnd;\r
 \r
   //\r
   // variable initialization\r
   //\r
-  ColStart  = 0;\r
-  ColEnd    = 0;\r
-  Selected  = FALSE;\r
+  ColStart = 0;\r
+  ColEnd   = 0;\r
+  Selected = FALSE;\r
 \r
   //\r
   // print the selected area in opposite color\r
   //\r
-  if (HMainEditor.SelectStart != 0 && HMainEditor.SelectEnd != 0) {\r
-    RowStart  = (HMainEditor.SelectStart - 1) / 0x10 + 1;\r
-    RowEnd    = (HMainEditor.SelectEnd - 1) / 0x10 + 1;\r
+  if ((HMainEditor.SelectStart != 0) && (HMainEditor.SelectEnd != 0)) {\r
+    RowStart = (HMainEditor.SelectStart - 1) / 0x10 + 1;\r
+    RowEnd   = (HMainEditor.SelectEnd - 1) / 0x10 + 1;\r
 \r
-    ColStart  = (HMainEditor.SelectStart - 1) % 0x10 + 1;\r
-    ColEnd    = (HMainEditor.SelectEnd - 1) % 0x10 + 1;\r
+    ColStart = (HMainEditor.SelectStart - 1) % 0x10 + 1;\r
+    ColEnd   = (HMainEditor.SelectEnd - 1) % 0x10 + 1;\r
 \r
-    if (FRow >= RowStart && FRow <= RowEnd) {\r
+    if ((FRow >= RowStart) && (FRow <= RowEnd)) {\r
       Selected = TRUE;\r
     }\r
 \r
@@ -342,33 +286,30 @@ Returns:
     if (FRow < RowEnd) {\r
       ColEnd = 0x10;\r
     }\r
-\r
   }\r
 \r
-  if (HEditorMouseAction == FALSE) {\r
+  if (!HEditorMouseAction) {\r
     ShellPrintEx (\r
       0,\r
       (INT32)Row - 1,\r
       L"%8X ",\r
       ((INT32)Row - 2 + HBufferImage.LowVisibleRow - 1) * 0x10\r
       );\r
-\r
   }\r
 \r
   for (Index = 0; Index < 0x08 && Index < Line->Size; Index++) {\r
-\r
     BeNewColor = FALSE;\r
 \r
     if (Selected) {\r
-      if (Index + 1 >= ColStart && Index + 1 <= ColEnd) {\r
+      if ((Index + 1 >= ColStart) && (Index + 1 <= ColEnd)) {\r
         BeNewColor = TRUE;\r
       }\r
     }\r
 \r
     if (BeNewColor) {\r
-      gST->ConOut->SetAttribute (gST->ConOut, New.Data);\r
+      gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);\r
     } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
+      gST->ConOut->SetAttribute (gST->ConOut, Orig.Data & 0x7F);\r
     }\r
 \r
     Pos = 10 + (Index * 3);\r
@@ -382,10 +323,9 @@ Returns:
     } else {\r
       ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"%x  ", Line->Buffer[Index]);\r
     }\r
-\r
   }\r
 \r
-  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
+  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data & 0x7F);\r
   while (Index < 0x08) {\r
     Pos = 10 + (Index * 3);\r
     ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"    ");\r
@@ -393,19 +333,18 @@ Returns:
   }\r
 \r
   while (Index < 0x10 && Index < Line->Size) {\r
-\r
     BeNewColor = FALSE;\r
 \r
     if (Selected) {\r
-      if (Index + 1 >= ColStart && Index + 1 <= ColEnd) {\r
+      if ((Index + 1 >= ColStart) && (Index + 1 <= ColEnd)) {\r
         BeNewColor = TRUE;\r
       }\r
     }\r
 \r
     if (BeNewColor) {\r
-      gST->ConOut->SetAttribute (gST->ConOut, New.Data);\r
+      gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);\r
     } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
+      gST->ConOut->SetAttribute (gST->ConOut, Orig.Data & 0x7F);\r
     }\r
 \r
     Pos = 10 + (Index * 3) + 1;\r
@@ -418,21 +357,22 @@ Returns:
     Index++;\r
   }\r
 \r
-  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
+  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data & 0x7F);\r
   while (Index < 0x10) {\r
     Pos = 10 + (Index * 3) + 1;\r
     ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"   ");\r
     Index++;\r
   }\r
+\r
   //\r
   // restore the original color\r
   //\r
-  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
+  gST->ConOut->SetAttribute (gST->ConOut, Orig.Data & 0x7F);\r
 \r
   //\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
@@ -440,7 +380,7 @@ Returns:
       // learned from shelle.h -- IsValidChar\r
       //\r
       if (Line->Buffer[Index] >= L' ') {\r
-        ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"%c", (CHAR16) Line->Buffer[Index]);\r
+        ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"%c", (CHAR16)Line->Buffer[Index]);\r
       } else {\r
         ShellPrintEx ((INT32)Pos - 1, (INT32)Row - 1, L"%c", '.');\r
       }\r
@@ -452,6 +392,7 @@ Returns:
       Index++;\r
     }\r
   }\r
+\r
   //\r
   // restore the abundant blank in hex edit area to original color\r
   //\r
@@ -471,10 +412,19 @@ 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
-  OUT UINTN *FCol\r
+  IN  UINTN  Column,\r
+  OUT UINTN  *FCol\r
   )\r
 {\r
   Column -= 10;\r
@@ -494,7 +444,7 @@ HBufferImageIsAtHighBits (
 \r
   *FCol = (Column / 3) + 1;\r
 \r
-  if (!(Column % 3)) {\r
+  if (Column % 3 == 0) {\r
     return TRUE;\r
   }\r
 \r
@@ -505,19 +455,28 @@ 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
-  IN UINTN MouseCol\r
+  IN UINTN  MouseRow,\r
+  IN UINTN  MouseCol\r
   )\r
 {\r
-  UINTN FRow;\r
-  UINTN RowStart;\r
-  UINTN RowEnd;\r
-  UINTN ColStart;\r
-  UINTN ColEnd;\r
-  UINTN MouseColStart;\r
-  UINTN MouseColEnd;\r
+  UINTN  FRow;\r
+  UINTN  RowStart;\r
+  UINTN  RowEnd;\r
+  UINTN  ColStart;\r
+  UINTN  ColEnd;\r
+  UINTN  MouseColStart;\r
+  UINTN  MouseColEnd;\r
 \r
   //\r
   // judge mouse position whether is in selected area\r
@@ -525,20 +484,21 @@ HBufferImageIsInSelectedArea (
   //\r
   // not select\r
   //\r
-  if (HMainEditor.SelectStart == 0 || HMainEditor.SelectEnd == 0) {\r
+  if ((HMainEditor.SelectStart == 0) || (HMainEditor.SelectEnd == 0)) {\r
     return FALSE;\r
   }\r
+\r
   //\r
   // calculate the select area\r
   //\r
-  RowStart  = (HMainEditor.SelectStart - 1) / 0x10 + 1;\r
-  RowEnd    = (HMainEditor.SelectEnd - 1) / 0x10 + 1;\r
+  RowStart = (HMainEditor.SelectStart - 1) / 0x10 + 1;\r
+  RowEnd   = (HMainEditor.SelectEnd - 1) / 0x10 + 1;\r
 \r
-  ColStart  = (HMainEditor.SelectStart - 1) % 0x10 + 1;\r
-  ColEnd    = (HMainEditor.SelectEnd - 1) % 0x10 + 1;\r
+  ColStart = (HMainEditor.SelectStart - 1) % 0x10 + 1;\r
+  ColEnd   = (HMainEditor.SelectEnd - 1) % 0x10 + 1;\r
 \r
-  FRow      = HBufferImage.LowVisibleRow + MouseRow - 2;\r
-  if (FRow < RowStart || FRow > RowEnd) {\r
+  FRow = HBufferImage.LowVisibleRow + MouseRow - 2;\r
+  if ((FRow < RowStart) || (FRow > RowEnd)) {\r
     return FALSE;\r
   }\r
 \r
@@ -560,33 +520,36 @@ HBufferImageIsInSelectedArea (
     MouseColEnd++;\r
   }\r
 \r
-  if (MouseCol < MouseColStart || MouseCol > MouseColEnd) {\r
+  if ((MouseCol < MouseColStart) || (MouseCol > MouseColEnd)) {\r
     return FALSE;\r
   }\r
 \r
   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
   )\r
 {\r
-  HEFI_EDITOR_COLOR_UNION Orig;\r
-  HEFI_EDITOR_COLOR_UNION New;\r
-  UINTN                   FRow;\r
-  UINTN                   FColumn;\r
-  BOOLEAN                 HasCharacter;\r
-  HEFI_EDITOR_LINE        *CurrentLine;\r
-  HEFI_EDITOR_LINE        *Line;\r
-  UINT8                   Value;\r
-  BOOLEAN                 HighBits;\r
+  HEFI_EDITOR_COLOR_UNION  Orig;\r
+  HEFI_EDITOR_COLOR_UNION  New;\r
+  UINTN                    FRow;\r
+  UINTN                    FColumn;\r
+  BOOLEAN                  HasCharacter;\r
+  HEFI_EDITOR_LINE         *CurrentLine;\r
+  HEFI_EDITOR_LINE         *Line;\r
+  UINT8                    Value;\r
+  BOOLEAN                  HighBits;\r
 \r
   Line = NULL;\r
   if (HMainEditor.MouseSupported) {\r
-\r
     if (HBufferImageMouseNeedRefresh) {\r
-\r
       HBufferImageMouseNeedRefresh = FALSE;\r
 \r
       //\r
@@ -594,50 +557,55 @@ HBufferImageRestoreMousePosition (
       // so do not need to refresh mouse position\r
       //\r
       if ((\r
-            HBufferImage.MousePosition.Row == HBufferImageBackupVar.MousePosition.Row &&\r
-          HBufferImage.MousePosition.Column == HBufferImageBackupVar.MousePosition.Column\r
-        ) &&\r
+           (HBufferImage.MousePosition.Row == HBufferImageBackupVar.MousePosition.Row) &&\r
+           (HBufferImage.MousePosition.Column == HBufferImageBackupVar.MousePosition.Column)\r
+           ) &&\r
           HEditorMouseAction\r
-          ) {\r
+          )\r
+      {\r
         return EFI_SUCCESS;\r
       }\r
+\r
       //\r
       // backup the old screen attributes\r
       //\r
       Orig                  = HMainEditor.ColorAttributes;\r
-      New.Colors.Foreground = Orig.Colors.Background;\r
-      New.Colors.Background = Orig.Colors.Foreground;\r
+      New.Data              = 0;\r
+      New.Colors.Foreground = Orig.Colors.Background & 0xF;\r
+      New.Colors.Background = Orig.Colors.Foreground & 0x7;\r
 \r
       //\r
       // if in selected area,\r
       // so do not need to refresh mouse\r
       //\r
       if (!HBufferImageIsInSelectedArea (\r
-            HBufferImageBackupVar.MousePosition.Row,\r
-            HBufferImageBackupVar.MousePosition.Column\r
-            )) {\r
+             HBufferImageBackupVar.MousePosition.Row,\r
+             HBufferImageBackupVar.MousePosition.Column\r
+             ))\r
+      {\r
         gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
       } else {\r
-        gST->ConOut->SetAttribute (gST->ConOut, New.Data);\r
+        gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);\r
       }\r
+\r
       //\r
       // clear the old mouse position\r
       //\r
       FRow = HBufferImage.LowVisibleRow + HBufferImageBackupVar.MousePosition.Row - 2;\r
 \r
       HighBits = HBufferImageIsAtHighBits (\r
-                  HBufferImageBackupVar.MousePosition.Column,\r
-                  &FColumn\r
-                  );\r
+                   HBufferImageBackupVar.MousePosition.Column,\r
+                   &FColumn\r
+                   );\r
 \r
       HasCharacter = TRUE;\r
-      if (FRow > HBufferImage.NumLines || FColumn == 0) {\r
+      if ((FRow > HBufferImage.NumLines) || (FColumn == 0)) {\r
         HasCharacter = FALSE;\r
       } else {\r
         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
@@ -652,10 +620,10 @@ HBufferImageRestoreMousePosition (
 \r
       if (HasCharacter) {\r
         if (HighBits) {\r
-          Value = (UINT8) (Line->Buffer[FColumn - 1] & 0xf0);\r
-          Value = (UINT8) (Value >> 4);\r
+          Value = (UINT8)(Line->Buffer[FColumn - 1] & 0xf0);\r
+          Value = (UINT8)(Value >> 4);\r
         } else {\r
-          Value = (UINT8) (Line->Buffer[FColumn - 1] & 0xf);\r
+          Value = (UINT8)(Line->Buffer[FColumn - 1] & 0xf);\r
         }\r
 \r
         ShellPrintEx (\r
@@ -667,31 +635,33 @@ HBufferImageRestoreMousePosition (
       }\r
 \r
       if (!HBufferImageIsInSelectedArea (\r
-            HBufferImage.MousePosition.Row,\r
-            HBufferImage.MousePosition.Column\r
-            )) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, New.Data);\r
+             HBufferImage.MousePosition.Row,\r
+             HBufferImage.MousePosition.Column\r
+             ))\r
+      {\r
+        gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);\r
       } else {\r
         gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
       }\r
+\r
       //\r
       // clear the old mouse position\r
       //\r
       FRow = HBufferImage.LowVisibleRow + HBufferImage.MousePosition.Row - 2;\r
 \r
       HighBits = HBufferImageIsAtHighBits (\r
-                  HBufferImage.MousePosition.Column,\r
-                  &FColumn\r
-                  );\r
+                   HBufferImage.MousePosition.Column,\r
+                   &FColumn\r
+                   );\r
 \r
       HasCharacter = TRUE;\r
-      if (FRow > HBufferImage.NumLines || FColumn == 0) {\r
+      if ((FRow > HBufferImage.NumLines) || (FColumn == 0)) {\r
         HasCharacter = FALSE;\r
       } else {\r
         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
@@ -706,10 +676,10 @@ HBufferImageRestoreMousePosition (
 \r
       if (HasCharacter) {\r
         if (HighBits) {\r
-          Value = (UINT8) (Line->Buffer[FColumn - 1] & 0xf0);\r
-          Value = (UINT8) (Value >> 4);\r
+          Value = (UINT8)(Line->Buffer[FColumn - 1] & 0xf0);\r
+          Value = (UINT8)(Value >> 4);\r
         } else {\r
-          Value = (UINT8) (Line->Buffer[FColumn - 1] & 0xf);\r
+          Value = (UINT8)(Line->Buffer[FColumn - 1] & 0xf);\r
         }\r
 \r
         ShellPrintEx (\r
@@ -719,87 +689,71 @@ HBufferImageRestoreMousePosition (
           Value\r
           );\r
       }\r
+\r
       //\r
       // end of HasCharacter\r
       //\r
       gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);\r
     }\r
+\r
     //\r
     // end of MouseNeedRefresh\r
     //\r
   }\r
+\r
   //\r
   // end of MouseSupported\r
   //\r
   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
   //\r
   gST->ConOut->SetCursorPosition (\r
-        gST->ConOut,\r
-        HBufferImage.DisplayPosition.Column - 1,\r
-        HBufferImage.DisplayPosition.Row - 1\r
-        );\r
+                 gST->ConOut,\r
+                 HBufferImage.DisplayPosition.Column - 1,\r
+                 HBufferImage.DisplayPosition.Row - 1\r
+                 );\r
 \r
   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 occurred.\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
-  UINTN                   Row;\r
-  HEFI_EDITOR_COLOR_UNION Orig;\r
-  HEFI_EDITOR_COLOR_UNION New;\r
-\r
-  UINTN                   StartRow;\r
-  UINTN                   EndRow;\r
-  UINTN                   FStartRow;\r
-  UINTN                   FEndRow;\r
-  UINTN                   Tmp;\r
+  LIST_ENTRY               *Link;\r
+  HEFI_EDITOR_LINE         *Line;\r
+  UINTN                    Row;\r
+  HEFI_EDITOR_COLOR_UNION  Orig;\r
+  HEFI_EDITOR_COLOR_UNION  New;\r
+\r
+  UINTN  StartRow;\r
+  UINTN  EndRow;\r
+  UINTN  FStartRow;\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
@@ -811,10 +765,11 @@ 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
-        HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow\r
-        ) {\r
+    if (!HBufferImageNeedRefresh &&\r
+        !HBufferImageOnlyLineNeedRefresh &&\r
+        (HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow)\r
+        )\r
+    {\r
       HBufferImageRestoreMousePosition ();\r
       HBufferImageRestorePosition ();\r
       return EFI_SUCCESS;\r
@@ -826,8 +781,7 @@ Returns:
   //\r
   // only need to refresh current line\r
   //\r
-  if (HBufferImageOnlyLineNeedRefresh == TRUE && HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow) {\r
-\r
+  if (HBufferImageOnlyLineNeedRefresh && (HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow)) {\r
     HBufferImagePrintLine (\r
       HBufferImage.CurrentLine,\r
       HBufferImage.DisplayPosition.Row,\r
@@ -839,9 +793,9 @@ Returns:
     //\r
     // the whole edit area need refresh\r
     //\r
-    if (HEditorMouseAction && HMainEditor.SelectStart != 0 && HMainEditor.SelectEnd != 0) {\r
+    if (HEditorMouseAction && (HMainEditor.SelectStart != 0) && (HMainEditor.SelectEnd != 0)) {\r
       if (HMainEditor.SelectStart != HMainEditorBackupVar.SelectStart) {\r
-        if (HMainEditor.SelectStart >= HMainEditorBackupVar.SelectStart && HMainEditorBackupVar.SelectStart != 0) {\r
+        if ((HMainEditor.SelectStart >= HMainEditorBackupVar.SelectStart) && (HMainEditorBackupVar.SelectStart != 0)) {\r
           StartRow = (HMainEditorBackupVar.SelectStart - 1) / 0x10 + 1;\r
         } else {\r
           StartRow = (HMainEditor.SelectStart - 1) / 0x10 + 1;\r
@@ -855,29 +809,29 @@ Returns:
       } else {\r
         EndRow = (HMainEditor.SelectEnd - 1) / 0x10 + 1;\r
       }\r
+\r
       //\r
       // swap\r
       //\r
       if (StartRow > EndRow) {\r
-        Tmp       = StartRow;\r
-        StartRow  = EndRow;\r
-        EndRow    = Tmp;\r
+        Tmp      = StartRow;\r
+        StartRow = EndRow;\r
+        EndRow   = Tmp;\r
       }\r
 \r
       FStartRow = StartRow;\r
-      FEndRow   = EndRow;\r
-\r
-      StartRow  = 2 + StartRow - HBufferImage.LowVisibleRow;\r
-      EndRow    = 2 + EndRow - HBufferImage.LowVisibleRow;\r
 \r
+      StartRow = 2 + StartRow - HBufferImage.LowVisibleRow;\r
+      EndRow   = 2 + EndRow - HBufferImage.LowVisibleRow;\r
     } else {\r
       //\r
       // not mouse selection actions\r
       //\r
       FStartRow = HBufferImage.LowVisibleRow;\r
       StartRow  = 2;\r
-      EndRow    = (HMainEditor.ScreenSize.Row - 4);\r
+      EndRow    = (HMainEditor.ScreenSize.Row - 1);\r
     }\r
+\r
     //\r
     // no line\r
     //\r
@@ -887,6 +841,7 @@ Returns:
       gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
       return EFI_SUCCESS;\r
     }\r
+\r
     //\r
     // get the first line that will be displayed\r
     //\r
@@ -896,8 +851,8 @@ Returns:
       return EFI_LOAD_ERROR;\r
     }\r
 \r
-    Link  = &(Line->Link);\r
-    Row   = StartRow;\r
+    Link = &(Line->Link);\r
+    Row  = StartRow;\r
     do {\r
       Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
 \r
@@ -917,9 +872,10 @@ 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
     //\r
     // while not file end and not screen full\r
     //\r
@@ -935,25 +891,40 @@ 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
 HBufferImageRead (\r
-  IN CONST CHAR16                   *FileName,\r
-  IN CONST CHAR16                   *DiskName,\r
-  IN UINTN                          DiskOffset,\r
-  IN UINTN                          DiskSize,\r
-  IN UINTN                          MemOffset,\r
-  IN UINTN                          MemSize,\r
-  IN EDIT_FILE_TYPE                 BufferType,\r
-  IN BOOLEAN                        Recover\r
+  IN CONST CHAR16    *FileName,\r
+  IN CONST CHAR16    *DiskName,\r
+  IN UINTN           DiskOffset,\r
+  IN UINTN           DiskSize,\r
+  IN UINTN           MemOffset,\r
+  IN UINTN           MemSize,\r
+  IN EDIT_FILE_TYPE  BufferType,\r
+  IN BOOLEAN         Recover\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EDIT_FILE_TYPE                  BufferTypeBackup;\r
+  EFI_STATUS      Status;\r
+  EDIT_FILE_TYPE  BufferTypeBackup;\r
 \r
   //\r
   // variable initialization\r
   //\r
-  Status = EFI_SUCCESS;\r
+  Status                  = EFI_SUCCESS;\r
+  HBufferImage.BufferType = BufferType;\r
 \r
   //\r
   // three types of buffer supported\r
@@ -964,17 +935,21 @@ HBufferImageRead (
   BufferTypeBackup = HBufferImage.BufferType;\r
 \r
   switch (BufferType) {\r
-  case FileTypeFileBuffer:\r
-    Status = HFileImageRead (FileName, Recover);\r
-    break;\r
+    case FileTypeFileBuffer:\r
+      Status = HFileImageRead (FileName, Recover);\r
+      break;\r
 \r
-  case FileTypeDiskBuffer:\r
-    Status = HDiskImageRead (DiskName, DiskOffset, DiskSize, Recover);\r
-    break;\r
+    case FileTypeDiskBuffer:\r
+      Status = HDiskImageRead (DiskName, DiskOffset, DiskSize, Recover);\r
+      break;\r
 \r
-  case FileTypeMemBuffer:\r
-    Status = HMemImageRead (MemOffset, MemSize, Recover);\r
-    break;\r
+    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
@@ -984,47 +959,64 @@ 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
-  IN CHAR16                         *DiskName,\r
-  IN UINTN                          DiskOffset,\r
-  IN UINTN                          DiskSize,\r
-  IN UINTN                          MemOffset,\r
-  IN UINTN                          MemSize,\r
-  IN EDIT_FILE_TYPE                 BufferType\r
+  IN CHAR16          *FileName,\r
+  IN CHAR16          *DiskName,\r
+  IN UINTN           DiskOffset,\r
+  IN UINTN           DiskSize,\r
+  IN UINTN           MemOffset,\r
+  IN UINTN           MemSize,\r
+  IN EDIT_FILE_TYPE  BufferType\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  EDIT_FILE_TYPE                  BufferTypeBackup;\r
+  EFI_STATUS      Status;\r
+  EDIT_FILE_TYPE  BufferTypeBackup;\r
 \r
   //\r
   // variable initialization\r
   //\r
-  Status            = EFI_SUCCESS;\r
-  BufferTypeBackup  = HBufferImage.BufferType;\r
+  Status           = EFI_SUCCESS;\r
+  BufferTypeBackup = HBufferImage.BufferType;\r
 \r
   switch (HBufferImage.BufferType) {\r
-  //\r
-  // file buffer\r
-  //\r
-  case FileTypeFileBuffer:\r
-    Status = HFileImageSave (FileName);\r
-    break;\r
+    //\r
+    // file buffer\r
+    //\r
+    case FileTypeFileBuffer:\r
+      Status = HFileImageSave (FileName);\r
+      break;\r
 \r
-  //\r
-  // disk buffer\r
-  //\r
-  case FileTypeDiskBuffer:\r
-    Status = HDiskImageSave (DiskName, DiskOffset, DiskSize);\r
-    break;\r
+    //\r
+    // disk buffer\r
+    //\r
+    case FileTypeDiskBuffer:\r
+      Status = HDiskImageSave (DiskName, DiskOffset, DiskSize);\r
+      break;\r
 \r
-  //\r
-  // memory buffer\r
-  //\r
-  case FileTypeMemBuffer:\r
-    Status = HMemImageSave (MemOffset, MemSize);\r
-    break;\r
+    //\r
+    // memory buffer\r
+    //\r
+    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
@@ -1034,29 +1026,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
-\r
-Returns:  \r
+    Lines\r
 \r
-  NULL -- create line failed\r
-  Not NULL -- the line created\r
+  @retval NULL    create line failed.\r
+  @return         the line created.\r
 \r
---*/\r
+**/\r
+HEFI_EDITOR_LINE *\r
+HBufferImageCreateLine (\r
+  VOID\r
+  )\r
 {\r
   HEFI_EDITOR_LINE  *Line;\r
 \r
@@ -1080,36 +1063,25 @@ Returns:
 \r
   if (HBufferImage.Lines == NULL) {\r
     HBufferImage.Lines = CR (\r
-                          HBufferImage.ListHead->ForwardLink,\r
-                          HEFI_EDITOR_LINE,\r
-                          Link,\r
-                          EFI_EDITOR_LINE_LIST\r
-                          );\r
+                           HBufferImage.ListHead->ForwardLink,\r
+                           HEFI_EDITOR_LINE,\r
+                           Link,\r
+                           EFI_EDITOR_LINE_LIST\r
+                           );\r
   }\r
 \r
   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
@@ -1119,324 +1091,140 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HBufferImageHandleInput (\r
-  IN  EFI_INPUT_KEY *Key\r
-  )\r
-/*++\r
+/**\r
+  change char to int value based on Hex.\r
 \r
-Routine Description: \r
+  @param[in] Char     The input char.\r
 \r
-  Dispatch input to different handler\r
+  @return The character's index value.\r
+  @retval -1  The operation failed.\r
+**/\r
+INTN\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 (Char - L'0');\r
+  }\r
+\r
+  if ((Char >= L'a') && (Char <= L'f')) {\r
+    return (Char - L'a' + 10);\r
+  }\r
 \r
-Arguments:  \r
+  if ((Char >= L'A') && (Char <= L'F')) {\r
+    return (Char - L'A' + 10);\r
+  }\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
+  return -1;\r
+}\r
 \r
-Returns:  \r
+/**\r
+  Add character.\r
 \r
-  EFI_SUCCESS\r
-  EFI_LOAD_ERROR\r
-  EFI_OUT_OF_RESOURCES\r
+  @param[in] Char -- input char.\r
 \r
---*/\r
+  @retval EFI_SUCCESS             The operation was successful.\r
+  @retval EFI_OUT_OF_RESOURCES    A memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+HBufferImageAddChar (\r
+  IN  CHAR16  Char\r
+  )\r
 {\r
-  EFI_STATUS  Status;\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
-  Status = EFI_SUCCESS;\r
+  Value = HBufferImageCharToHex (Char);\r
 \r
-  switch (Key->ScanCode) {\r
   //\r
-  // ordinary key\r
+  // invalid input\r
   //\r
-  case SCAN_NULL:\r
-    Status = HBufferImageDoCharInput (Key->UnicodeChar);\r
-    break;\r
+  if (Value == -1) {\r
+    return EFI_SUCCESS;\r
+  }\r
 \r
-  //\r
-  // up arrow\r
-  //\r
-  case SCAN_UP:\r
-    Status = HBufferImageScrollUp ();\r
-    break;\r
+  Line = HBufferImage.CurrentLine;\r
+  FRow = HBufferImage.BufferPosition.Row;\r
+  FCol = HBufferImage.BufferPosition.Column;\r
+  High = HBufferImage.HighBits;\r
 \r
   //\r
-  // down arrow\r
+  // only needs to refresh current line\r
   //\r
-  case SCAN_DOWN:\r
-    Status = HBufferImageScrollDown ();\r
-    break;\r
+  HBufferImageOnlyLineNeedRefresh = TRUE;\r
 \r
   //\r
-  // right arrow\r
+  // not a full line and beyond the last character\r
   //\r
-  case SCAN_RIGHT:\r
-    Status = HBufferImageScrollRight ();\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
+    Old = Line->Buffer[FCol - 1];\r
 \r
-  //\r
-  // left arrow\r
-  //\r
-  case SCAN_LEFT:\r
-    Status = HBufferImageScrollLeft ();\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
-  //\r
-  // page up\r
-  //\r
-  case SCAN_PAGE_UP:\r
-    Status = HBufferImagePageUp ();\r
-    break;\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
+      HBufferImageOnlyLineNeedRefresh = FALSE;\r
+      HBufferImageNeedRefresh         = TRUE;\r
 \r
-  //\r
-  // page down\r
-  //\r
-  case SCAN_PAGE_DOWN:\r
-    Status = HBufferImagePageDown ();\r
-    break;\r
+      if (Line->Link.ForwardLink == HBufferImage.ListHead) {\r
+        //\r
+        // last line\r
+        //\r
+        // create a new line\r
+        //\r
+        NewLine = HBufferImageCreateLine ();\r
+        if (NewLine == NULL) {\r
+          return EFI_OUT_OF_RESOURCES;\r
+        }\r
 \r
-  //\r
-  // delete\r
-  //\r
-  case SCAN_DELETE:\r
-    Status = HBufferImageDoDelete ();\r
-    break;\r
+        //\r
+        // end of NULL\r
+        //\r
+      }\r
 \r
-  //\r
-  // home\r
-  //\r
-  case SCAN_HOME:\r
-    Status = HBufferImageHome ();\r
-    break;\r
+      //\r
+      // end of == ListHead\r
+      //\r
+    }\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
-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
-\r
-      if (Line->Link.ForwardLink == HBufferImage.ListHead) {\r
-        //\r
-        // last line\r
-        //\r
-        // create a new line\r
-        //\r
-        NewLine = HBufferImageCreateLine ();\r
-        if (NewLine == NULL) {\r
-          return EFI_OUT_OF_RESOURCES;\r
-        }\r
-        //\r
-        // end of NULL\r
-        //\r
-      }\r
-      //\r
-      // end of == ListHead\r
-      //\r
-    }\r
     //\r
     // end of == 0x10\r
     //\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
       FRow++;\r
-      FCol  = 1;\r
-      High  = TRUE;\r
+      FCol = 1;\r
+      High = TRUE;\r
     } else {\r
       //\r
       // if not at end of this line, just move to next column\r
@@ -1450,12 +1238,13 @@ Returns:
       } else {\r
         High = TRUE;\r
       }\r
-\r
     }\r
+\r
     //\r
     // end of ==FALSE\r
     //\r
   }\r
+\r
   //\r
   // move cursor to right\r
   //\r
@@ -1468,128 +1257,184 @@ 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
+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 occurred.\r
+  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.\r
+**/\r
+EFI_STATUS\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
-BOOLEAN\r
-HUnderCurrentScreen (\r
-  IN  UINTN FileRow\r
-  )\r
-/*++\r
+/**\r
+  Check user specified FileRow is above current screen.\r
 \r
-Routine Description: \r
+  @param[in] FileRow  Row of file position ( start from 1 ).\r
 \r
-  Check user specified FileRow is under current screen\r
+  @retval TRUE   It is above the current screen.\r
+  @retval FALSE  It is not above the current screen.\r
 \r
-Arguments:  \r
+**/\r
+BOOLEAN\r
+HAboveCurrentScreen (\r
+  IN  UINTN  FileRow\r
+  )\r
+{\r
+  if (FileRow < HBufferImage.LowVisibleRow) {\r
+    return TRUE;\r
+  }\r
 \r
-  FileRow -- Row of file position ( start from 1 )\r
+  return FALSE;\r
+}\r
+\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
+  if (FileRow > HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 2) - 1) {\r
     return TRUE;\r
   }\r
 \r
   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
-  BOOLEAN Above;\r
-  BOOLEAN Under;\r
-  UINTN   NewDisplayCol;\r
+  INTN     RowGap;\r
+  UINTN    Abs;\r
+  BOOLEAN  Above;\r
+  BOOLEAN  Under;\r
+  UINTN    NewDisplayCol;\r
 \r
   //\r
   // CALCULATE gap between current file position and new file position\r
   //\r
-  RowGap                = NewFilePosRow - HBufferImage.BufferPosition.Row;\r
+  RowGap = NewFilePosRow - HBufferImage.BufferPosition.Row;\r
 \r
-  Under                 = HUnderCurrentScreen (NewFilePosRow);\r
-  Above                 = HAboveCurrentScreen (NewFilePosRow);\r
+  Under = HUnderCurrentScreen (NewFilePosRow);\r
+  Above = HAboveCurrentScreen (NewFilePosRow);\r
 \r
   HBufferImage.HighBits = HighBits;\r
 \r
@@ -1619,12 +1464,11 @@ 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
       }\r
-\r
     }\r
   }\r
 \r
@@ -1633,14 +1477,14 @@ Returns:
   //\r
   // always in current screen\r
   //\r
-  HBufferImage.BufferPosition.Column  = NewFilePosCol;\r
+  HBufferImage.BufferPosition.Column = NewFilePosCol;\r
 \r
-  NewDisplayCol                       = 10 + (NewFilePosCol - 1) * 3;\r
+  NewDisplayCol = 10 + (NewFilePosCol - 1) * 3;\r
   if (NewFilePosCol > 0x8) {\r
     NewDisplayCol++;\r
   }\r
 \r
-  if (HighBits == FALSE) {\r
+  if (!HighBits) {\r
     NewDisplayCol++;\r
   }\r
 \r
@@ -1650,28 +1494,17 @@ Returns:
   // let CurrentLine point to correct line;\r
   //\r
   HBufferImage.CurrentLine = HMoveCurrentLine (RowGap);\r
-\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
@@ -1694,6 +1527,7 @@ Returns:
   if (FCol > Line->Size) {\r
     return EFI_SUCCESS;\r
   }\r
+\r
   //\r
   // if already at end of this line, scroll it to the start of next line\r
   //\r
@@ -1704,7 +1538,6 @@ Returns:
     if (Line->Link.ForwardLink != HBufferImage.ListHead) {\r
       FRow++;\r
       FCol = 1;\r
-\r
     } else {\r
       return EFI_SUCCESS;\r
     }\r
@@ -1713,7 +1546,6 @@ Returns:
     // if not at end of this line, just move to next column\r
     //\r
     FCol++;\r
-\r
   }\r
 \r
   HBufferImageMovePosition (FRow, FCol, TRUE);\r
@@ -1721,27 +1553,16 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Scroll cursor to left.\r
+\r
+  @retval EFI_SUCCESS   The operation was successful.\r
+**/\r
 EFI_STATUS\r
 HBufferImageScrollLeft (\r
   VOID\r
   )\r
-/*++\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
 {\r
-\r
   HEFI_EDITOR_LINE  *Line;\r
   UINTN             FRow;\r
   UINTN             FCol;\r
@@ -1763,8 +1584,8 @@ Returns:
     //\r
     if (Line->Link.BackLink != HBufferImage.ListHead) {\r
       FRow--;\r
-      Line  = CR (Line->Link.BackLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
-      FCol  = Line->Size;\r
+      Line = CR (Line->Link.BackLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
+      FCol = Line->Size;\r
     } else {\r
       return EFI_SUCCESS;\r
     }\r
@@ -1780,36 +1601,26 @@ 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
   UINTN             FCol;\r
   BOOLEAN           HighBits;\r
 \r
-  Line      = HBufferImage.CurrentLine;\r
+  Line = HBufferImage.CurrentLine;\r
 \r
-  FRow      = HBufferImage.BufferPosition.Row;\r
-  FCol      = HBufferImage.BufferPosition.Column;\r
-  HighBits  = HBufferImage.HighBits;\r
+  FRow     = HBufferImage.BufferPosition.Row;\r
+  FCol     = HBufferImage.BufferPosition.Column;\r
+  HighBits = HBufferImage.HighBits;\r
 \r
   //\r
   // has next line\r
@@ -1822,10 +1633,9 @@ Returns:
     // if the next line is not that long, so move to end of next line\r
     //\r
     if (FCol > Line->Size) {\r
-      FCol      = Line->Size + 1;\r
-      HighBits  = TRUE;\r
+      FCol     = Line->Size + 1;\r
+      HighBits = TRUE;\r
     }\r
-\r
   } else {\r
     return EFI_SUCCESS;\r
   }\r
@@ -1835,41 +1645,30 @@ 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
   UINTN             FCol;\r
 \r
-  Line  = HBufferImage.CurrentLine;\r
+  Line = HBufferImage.CurrentLine;\r
 \r
-  FRow  = HBufferImage.BufferPosition.Row;\r
-  FCol  = HBufferImage.BufferPosition.Column;\r
+  FRow = HBufferImage.BufferPosition.Row;\r
+  FCol = HBufferImage.BufferPosition.Column;\r
 \r
   //\r
   // has previous line\r
   //\r
   if (Line->Link.BackLink != HBufferImage.ListHead) {\r
     FRow--;\r
-\r
   } else {\r
     return EFI_SUCCESS;\r
   }\r
@@ -1879,25 +1678,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
@@ -1905,23 +1694,24 @@ Returns:
   UINTN             Gap;\r
   BOOLEAN           HighBits;\r
 \r
-  Line      = HBufferImage.CurrentLine;\r
+  Line = HBufferImage.CurrentLine;\r
 \r
-  FRow      = HBufferImage.BufferPosition.Row;\r
-  FCol      = HBufferImage.BufferPosition.Column;\r
-  HighBits  = HBufferImage.HighBits;\r
+  FRow     = HBufferImage.BufferPosition.Row;\r
+  FCol     = HBufferImage.BufferPosition.Column;\r
+  HighBits = HBufferImage.HighBits;\r
 \r
   //\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
     //\r
     Gap = HBufferImage.NumLines - FRow;\r
   }\r
+\r
   //\r
   // get correct line\r
   //\r
@@ -1930,9 +1720,9 @@ Returns:
   //\r
   // if that line, is not that long, so move to the end of that line\r
   //\r
-  if (FCol > Line->Size) {\r
-    FCol      = Line->Size + 1;\r
-    HighBits  = TRUE;\r
+  if ((Line != NULL) && (FCol > Line->Size)) {\r
+    FCol     = Line->Size + 1;\r
+    HighBits = TRUE;\r
   }\r
 \r
   FRow += Gap;\r
@@ -1942,42 +1732,29 @@ 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
-  UINTN             FCol;\r
-  UINTN             Gap;\r
-  INTN              Retreat;\r
-\r
-  Line  = HBufferImage.CurrentLine;\r
+  UINTN  FRow;\r
+  UINTN  FCol;\r
+  UINTN  Gap;\r
+  INTN   Retreat;\r
 \r
-  FRow  = HBufferImage.BufferPosition.Row;\r
-  FCol  = HBufferImage.BufferPosition.Column;\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
@@ -1988,11 +1765,6 @@ Returns:
   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
@@ -2000,39 +1772,26 @@ 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
-  UINTN             FCol;\r
-  BOOLEAN           HighBits;\r
-\r
-  Line = HBufferImage.CurrentLine;\r
+  UINTN    FRow;\r
+  UINTN    FCol;\r
+  BOOLEAN  HighBits;\r
 \r
   //\r
   // curosr will at the high bit\r
   //\r
-  FRow      = HBufferImage.BufferPosition.Row;\r
-  FCol      = 1;\r
-  HighBits  = TRUE;\r
+  FRow     = HBufferImage.BufferPosition.Row;\r
+  FCol     = 1;\r
+  HighBits = TRUE;\r
 \r
   //\r
   // move cursor position\r
@@ -2042,25 +1801,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
@@ -2070,19 +1819,20 @@ Returns:
   //\r
   // need refresh mouse\r
   //\r
-  HBufferImageMouseNeedRefresh  = TRUE;\r
+  HBufferImageMouseNeedRefresh = TRUE;\r
 \r
-  Line                          = HBufferImage.CurrentLine;\r
+  Line = HBufferImage.CurrentLine;\r
 \r
-  FRow                          = HBufferImage.BufferPosition.Row;\r
+  FRow = HBufferImage.BufferPosition.Row;\r
 \r
   if (Line->Size == 0x10) {\r
-    FCol      = Line->Size;\r
-    HighBits  = FALSE;\r
+    FCol     = Line->Size;\r
+    HighBits = FALSE;\r
   } else {\r
-    FCol      = Line->Size + 1;\r
-    HighBits  = TRUE;\r
+    FCol     = Line->Size + 1;\r
+    HighBits = TRUE;\r
   }\r
+\r
   //\r
   // move cursor position\r
   //\r
@@ -2091,12 +1841,17 @@ 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
   )\r
 {\r
-  UINTN             Size;\r
+  UINTN  Size;\r
 \r
   HEFI_EDITOR_LINE  *Line;\r
 \r
@@ -2108,11 +1863,11 @@ HBufferImageGetTotalSize (
   }\r
 \r
   Line = CR (\r
-          HBufferImage.ListHead->BackLink,\r
-          HEFI_EDITOR_LINE,\r
-          Link,\r
-          EFI_EDITOR_LINE_LIST\r
-          );\r
+           HBufferImage.ListHead->BackLink,\r
+           HEFI_EDITOR_LINE,\r
+           Link,\r
+           EFI_EDITOR_LINE_LIST\r
+           );\r
   //\r
   // one line at most 0x10\r
   //\r
@@ -2121,53 +1876,40 @@ 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
+  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
+  UINTN  Index;\r
 \r
-  VOID              *Buffer;\r
-  UINT8             *BufferPtr;\r
-  UINTN             Size;\r
+  VOID   *Buffer;\r
+  UINT8  *BufferPtr;\r
+  UINTN  Size;\r
 \r
   HEFI_EDITOR_LINE  *Line;\r
-  LIST_ENTRY    *Link;\r
-  UINTN             StartRow;\r
-\r
-  UINTN             OldFCol;\r
-  UINTN             OldFRow;\r
-  UINTN             OldPos;\r
+  LIST_ENTRY        *Link;\r
 \r
-  UINTN             NewPos;\r
+  UINTN  OldFCol;\r
+  UINTN  OldFRow;\r
+  UINTN  OldPos;\r
 \r
-  EFI_STATUS        Status;\r
+  UINTN  NewPos;\r
 \r
-  //\r
-  // get the line that start position is at\r
-  //\r
-  StartRow  = Pos / 0x10;\r
+  EFI_STATUS  Status;\r
 \r
-  Size      = HBufferImageGetTotalSize ();\r
+  Size = HBufferImageGetTotalSize ();\r
 \r
   if (Size < Count) {\r
     return EFI_LOAD_ERROR;\r
@@ -2190,7 +1932,6 @@ Returns:
     // so locate according to block's previous character\r
     //\r
     NewPos = Pos - 1;\r
-\r
   } else {\r
     //\r
     // has no character before it,\r
@@ -2208,7 +1949,7 @@ Returns:
 \r
   HBufferImageListToBuffer (Buffer, Size);\r
 \r
-  BufferPtr = (UINT8 *) Buffer;\r
+  BufferPtr = (UINT8 *)Buffer;\r
 \r
   //\r
   // pass deleted buffer out\r
@@ -2218,6 +1959,7 @@ Returns:
       DeleteBuffer[Index] = BufferPtr[Pos + Index];\r
     }\r
   }\r
+\r
   //\r
   // delete the part from Pos\r
   //\r
@@ -2241,14 +1983,14 @@ Returns:
     Link = Link->ForwardLink;\r
   }\r
 \r
-  Line                      = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
-  HBufferImage.CurrentLine  = Line;\r
+  Line                     = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
+  HBufferImage.CurrentLine = Line;\r
 \r
   //\r
   // if current cursor position if inside select area\r
   // then move it to the block's NEXT character\r
   //\r
-  if (OldPos >= Pos && OldPos < (Pos + Count)) {\r
+  if ((OldPos >= Pos) && (OldPos < (Pos + Count))) {\r
     NewPos = Pos;\r
   } else {\r
     if (OldPos < Pos) {\r
@@ -2263,52 +2005,39 @@ 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
+  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
+  INTN  Index;\r
 \r
-  VOID              *Buffer;\r
-  UINT8             *BufferPtr;\r
-  UINTN             Size;\r
+  VOID   *Buffer;\r
+  UINT8  *BufferPtr;\r
+  UINTN  Size;\r
 \r
   HEFI_EDITOR_LINE  *Line;\r
 \r
-  LIST_ENTRY    *Link;\r
-  UINTN             StartRow;\r
-\r
-  UINTN             OldFCol;\r
-  UINTN             OldFRow;\r
-  UINTN             OldPos;\r
+  LIST_ENTRY  *Link;\r
 \r
-  UINTN             NewPos;\r
+  UINTN  OldFCol;\r
+  UINTN  OldFRow;\r
+  UINTN  OldPos;\r
 \r
-  //\r
-  // get the line that start position is at\r
-  //\r
-  StartRow  = Pos / 0x10;\r
+  UINTN  NewPos;\r
 \r
-  Size      = HBufferImageGetTotalSize ();\r
+  Size = HBufferImageGetTotalSize ();\r
 \r
   //\r
   // relocate all the HBufferImage fields\r
@@ -2335,18 +2064,19 @@ Returns:
 \r
   HBufferImageListToBuffer (Buffer, Size);\r
 \r
-  BufferPtr = (UINT8 *) Buffer;\r
+  BufferPtr = (UINT8 *)Buffer;\r
 \r
   //\r
   // get a place to add\r
   //\r
-  for (Index = (INTN) (Size + Count - 1); Index >= (INTN) Pos; Index--) {\r
+  for (Index = (INTN)(Size + Count - 1); Index >= (INTN)Pos; Index--) {\r
     BufferPtr[Index] = BufferPtr[Index - Count];\r
   }\r
+\r
   //\r
   // add the buffer\r
   //\r
-  for (Index = (INTN) 0; Index < (INTN) Count; Index++) {\r
+  for (Index = (INTN)0; Index < (INTN)Count; Index++) {\r
     BufferPtr[Index + Pos] = AddBuffer[Index];\r
   }\r
 \r
@@ -2359,12 +2089,12 @@ Returns:
   FreePool (Buffer);\r
 \r
   Link = HMainEditor.BufferImage->ListHead->ForwardLink;\r
-  for (Index = 0; Index < (INTN) NewPos / 0x10; Index++) {\r
+  for (Index = 0; Index < (INTN)NewPos / 0x10; Index++) {\r
     Link = Link->ForwardLink;\r
   }\r
 \r
-  Line                      = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
-  HBufferImage.CurrentLine  = Line;\r
+  Line                     = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
+  HBufferImage.CurrentLine = Line;\r
 \r
   if (OldPos >= Pos) {\r
     NewPos = OldPos + Count;\r
@@ -2377,107 +2107,27 @@ 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
 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
 \r
-  BOOLEAN           LastLine;\r
-  UINTN             FileColumn;\r
-  UINTN             FPos;\r
+  BOOLEAN  LastLine;\r
+  UINTN    FileColumn;\r
+  UINTN    FPos;\r
 \r
-  FPos        = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
+  FPos = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
 \r
-  FileColumn  = HBufferImage.BufferPosition.Column;\r
+  FileColumn = HBufferImage.BufferPosition.Column;\r
 \r
-  Line        = HBufferImage.CurrentLine;\r
+  Line = HBufferImage.CurrentLine;\r
 \r
   //\r
   // if beyond the last character\r
@@ -2512,30 +2162,39 @@ 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
 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
+  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
@@ -2548,17 +2207,16 @@ 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
 \r
   //\r
   // last line is a full line, SO create a new line\r
   //\r
-  if (Left == 0x10 || Bytes == 0) {\r
+  if ((Left == 0x10) || (Bytes == 0)) {\r
     Line = HBufferImageCreateLine ();\r
     if (Line == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
@@ -2568,6 +2226,14 @@ 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
 HBufferImageListToBuffer (\r
   IN VOID   *Buffer,\r
@@ -2577,7 +2243,7 @@ HBufferImageListToBuffer (
   UINTN             Count;\r
   UINTN             Index;\r
   HEFI_EDITOR_LINE  *Line;\r
-  LIST_ENTRY    *Link;\r
+  LIST_ENTRY        *Link;\r
   UINT8             *BufferPtr;\r
 \r
   //\r
@@ -2589,15 +2255,15 @@ HBufferImageListToBuffer (
 \r
   Link      = &HBufferImage.Lines->Link;\r
   Count     = 0;\r
-  BufferPtr = (UINT8 *) Buffer;\r
+  BufferPtr = (UINT8 *)Buffer;\r
 \r
   //\r
   // deal line by line\r
   //\r
   while (Link != HBufferImage.ListHead) {\r
-\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
@@ -2606,7 +2272,7 @@ HBufferImageListToBuffer (
       BufferPtr[Index] = Line->Buffer[Index];\r
     }\r
 \r
-    Count += Line->Size;\r
+    Count     += Line->Size;\r
     BufferPtr += Line->Size;\r
 \r
     Link = Link->ForwardLink;\r
@@ -2615,31 +2281,38 @@ 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
 HBufferImageAdjustMousePosition (\r
-  IN INT32 TextX,\r
-  IN INT32 TextY\r
+  IN INT32  TextX,\r
+  IN INT32  TextY\r
   )\r
 {\r
-  UINTN X;\r
-  UINTN Y;\r
-  UINTN AbsX;\r
-  UINTN AbsY;\r
+  UINTN  TempX;\r
+  UINTN  TempY;\r
+  UINTN  AbsX;\r
+  UINTN  AbsY;\r
 \r
   //\r
   // TextX and TextY is mouse movement data returned by mouse driver\r
   // 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
   } else {\r
     AbsX = -TextX;\r
   }\r
+\r
   //\r
-  // get absolute Y value\r
+  // get absolute TempY value\r
   //\r
   if (TextY >= 0) {\r
     AbsY = TextY;\r
@@ -2647,49 +2320,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
   //\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
   //\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 - 1))) {\r
+    HBufferImage.MousePosition.Row = TempY;\r
+  } else if (TempY < 2) {\r
     HBufferImage.MousePosition.Row = 2;\r
-  } else if (Y > (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
+  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 occurred.\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