/** @file\r
Implements filebuffer interface functions.\r
\r
- Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
+ Copyright (c) 2005 - 2012, 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
// 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
// backup the old screen attributes\r
//\r
Orig = MainEditor.ColorAttributes;\r
+ New.Data = 0;\r
New.Colors.Foreground = Orig.Colors.Background;\r
New.Colors.Background = Orig.Colors.Foreground;\r
\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
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
CHAR16 *Buffer;\r
UINTN Limit;\r
CHAR16 PrintLine[200];\r
+ CHAR16 PrintLine2[250];\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
+ StrnCpy (PrintLine, Buffer, MIN(MIN(Limit,MainEditor.ScreenSize.Column), 200));\r
for (; Limit < MainEditor.ScreenSize.Column; Limit++) {\r
PrintLine[Limit] = L' ';\r
}\r
\r
PrintLine[MainEditor.ScreenSize.Column] = CHAR_NULL;\r
+ ShellCopySearchAndReplace(PrintLine, PrintLine2, 250, L"%", L"^%", FALSE, FALSE);\r
\r
ShellPrintEx (\r
0,\r
(INT32)Row - 1,\r
L"%s",\r
- PrintLine\r
+ PrintLine2\r
);\r
\r
return EFI_SUCCESS;\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
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
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
//\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
/**\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
/**\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
//\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
//\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
//\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
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
//\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
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
//\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
// 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