ShellLib: 'help' lists Shell commands sorted by name (#434)
This lists the supported Shell commands in alphabetical order. Signed-off-by: Aiden Park <aiden.park@intel.com>
This commit is contained in:
parent
5de02e118d
commit
fd5c402b3b
|
@ -30,7 +30,6 @@ struct _SHELL {
|
|||
/**
|
||||
Begin a run-time interactive shell.
|
||||
|
||||
@param[in] Commands command list (may be NULL for default commands)
|
||||
@param[in] Timeout seconds to wait for input before returning (0 for no timeout)
|
||||
|
||||
@retval EFI_SUCCESS
|
||||
|
@ -39,7 +38,6 @@ struct _SHELL {
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
Shell (
|
||||
IN CONST SHELL_COMMAND **Commands,
|
||||
IN UINTN Timeout
|
||||
);
|
||||
|
||||
|
|
|
@ -93,10 +93,24 @@ ReadShellCommand (
|
|||
IN CONST UINTN BufferSize
|
||||
);
|
||||
|
||||
/**
|
||||
Insert the given entry to the Sorted list.
|
||||
|
||||
@param[in/out] ListHead pointer to the head of the list
|
||||
@param[in/out] Entry point at which the list is inserted.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
InsertSortedCommandList (
|
||||
IN OUT LIST_ENTRY *ListHead,
|
||||
IN OUT LIST_ENTRY *Entry
|
||||
);
|
||||
|
||||
/**
|
||||
Begin a run-time interactive shell.
|
||||
|
||||
@param[in] Commands command list (may be NULL for default commands)
|
||||
@param[in] Timeout seconds to wait for input before returning (0 for no timeout)
|
||||
|
||||
@retval EFI_SUCCESS
|
||||
|
@ -105,22 +119,15 @@ ReadShellCommand (
|
|||
EFI_STATUS
|
||||
EFIAPI
|
||||
Shell (
|
||||
IN CONST SHELL_COMMAND **Commands,
|
||||
IN UINTN Timeout
|
||||
)
|
||||
{
|
||||
BOOLEAN Start;
|
||||
UINTN Index, Index1;
|
||||
SHELL Shell;
|
||||
CONST SHELL_COMMAND **Iter;
|
||||
UINT8 Buffer;
|
||||
|
||||
InitializeListHead (&mShellCommandEntryList);
|
||||
|
||||
LoadShellCommands ();
|
||||
for (Iter = Commands; *Iter != NULL; Iter++) {
|
||||
ShellCommandRegister (*Iter);
|
||||
}
|
||||
Shell.ShouldExit = FALSE;
|
||||
|
||||
if (Timeout != 0) {
|
||||
|
@ -569,6 +576,7 @@ FindShellCommand (
|
|||
{
|
||||
LIST_ENTRY *Link;
|
||||
SHELL_COMMAND_LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *EntryList;
|
||||
|
||||
//
|
||||
// Add '?' alias for help
|
||||
|
@ -577,7 +585,8 @@ FindShellCommand (
|
|||
Name = L"help";
|
||||
}
|
||||
|
||||
for (Link = mShellCommandEntryList.ForwardLink; Link != &mShellCommandEntryList; Link = Link->ForwardLink) {
|
||||
EntryList = GetShellCommandEntryList ();
|
||||
for (Link = EntryList->ForwardLink; Link != EntryList; Link = Link->ForwardLink) {
|
||||
Entry = CR (Link, SHELL_COMMAND_LIST_ENTRY, Link, SHELL_COMMAND_LIST_ENTRY_SIGNATURE);
|
||||
if (StrCmp (Name, Entry->ShellCommand->Name) == 0) {
|
||||
*Ptr = Entry->ShellCommand;
|
||||
|
@ -588,6 +597,41 @@ FindShellCommand (
|
|||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Insert the given entry to the Sorted list.
|
||||
|
||||
@param[in/out] ListHead pointer to the head of the list
|
||||
@param[in/out] Entry point at which the list is inserted.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
InsertSortedCommandList (
|
||||
IN OUT LIST_ENTRY *ListHead,
|
||||
IN OUT LIST_ENTRY *Entry
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Curr;
|
||||
SHELL_COMMAND_LIST_ENTRY *CurrEntry;
|
||||
SHELL_COMMAND_LIST_ENTRY *NewEntry;
|
||||
|
||||
Curr = ListHead->ForwardLink;
|
||||
NewEntry = BASE_CR (Entry, SHELL_COMMAND_LIST_ENTRY, Link);
|
||||
while (Curr != ListHead) {
|
||||
CurrEntry = BASE_CR (Curr, SHELL_COMMAND_LIST_ENTRY, Link);
|
||||
if (StrCmp (CurrEntry->ShellCommand->Name, NewEntry->ShellCommand->Name) >= 0) {
|
||||
break;
|
||||
}
|
||||
Curr = Curr->ForwardLink;
|
||||
}
|
||||
|
||||
Curr->BackLink->ForwardLink = Entry;
|
||||
Entry->ForwardLink = Curr;
|
||||
Entry->BackLink = Curr->BackLink;
|
||||
Curr->BackLink = Entry;
|
||||
}
|
||||
|
||||
/**
|
||||
Register a Shell Command
|
||||
|
||||
|
@ -603,9 +647,9 @@ ShellCommandRegister (
|
|||
)
|
||||
{
|
||||
SHELL_COMMAND_LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *EntryList;
|
||||
|
||||
Entry = (SHELL_COMMAND_LIST_ENTRY *)AllocateZeroPool (sizeof (SHELL_COMMAND_LIST_ENTRY));
|
||||
ASSERT (Entry != NULL);
|
||||
if (Entry == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
@ -613,7 +657,8 @@ ShellCommandRegister (
|
|||
Entry->ShellCommand = ShellCommand;
|
||||
Entry->Signature = SHELL_COMMAND_LIST_ENTRY_SIGNATURE;
|
||||
|
||||
InsertTailList (&mShellCommandEntryList, &Entry->Link);
|
||||
EntryList = GetShellCommandEntryList ();
|
||||
InsertSortedCommandList (EntryList, &Entry->Link);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -5,14 +5,23 @@
|
|||
|
||||
**/
|
||||
|
||||
#include "ShellCmds.h"
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/ShellExtensionLib.h>
|
||||
#include "ShellCmds.h"
|
||||
#include "Shell.h"
|
||||
|
||||
EFI_STATUS
|
||||
LoadShellCommands (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *EntryList;
|
||||
CONST SHELL_COMMAND **ShellExtensionCmds;
|
||||
CONST SHELL_COMMAND **Iter;
|
||||
|
||||
EntryList = GetShellCommandEntryList ();
|
||||
InitializeListHead (EntryList);
|
||||
|
||||
ShellCommandRegister (&ShellCommandExit);
|
||||
ShellCommandRegister (&ShellCommandHelp);
|
||||
ShellCommandRegister (&ShellCommandHob);
|
||||
|
@ -32,5 +41,13 @@ LoadShellCommands (
|
|||
ShellCommandRegister (&ShellCommandCls);
|
||||
ShellCommandRegister (&ShellCommandFs);
|
||||
|
||||
//
|
||||
// Load Platform specific shell commands
|
||||
//
|
||||
ShellExtensionCmds = GetShellExtensionCmds ();
|
||||
for (Iter = ShellExtensionCmds; *Iter != NULL; Iter++) {
|
||||
ShellCommandRegister (*Iter);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -1055,12 +1055,9 @@ RunShell (
|
|||
IN UINTN Timeout
|
||||
)
|
||||
{
|
||||
CONST SHELL_COMMAND **ShellExtensionCmd;
|
||||
|
||||
InitConsole ();
|
||||
|
||||
ShellExtensionCmd = GetShellExtensionCmds ();
|
||||
Shell (ShellExtensionCmd, Timeout);
|
||||
Shell (Timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue