From a4f138a412b95b6db8f3109fbce744ecf186ff50 Mon Sep 17 00:00:00 2001 From: Qiu Shumin Date: Thu, 24 Dec 2015 08:06:28 +0000 Subject: ShellPkg: Refine the code logic of 'command history'. Add the PCD to PcdShellMaxHistoryCommandCount indicate the max count of history commands. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin Reviewed-by: Ruiyu Ni Reviewed-by: Jaben Carsey git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19520 6f19259b-4bc3-4df7-8a09-765794883524 --- ShellPkg/Application/Shell/Shell.c | 29 ++++++++++++++++++++++++++++- ShellPkg/Application/Shell/Shell.inf | 25 +++++++++++++------------ ShellPkg/ShellPkg.dec | 3 +++ 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 36063227a2..97b8c8d6fb 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -1288,13 +1288,40 @@ AddLineToCommandHistory( ) { BUFFER_LIST *Node; + BUFFER_LIST *Walker; + UINT16 MaxHistoryCmdCount; + UINT16 Count; + + Count = 0; + MaxHistoryCmdCount = PcdGet16(PcdShellMaxHistoryCommandCount); + + if (MaxHistoryCmdCount == 0) { + return ; + } + Node = AllocateZeroPool(sizeof(BUFFER_LIST)); ASSERT(Node != NULL); Node->Buffer = AllocateCopyPool(StrSize(Buffer), Buffer); ASSERT(Node->Buffer != NULL); - InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link); + for ( Walker = (BUFFER_LIST*)GetFirstNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link) + ; !IsNull(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Walker->Link) + ; Walker = (BUFFER_LIST*)GetNextNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Walker->Link) + ){ + Count++; + } + if (Count < MaxHistoryCmdCount){ + InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link); + } else { + Walker = (BUFFER_LIST*)GetFirstNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link); + RemoveEntryList(&Walker->Link); + if (Walker->Buffer != NULL) { + FreePool(Walker->Buffer); + } + FreePool(Walker); + InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link); + } } /** diff --git a/ShellPkg/Application/Shell/Shell.inf b/ShellPkg/Application/Shell/Shell.inf index 09aecf717b..253bfdbb22 100644 --- a/ShellPkg/Application/Shell/Shell.inf +++ b/ShellPkg/Application/Shell/Shell.inf @@ -95,18 +95,19 @@ gEfiDevicePathProtocolGuid ## CONSUMES [Pcd] - gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellRequireHiiPlatform ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellSupportFrameworkHii ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellInsertModeDefault ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellScreenLogCount ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellPrintBufferSize ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellForceConsole ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellSupplier ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellRequireHiiPlatform ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellSupportFrameworkHii ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellInsertModeDefault ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellScreenLogCount ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellPrintBufferSize ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellForceConsole ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellSupplier ## CONSUMES + gEfiShellPkgTokenSpaceGuid.PcdShellMaxHistoryCommandCount ## CONSUMES [BuildOptions.AARCH64] # The tiny code model used by AARCH64 only supports binaries of up to 1 MB in diff --git a/ShellPkg/ShellPkg.dec b/ShellPkg/ShellPkg.dec index b2f632601e..76a2b7db97 100644 --- a/ShellPkg/ShellPkg.dec +++ b/ShellPkg/ShellPkg.dec @@ -101,6 +101,9 @@ ## This determines how many bytes are read out of files at a time for file operations (type, copy, etc...) gEfiShellPkgTokenSpaceGuid.PcdShellFileOperationSize|0x1000|UINT32|0x0000000A + + ## This determines the max count of history commands + gEfiShellPkgTokenSpaceGuid.PcdShellMaxHistoryCommandCount|0x0020|UINT16|0x00000014 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] ## This flag is used to control the protocols produced by the shell -- cgit v1.2.3