/** @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
//\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
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
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
// 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
\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
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
} 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
}\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
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
// 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
Index++;\r
}\r
}\r
+\r
//\r
// restore the abundant blank in hex edit area to original color\r
//\r
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
\r
*FCol = (Column / 3) + 1;\r
\r
- if (!(Column % 3)) {\r
+ if (Column % 3 == 0) {\r
return TRUE;\r
}\r
\r
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
//\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
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
// 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
\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
}\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
\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
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
// 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
//\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
//\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
} 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
gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
return EFI_SUCCESS;\r
}\r
+\r
//\r
// get the first line that will be displayed\r
//\r
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
} 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
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
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
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
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
\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
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
} else {\r
High = TRUE;\r
}\r
-\r
}\r
+\r
//\r
// end of ==FALSE\r
//\r
}\r
+\r
//\r
// move cursor to right\r
//\r
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
//\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
//\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
// 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
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
if (Line->Link.ForwardLink != HBufferImage.ListHead) {\r
FRow++;\r
FCol = 1;\r
-\r
} else {\r
return EFI_SUCCESS;\r
}\r
// if not at end of this line, just move to next column\r
//\r
FCol++;\r
-\r
}\r
\r
HBufferImageMovePosition (FRow, FCol, TRUE);\r
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
//\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
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
// 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
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
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
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
//\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
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
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
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
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
//\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
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
}\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
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
// so locate according to block's previous character\r
//\r
NewPos = Pos - 1;\r
-\r
} else {\r
//\r
// has no character before it,\r
\r
HBufferImageListToBuffer (Buffer, Size);\r
\r
- BufferPtr = (UINT8 *) Buffer;\r
+ BufferPtr = (UINT8 *)Buffer;\r
\r
//\r
// pass deleted buffer out\r
DeleteBuffer[Index] = BufferPtr[Pos + Index];\r
}\r
}\r
+\r
//\r
// delete the part from Pos\r
//\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
//\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
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
\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
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
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
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
\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
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
UINTN Count;\r
UINTN Index;\r
HEFI_EDITOR_LINE *Line;\r
- LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link;\r
UINT8 *BufferPtr;\r
\r
//\r
\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
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
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
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