Revision: 19520
          http://sourceforge.net/p/edk2/code/19520
Author:   shenshushi
Date:     2015-12-24 08:06:28 +0000 (Thu, 24 Dec 2015)
Log Message:
-----------
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 <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ShellPkg/Application/Shell/Shell.c
    trunk/edk2/ShellPkg/Application/Shell/Shell.inf
    trunk/edk2/ShellPkg/ShellPkg.dec

Modified: trunk/edk2/ShellPkg/Application/Shell/Shell.c
===================================================================
--- trunk/edk2/ShellPkg/Application/Shell/Shell.c       2015-12-24 07:01:07 UTC 
(rev 19519)
+++ trunk/edk2/ShellPkg/Application/Shell/Shell.c       2015-12-24 08:06:28 UTC 
(rev 19520)
@@ -1288,13 +1288,40 @@
   )
 {
   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);
+  }
 }
 
 /**

Modified: trunk/edk2/ShellPkg/Application/Shell/Shell.inf
===================================================================
--- trunk/edk2/ShellPkg/Application/Shell/Shell.inf     2015-12-24 07:01:07 UTC 
(rev 19519)
+++ trunk/edk2/ShellPkg/Application/Shell/Shell.inf     2015-12-24 08:06:28 UTC 
(rev 19520)
@@ -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

Modified: trunk/edk2/ShellPkg/ShellPkg.dec
===================================================================
--- trunk/edk2/ShellPkg/ShellPkg.dec    2015-12-24 07:01:07 UTC (rev 19519)
+++ trunk/edk2/ShellPkg/ShellPkg.dec    2015-12-24 08:06:28 UTC (rev 19520)
@@ -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


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to