/** @file\r
Implements filebuffer interface functions.\r
\r
- Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
+ Copyright (c) 2005 - 2016, 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
//\r
// the whole edit area needs to be refreshed\r
//\r
-STATIC BOOLEAN FileBufferNeedRefresh;\r
+BOOLEAN FileBufferNeedRefresh; \r
\r
//\r
// only the current line in edit area needs to be refresh\r
@param EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferInit (\r
VOID\r
)\r
@retval EFI_SUCCESS The backup operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferBackup (\r
VOID\r
)\r
@return The line structure after the advance.\r
**/\r
EFI_EDITOR_LINE *\r
-EFIAPI\r
InternalEditorMiscLineAdvance (\r
IN CONST UINTN Count,\r
IN CONST EFI_EDITOR_LINE *CurrentLine,\r
@return The line structure after the retreat.\r
**/\r
EFI_EDITOR_LINE *\r
-EFIAPI\r
InternalEditorMiscLineRetreat (\r
IN CONST UINTN Count,\r
IN CONST EFI_EDITOR_LINE *CurrentLine,\r
// if > 0, the advance\r
//\r
if (Count <= 0) {\r
- AbsCount = -Count;\r
+ AbsCount = (UINTN)ABS(Count);\r
Line = InternalEditorMiscLineRetreat (AbsCount,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
} else {\r
- Line = InternalEditorMiscLineAdvance (Count,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
+ Line = InternalEditorMiscLineAdvance ((UINTN)Count,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
}\r
\r
return Line;\r
@retval EFI_SUCCESS The backup operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferRestoreMousePosition (\r
VOID\r
)\r
// backup the old screen attributes\r
//\r
Orig = MainEditor.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
// clear the old mouse position\r
CurrentLine = FileBuffer.CurrentLine;\r
Line = MoveLine (FRow - FileBuffer.FilePosition.Row);\r
\r
- if (FColumn > Line->Size) {\r
+ if (Line == NULL || FColumn > Line->Size) {\r
HasCharacter = FALSE;\r
}\r
\r
//\r
// set the new mouse position\r
//\r
- gST->ConOut->SetAttribute (gST->ConOut, New.Data);\r
+ gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);\r
\r
//\r
// clear the old mouse position\r
CurrentLine = FileBuffer.CurrentLine;\r
Line = MoveLine (FRow - FileBuffer.FilePosition.Row);\r
\r
- if (FColumn > Line->Size) {\r
+ if (Line == NULL || FColumn > Line->Size) {\r
HasCharacter = FALSE;\r
}\r
\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferFreeLines (\r
VOID\r
)\r
@retval EFI_SUCCESS The cleanup was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferCleanup (\r
VOID\r
)\r
\r
CHAR16 *Buffer;\r
UINTN Limit;\r
- CHAR16 PrintLine[200];\r
+ CHAR16 *PrintLine;\r
+ CHAR16 *PrintLine2;\r
+ UINTN BufLen; \r
\r
//\r
// print start from correct character\r
Limit = 0;\r
}\r
\r
- StrnCpy (PrintLine, Buffer, Limit > MainEditor.ScreenSize.Column ? MainEditor.ScreenSize.Column : Limit);\r
- for (; Limit < MainEditor.ScreenSize.Column; Limit++) {\r
- PrintLine[Limit] = L' ';\r
- }\r
+ BufLen = (MainEditor.ScreenSize.Column + 1) * sizeof (CHAR16);\r
+ PrintLine = AllocatePool (BufLen);\r
+ if (PrintLine != NULL) {\r
+ StrnCpyS (PrintLine, BufLen/sizeof(CHAR16), Buffer, MIN(Limit, MainEditor.ScreenSize.Column));\r
+ for (; Limit < MainEditor.ScreenSize.Column; Limit++) {\r
+ PrintLine[Limit] = L' ';\r
+ }\r
\r
- PrintLine[MainEditor.ScreenSize.Column] = CHAR_NULL;\r
+ PrintLine[MainEditor.ScreenSize.Column] = CHAR_NULL;\r
\r
- ShellPrintEx (\r
- 0,\r
- (INT32)Row - 1,\r
- L"%s",\r
- PrintLine\r
- );\r
+ PrintLine2 = AllocatePool (BufLen * 2);\r
+ if (PrintLine2 != NULL) {\r
+ ShellCopySearchAndReplace(PrintLine, PrintLine2, BufLen * 2, L"%", L"^%", FALSE, FALSE);\r
+\r
+ ShellPrintEx (\r
+ 0,\r
+ (INT32)Row - 1,\r
+ L"%s",\r
+ PrintLine2\r
+ );\r
+ FreePool (PrintLine2);\r
+ }\r
+ FreePool (PrintLine);\r
+ }\r
\r
return EFI_SUCCESS;\r
}\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferRestorePosition (\r
VOID\r
)\r
@retval EFI_LOAD_ERROR There was an error finding what to write.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferRefresh (\r
VOID\r
)\r
\r
Link = Link->ForwardLink;\r
Row++;\r
- } while (Link != FileBuffer.ListHead && Row <= (MainEditor.ScreenSize.Row - 4));\r
+ } while (Link != FileBuffer.ListHead && Row <= (MainEditor.ScreenSize.Row - 1));\r
//\r
// while not file end and not screen full\r
//\r
- while (Row <= (MainEditor.ScreenSize.Row - 4)) {\r
+ while (Row <= (MainEditor.ScreenSize.Row - 1)) {\r
EditorClearLine (Row, MainEditor.ScreenSize.Column, MainEditor.ScreenSize.Row);\r
Row++;\r
}\r
@return The line created.\r
**/\r
EFI_EDITOR_LINE *\r
-EFIAPI\r
FileBufferCreateLine (\r
VOID\r
)\r
@retval EFI_INVALID_PARAMETER Str is not a valid filename.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferSetFileName (\r
IN CONST CHAR16 *Str\r
)\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferFree (\r
VOID\r
)\r
@retval EFI_INVALID_PARAMETER FileName is a directory.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferRead (\r
IN CONST CHAR16 *FileName,\r
IN CONST BOOLEAN Recover\r
@param[out] Size The amount of the buffer used on return.\r
**/\r
VOID\r
-EFIAPI\r
GetNewLine (\r
IN CONST EE_NEWLINE_TYPE Type,\r
OUT CHAR8 *Buffer,\r
Change a Unicode string to an ASCII string.\r
\r
@param[in] UStr The Unicode string.\r
- @param[in] Lenght The maximum size of AStr.\r
+ @param[in] Length The maximum size of AStr.\r
@param[out] AStr ASCII string to pass out.\r
\r
@return The actuall length.\r
**/\r
UINTN\r
-EFIAPI\r
UnicodeToAscii (\r
- IN CONST CHAR16 *UStr,\r
- IN CONST UINTN Length,\r
- OUT CHAR8 *AStr\r
+ IN CONST CHAR16 *UStr,\r
+ IN CONST UINTN Length,\r
+ OUT CHAR8 *AStr\r
)\r
{\r
UINTN Index;\r
@retval EFI_OUT_OF_RESOURCES There were not enough resources to write the file.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferSave (\r
IN CONST CHAR16 *FileName\r
)\r
//\r
// if is the old file\r
//\r
- if (StrCmp (FileName, FileBuffer.FileName) == 0) {\r
+ if (FileBuffer.FileName != NULL && StrCmp (FileName, FileBuffer.FileName) == 0) {\r
//\r
// file has not been modified\r
//\r
//\r
// now everything is ready , you can set the new file name to filebuffer\r
//\r
- if (StrCmp (FileName, FileBuffer.FileName) != 0) {\r
+ if (FileName != NULL && FileBuffer.FileName != NULL && StrCmp (FileName, FileBuffer.FileName) != 0) {\r
//\r
// not the same\r
//\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferScrollLeft (\r
VOID\r
)\r
/**\r
Delete a char in line\r
\r
- @param[in,out] Line The line to delete in.\r
- @param[in] Pos Position to delete the char at ( start from 0 ).\r
+ @param[in, out] Line The line to delete in.\r
+ @param[in] Pos Position to delete the char at ( start from 0 ).\r
**/\r
VOID\r
-EFIAPI\r
LineDeleteAt (\r
IN OUT EFI_EDITOR_LINE *Line,\r
IN UINTN Pos\r
/**\r
Concatenate Src into Dest.\r
\r
- @param[in,out] Dest Destination string\r
- @param[in] Src Src String.\r
+ @param[in, out] Dest Destination string\r
+ @param[in] Src Src String.\r
**/\r
VOID\r
-EFIAPI\r
LineCat (\r
IN OUT EFI_EDITOR_LINE *Dest,\r
IN EFI_EDITOR_LINE *Src\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferDoBackspace (\r
VOID\r
)\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferDoReturn (\r
VOID\r
)\r
@retval EFI_SUCCESS\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferDoDelete (\r
VOID\r
)\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferScrollRight (\r
VOID\r
)\r
@return The new string size ( include CHAR_NULL ) ( unit is Unicode character ).\r
**/\r
UINTN\r
-EFIAPI\r
LineStrInsert (\r
IN EFI_EDITOR_LINE *Line,\r
IN CHAR16 Char,\r
@retval EFI_SUCCESS The input was succesful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferAddChar (\r
IN CHAR16 Char\r
)\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferDoCharInput (\r
IN CONST CHAR16 Char\r
)\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferScrollDown (\r
VOID\r
)\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferScrollUp (\r
VOID\r
)\r
@retval EFI_SUCCESS The operation wa successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferPageDown (\r
VOID\r
)\r
//\r
// has next page\r
//\r
- if (FileBuffer.NumLines >= FRow + (MainEditor.ScreenSize.Row - 5)) {\r
- Gap = (MainEditor.ScreenSize.Row - 5);\r
+ if (FileBuffer.NumLines >= FRow + (MainEditor.ScreenSize.Row - 2)) {\r
+ Gap = (MainEditor.ScreenSize.Row - 2);\r
} else {\r
//\r
// MOVE CURSOR TO LAST LINE\r
//\r
// if that line, is not that long, so move to the end of that line\r
//\r
- if (FCol > Line->Size) {\r
+ if (Line != NULL && FCol > Line->Size) {\r
FCol = Line->Size + 1;\r
}\r
\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferPageUp (\r
VOID\r
)\r
//\r
// has previous page\r
//\r
- if (FRow > (MainEditor.ScreenSize.Row - 5)) {\r
- Gap = (MainEditor.ScreenSize.Row - 5);\r
+ if (FRow > (MainEditor.ScreenSize.Row - 2)) {\r
+ Gap = (MainEditor.ScreenSize.Row - 2);\r
} else {\r
//\r
// the first line of file will displayed on the first line of screen\r
//\r
// if that line is not that long, so move to the end of that line\r
//\r
- if (FCol > Line->Size) {\r
+ if (Line != NULL && FCol > Line->Size) {\r
FCol = Line->Size + 1;\r
}\r
\r
@retval EFI_SUCCESS The operation was successful.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferEnd (\r
VOID\r
)\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferHandleInput (\r
IN CONST EFI_INPUT_KEY *Key\r
)\r
@retval FALSE It is not above the current screen.\r
**/\r
BOOLEAN\r
-EFIAPI\r
AboveCurrentScreen (\r
IN UINTN FileRow\r
)\r
@retval FALSE It is not under the current screen.\r
**/\r
BOOLEAN\r
-EFIAPI\r
UnderCurrentScreen (\r
IN UINTN FileRow\r
)\r
//\r
// if is to the under of the screen\r
//\r
- if (FileRow > FileBuffer.LowVisibleRange.Row + (MainEditor.ScreenSize.Row - 5) - 1) {\r
+ if (FileRow > FileBuffer.LowVisibleRange.Row + (MainEditor.ScreenSize.Row - 2) - 1) {\r
return TRUE;\r
}\r
\r
@retval FALSE It is not to the left.\r
**/\r
BOOLEAN\r
-EFIAPI\r
LeftCurrentScreen (\r
IN UINTN FileCol\r
)\r
@retval FALSE It is not to the right.\r
**/\r
BOOLEAN\r
-EFIAPI\r
RightCurrentScreen (\r
IN UINTN FileCol\r
)\r
@return The line after advance/retreat.\r
**/\r
EFI_EDITOR_LINE *\r
-EFIAPI\r
MoveCurrentLine (\r
IN INTN Count\r
)\r
UINTN AbsCount;\r
\r
if (Count <= 0) {\r
- AbsCount = -Count;\r
+ AbsCount = (UINTN)ABS(Count);\r
Line = InternalEditorMiscLineRetreat (AbsCount,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
} else {\r
- Line = InternalEditorMiscLineAdvance (Count,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
+ Line = InternalEditorMiscLineAdvance ((UINTN)Count,MainEditor.FileBuffer->CurrentLine,MainEditor.FileBuffer->ListHead);\r
}\r
\r
if (Line == NULL) {\r
@param[in] NewFilePosCol The column of file position ( start from 1 ).\r
**/\r
VOID\r
-EFIAPI\r
FileBufferMovePosition (\r
IN CONST UINTN NewFilePosRow,\r
IN CONST UINTN NewFilePosCol\r
//\r
FileBuffer.FilePosition.Row = NewFilePosRow;\r
if (RowGap < 0) {\r
- Abs = -RowGap;\r
+ Abs = (UINTN)ABS(RowGap);\r
FileBuffer.DisplayPosition.Row -= Abs;\r
} else {\r
FileBuffer.DisplayPosition.Row += RowGap;\r
//\r
FileBuffer.FilePosition.Column = NewFilePosCol;\r
if (ColGap < 0) {\r
- Abs = -ColGap;\r
+ Abs = (UINTN)(-ColGap);\r
FileBuffer.DisplayPosition.Column -= Abs;\r
} else {\r
FileBuffer.DisplayPosition.Column += ColGap;\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferCutLine (\r
OUT EFI_EDITOR_LINE **CutLine\r
)\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferPasteLine (\r
VOID\r
)\r
@retval EFI_NOT_FOUND The string Str was not found.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferSearch (\r
IN CONST CHAR16 *Str,\r
IN CONST UINTN Offset\r
BOOLEAN Found;\r
\r
Column = 0;\r
-\r
+ Position = 0;\r
+ \r
//\r
// search if in current line\r
//\r
Current = FileBuffer.CurrentLine->Buffer + FileBuffer.CurrentLine->Size;\r
}\r
\r
+ Found = FALSE;\r
+\r
CharPos = StrStr (Current, Str);\r
if (CharPos != NULL) {\r
- Position = CharPos - Current;\r
- } else {\r
- Position = 0;\r
- }\r
+ Position = CharPos - Current + 1;\r
+ Found = TRUE;\r
+ } \r
\r
//\r
// found\r
//\r
- if (Position != 0) {\r
+ if (Found) {\r
Column = (Position - 1) + FileBuffer.FilePosition.Column + Offset;\r
Row = FileBuffer.FilePosition.Row;\r
- Found = TRUE;\r
} else {\r
//\r
// not found so find through next lines\r
// Position = StrStr (Line->Buffer, Str);\r
CharPos = StrStr (Line->Buffer, Str);\r
if (CharPos != NULL) {\r
- Position = CharPos - Line->Buffer;\r
- }\r
- if (Position != 0) {\r
+ Position = CharPos - Line->Buffer + 1;\r
+ Found = TRUE;\r
+ } \r
+ \r
+ if (Found) {\r
//\r
// found\r
//\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferReplace (\r
IN CONST CHAR16 *Replace,\r
IN CONST UINTN SearchLen\r
//\r
// set replace into it\r
//\r
- Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column;\r
+ Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1;\r
for (Index = 0; Index < ReplaceLen; Index++) {\r
Buffer[Index] = Replace[Index];\r
}\r
}\r
\r
if (ReplaceLen < SearchLen) {\r
- Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column;\r
+ Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1;\r
\r
for (Index = 0; Index < ReplaceLen; Index++) {\r
Buffer[Index] = Replace[Index];\r
}\r
\r
if (ReplaceLen == SearchLen) {\r
- Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column;\r
+ Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1;\r
for (Index = 0; Index < ReplaceLen; Index++) {\r
Buffer[Index] = Replace[Index];\r
}\r
\r
FileBuffer.FileModified = TRUE;\r
\r
- MainTitleBarRefresh (MainEditor.FileBuffer->FileName, MainEditor.FileBuffer->FileType, MainEditor.FileBuffer->ReadOnly, MainEditor.FileBuffer->FileModified, MainEditor.ScreenSize.Column, MainEditor.ScreenSize.Row);\r
+ MainTitleBarRefresh (MainEditor.FileBuffer->FileName, MainEditor.FileBuffer->FileType, MainEditor.FileBuffer->ReadOnly, MainEditor.FileBuffer->FileModified, MainEditor.ScreenSize.Column, MainEditor.ScreenSize.Row, 0, 0);\r
FileBufferRestorePosition ();\r
FileBufferRefresh ();\r
\r
@param[in] TextY The new y-coordinate.\r
**/\r
VOID\r
-EFIAPI\r
FileBufferAdjustMousePosition (\r
IN CONST INT32 TextX,\r
IN CONST INT32 TextY\r
// check whether new mouse row position is beyond screen\r
// if not, adjust it\r
//\r
- if (CoordinateY >= 2 && CoordinateY <= (MainEditor.ScreenSize.Row - 4)) {\r
+ if (CoordinateY >= 2 && CoordinateY <= (MainEditor.ScreenSize.Row - 1)) {\r
FileBuffer.MousePosition.Row = CoordinateY;\r
} else if (CoordinateY < 2) {\r
FileBuffer.MousePosition.Row = 2;\r
- } else if (CoordinateY > (MainEditor.ScreenSize.Row - 4)) {\r
- FileBuffer.MousePosition.Row = (MainEditor.ScreenSize.Row - 4);\r
+ } else if (CoordinateY > (MainEditor.ScreenSize.Row - 1)) {\r
+ FileBuffer.MousePosition.Row = (MainEditor.ScreenSize.Row - 1);\r
}\r
\r
}\r
@param[in] Offset The column to start at.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
FileBufferReplaceAll (\r
IN CHAR16 *SearchStr,\r
IN CHAR16 *ReplaceStr,\r
Set the modified state to TRUE.\r
**/\r
VOID\r
-EFIAPI\r
FileBufferSetModified (\r
VOID\r
)\r