)\r
{\r
BUFFER_LIST *Node;\r
+ BUFFER_LIST *Walker;\r
+ UINT16 MaxHistoryCmdCount;\r
+ UINT16 Count;\r
+ \r
+ Count = 0;\r
+ MaxHistoryCmdCount = PcdGet16(PcdShellMaxHistoryCommandCount);\r
+ \r
+ if (MaxHistoryCmdCount == 0) {\r
+ return ;\r
+ }\r
+\r
\r
Node = AllocateZeroPool(sizeof(BUFFER_LIST));\r
ASSERT(Node != NULL);\r
Node->Buffer = AllocateCopyPool(StrSize(Buffer), Buffer);\r
ASSERT(Node->Buffer != NULL);\r
\r
- InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link);\r
+ for ( Walker = (BUFFER_LIST*)GetFirstNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link)\r
+ ; !IsNull(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Walker->Link)\r
+ ; Walker = (BUFFER_LIST*)GetNextNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Walker->Link)\r
+ ){\r
+ Count++;\r
+ }\r
+ if (Count < MaxHistoryCmdCount){\r
+ InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link);\r
+ } else {\r
+ Walker = (BUFFER_LIST*)GetFirstNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link);\r
+ RemoveEntryList(&Walker->Link);\r
+ if (Walker->Buffer != NULL) {\r
+ FreePool(Walker->Buffer);\r
+ }\r
+ FreePool(Walker);\r
+ InsertTailList(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link);\r
+ }\r
}\r
\r
/**\r
gEfiDevicePathProtocolGuid ## CONSUMES\r
\r
[Pcd]\r
- gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellRequireHiiPlatform ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellSupportFrameworkHii ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellInsertModeDefault ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellScreenLogCount ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellPrintBufferSize ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellForceConsole ## CONSUMES\r
- gEfiShellPkgTokenSpaceGuid.PcdShellSupplier ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellRequireHiiPlatform ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellSupportFrameworkHii ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellInsertModeDefault ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellScreenLogCount ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellPrintBufferSize ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellForceConsole ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellSupplier ## CONSUMES\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellMaxHistoryCommandCount ## CONSUMES\r
\r
[BuildOptions.AARCH64]\r
# The tiny code model used by AARCH64 only supports binaries of up to 1 MB in\r
\r
## This determines how many bytes are read out of files at a time for file operations (type, copy, etc...)\r
gEfiShellPkgTokenSpaceGuid.PcdShellFileOperationSize|0x1000|UINT32|0x0000000A\r
+ \r
+ ## This determines the max count of history commands\r
+ gEfiShellPkgTokenSpaceGuid.PcdShellMaxHistoryCommandCount|0x0020|UINT16|0x00000014\r
\r
[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]\r
## This flag is used to control the protocols produced by the shell\r