Hi
I suggest we also handle PcdShellMaxHistoryCommandCount == 0 case.

I think we can add below at the begging of function.
  if (MaxHistoryCmdCount == 0) {
    return ;
  }

Other change seems good. Reviewed by: [email protected]


Thank you
Yao Jiewen

-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Qiu 
Shumin
Sent: Wednesday, December 23, 2015 2:15 PM
To: [email protected]
Cc: Carsey, Jaben; Ni, Ruiyu; Qiu, Shumin
Subject: [edk2] [PATCH v3 2/4] ShellPkg: Refine the code logic of 'command 
history'.

Add the PCD to PcdShellMaxHistoryCommandCount indicate the max count of history 
commands.

Cc: Jaben Carsey <[email protected]>
Cc: Ruiyu Ni <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qiu Shumin <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>
---
 ShellPkg/Application/Shell/Shell.c   | 24 +++++++++++++++++++++++-
 ShellPkg/Application/Shell/Shell.inf | 25 +++++++++++++------------
 ShellPkg/ShellPkg.dec                |  3 +++
 3 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/ShellPkg/Application/Shell/Shell.c 
b/ShellPkg/Application/Shell/Shell.c
index 3606322..41c8a03 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -1288,13 +1288,35 @@ AddLineToCommandHistory(
   )
 {
   BUFFER_LIST *Node;
+  BUFFER_LIST *Walker;
+  UINT16       MaxHistoryCmdCount;
+  UINT16       Count;
+  
+  Count = 0;
+  MaxHistoryCmdCount = PcdGet16(PcdShellMaxHistoryCommandCount);
 
   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 09aecf7..253bfdb 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 
b2f6326..76a2b7d 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|UINT1
+ 6|0x00000014
 
 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
   ## This flag is used to control the protocols produced by the shell
--
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to