//\r
// look for the mEfiShellEnvironment2 protocol at a higher level\r
//\r
- if (EFI_ERROR (Status) || !(CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid) != FALSE &&\r
- (mEfiShellEnvironment2->MajorVersion > EFI_SHELL_MAJOR_VER ||\r
- (mEfiShellEnvironment2->MajorVersion == EFI_SHELL_MAJOR_VER && mEfiShellEnvironment2->MinorVersion >= EFI_SHELL_MINOR_VER)))) {\r
+ if (EFI_ERROR (Status) || !(CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid) != FALSE)){\r
//\r
// figure out how big of a buffer we need.\r
//\r
NULL,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
- if (CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid) != FALSE &&\r
- (mEfiShellEnvironment2->MajorVersion > EFI_SHELL_MAJOR_VER ||\r
- (mEfiShellEnvironment2->MajorVersion == EFI_SHELL_MAJOR_VER && mEfiShellEnvironment2->MinorVersion >= EFI_SHELL_MINOR_VER))) {\r
+ if (CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid) != FALSE) {\r
mEfiShellEnvironment2Handle = Buffer[HandleIndex];\r
Status = EFI_SUCCESS;\r
break;\r
ShellLibDestructor (\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
+ ){\r
if (mEfiShellEnvironment2 != NULL) {\r
gBS->CloseProtocol(mEfiShellEnvironment2Handle==NULL?ImageHandle:mEfiShellEnvironment2Handle,\r
&gEfiShellEnvironment2Guid,\r
EFI_STATUS\r
EFIAPI\r
ShellOpenFileByName(\r
- IN CHAR16 *FileName,\r
+ IN CONST CHAR16 *FileName,\r
OUT EFI_FILE_HANDLE *FileHandle,\r
IN UINT64 OpenMode,\r
IN UINT64 Attributes\r
// since this will use EFI method again that will open it.\r
//\r
ASSERT(mEfiShellEnvironment2 != NULL);\r
- FilePath = mEfiShellEnvironment2->NameToPath (FileName);\r
+ FilePath = mEfiShellEnvironment2->NameToPath ((CHAR16*)FileName);\r
if (FileDevicePath != NULL) {\r
return (ShellOpenFileByDevicePath(&FilePath,\r
&DeviceHandle,\r
EFI_STATUS\r
EFIAPI\r
ShellCreateDirectory(\r
- IN CHAR16 *DirectoryName,\r
+ IN CONST CHAR16 *DirectoryName,\r
OUT EFI_FILE_HANDLE *FileHandle\r
)\r
{\r
CONST CHAR16*\r
EFIAPI\r
ShellGetEnvironmentVariable (\r
- IN CHAR16 *EnvKey\r
+ IN CONST CHAR16 *EnvKey\r
)\r
{\r
// \r
//\r
// using EFI Shell\r
//\r
- return (mEfiShellEnvironment2->GetEnv(EnvKey));\r
+ return (mEfiShellEnvironment2->GetEnv((CHAR16*)EnvKey));\r
}\r
/**\r
set the value of an environment variable\r
EFI_SHELL_FILE_INFO based list. it is up to the caller to free the memory via\r
the ShellCloseFileMetaArg function.\r
\r
- @param FileList the EFI shell list type\r
+ @param[in] FileList the EFI shell list type\r
+ @param[in,out] ListHead the list to add to\r
\r
@retval the resultant head of the double linked new format list;\r
**/\r
LIST_ENTRY*\r
EFIAPI\r
InternalShellConvertFileListType (\r
- LIST_ENTRY *FileList\r
- )\r
-{\r
- LIST_ENTRY *ListHead;\r
+ IN LIST_ENTRY *FileList,\r
+ IN OUT LIST_ENTRY *ListHead\r
+ ){\r
SHELL_FILE_ARG *OldInfo;\r
- LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link;\r
EFI_SHELL_FILE_INFO_NO_CONST *NewInfo;\r
\r
//\r
- // ASSERT that FileList is not NULL\r
- //\r
- ASSERT(FileList != NULL);\r
-\r
- //\r
- // Allocate our list head and initialize the list\r
+ // ASSERTs\r
//\r
- ListHead = AllocateZeroPool(sizeof(LIST_ENTRY));\r
- ASSERT (ListHead != NULL);\r
- ListHead = InitializeListHead (ListHead);\r
+ ASSERT(FileList != NULL);\r
+ ASSERT(ListHead != NULL);\r
\r
//\r
// enumerate through each member of the old list and copy\r
//\r
// add that to the list\r
//\r
- InsertTailList(ListHead, (LIST_ENTRY*)NewInfo);\r
+ InsertTailList(ListHead, &NewInfo->Link);\r
}\r
return (ListHead);\r
}\r
and will process '?' and '*' as such. the list must be freed with a call to \r
ShellCloseFileMetaArg().\r
\r
- This function will fail if called sequentially without freeing the list in the middle.\r
+ If you are NOT appending to an existing list *ListHead must be NULL. If \r
+ *ListHead is NULL then it must be callee freed.\r
\r
@param Arg pointer to path string\r
@param OpenMode mode to open files with\r
)\r
{\r
EFI_STATUS Status;\r
- LIST_ENTRY *EmptyNode;\r
- LIST_ENTRY *mOldStyleFileList;\r
+ LIST_ENTRY mOldStyleFileList;\r
\r
//\r
// ASSERT that Arg and ListHead are not NULL\r
// Check for UEFI Shell 2.0 protocols\r
//\r
if (mEfiShellProtocol != NULL) {\r
+ if (*ListHead == NULL) {\r
+ *ListHead = (EFI_SHELL_FILE_INFO*)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));\r
+ if (*ListHead == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
+ InitializeListHead(&((*ListHead)->Link));\r
+ } \r
return (mEfiShellProtocol->OpenFileList(Arg, \r
OpenMode, \r
ListHead));\r
//\r
ASSERT(mEfiShellEnvironment2 != NULL);\r
\r
- //\r
- // allocate memory for old list head\r
- //\r
- mOldStyleFileList = (LIST_ENTRY*)AllocatePool(sizeof(LIST_ENTRY));\r
- ASSERT(mOldStyleFileList != NULL);\r
-\r
//\r
// make sure the list head is initialized\r
//\r
- InitializeListHead((LIST_ENTRY*)mOldStyleFileList);\r
+ InitializeListHead(&mOldStyleFileList);\r
\r
//\r
// Get the EFI Shell list of files\r
//\r
- Status = mEfiShellEnvironment2->FileMetaArg(Arg, mOldStyleFileList);\r
+ Status = mEfiShellEnvironment2->FileMetaArg(Arg, &mOldStyleFileList);\r
if (EFI_ERROR(Status)) {\r
*ListHead = NULL;\r
return (Status);\r
}\r
\r
+ if (*ListHead == NULL) {\r
+ *ListHead = (EFI_SHELL_FILE_INFO *)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));\r
+ if (*ListHead == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
+ }\r
+\r
//\r
// Convert that to equivalent of UEFI Shell 2.0 structure\r
//\r
- EmptyNode = InternalShellConvertFileListType(mOldStyleFileList);\r
+ InternalShellConvertFileListType(&mOldStyleFileList, &(*ListHead)->Link);\r
\r
//\r
// Free the EFI Shell version that was converted.\r
//\r
- ASSERT_EFI_ERROR(mEfiShellEnvironment2->FreeFileList(mOldStyleFileList));\r
- FreePool(mOldStyleFileList);\r
- mOldStyleFileList = NULL;\r
-\r
- //\r
- // remove the empty head of the list\r
- //\r
- *ListHead = (EFI_SHELL_FILE_INFO*)RemoveEntryList(EmptyNode);\r
- FreePool(EmptyNode); \r
+ mEfiShellEnvironment2->FreeFileList(&mOldStyleFileList);\r
\r
return (Status);\r
}\r
// Since this is EFI Shell version we need to free our internally made copy \r
// of the list\r
//\r
- for (Node = GetFirstNode((LIST_ENTRY*)*ListHead) ; IsListEmpty((LIST_ENTRY*)*ListHead) == FALSE ; Node = GetFirstNode((LIST_ENTRY*)*ListHead)) {\r
+ for ( Node = GetFirstNode(&(*ListHead)->Link) \r
+ ; IsListEmpty(&(*ListHead)->Link) == FALSE \r
+ ; Node = GetFirstNode(&(*ListHead)->Link)) {\r
RemoveEntryList(Node);\r
((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle->Close(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle);\r
FreePool(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->FullName);\r
}\r
\r
typedef struct {\r
- LIST_ENTRY List;\r
+ LIST_ENTRY Link;\r
CHAR16 *Name;\r
ParamType Type;\r
CHAR16 *Value;\r
//\r
for (TempListItem = (SHELL_PARAM_ITEM*)CheckList ; TempListItem->Name != NULL ; TempListItem++) {\r
//\r
- // If the Name matches set the type and return TRUE\r
+ // If the Type is TypeStart only check the first characters of the passed in param\r
+ // If it matches set the type and return TRUE\r
//\r
- if (StrCmp(Name, TempListItem->Name) == 0) {\r
+ if (TempListItem->Type == TypeStart && StrnCmp(Name, TempListItem->Name, StrLen(TempListItem->Name)) == 0) {\r
+ *Type = TempListItem->Type;\r
+ return (TRUE);\r
+ } else if (StrCmp(Name, TempListItem->Name) == 0) {\r
*Type = TempListItem->Type;\r
return (TRUE);\r
}\r
//\r
// this item has no value expected; we are done\r
//\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
}\r
} else if (GetItemValue == TRUE && InternalIsFlag(Argv[LoopCounter]) == FALSE) {\r
ASSERT(CurrentItemPackage != NULL);\r
CurrentItemPackage->Value = AllocateZeroPool(StrSize(Argv[LoopCounter]));\r
ASSERT(CurrentItemPackage->Value != NULL);\r
StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
} else if (InternalIsFlag(Argv[LoopCounter]) == FALSE) {\r
//\r
// add this one as a non-flag\r
ASSERT(CurrentItemPackage->Value != NULL);\r
StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);\r
CurrentItemPackage->OriginalPosition = Count++;\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
} else if (ProblemParam) {\r
//\r
// this was a non-recognised flag... error!\r
//\r
// for each node in the list\r
//\r
- for (Node = GetFirstNode(CheckPackage); Node != CheckPackage ; Node = GetFirstNode(CheckPackage)) {\r
+ for ( Node = GetFirstNode(CheckPackage)\r
+ ; Node != CheckPackage \r
+ ; Node = GetFirstNode(CheckPackage)\r
+ ){\r
//\r
// Remove it from the list\r
//\r
//\r
// enumerate through the list of parametrs\r
//\r
- for (Node = GetFirstNode(CheckPackage) ; !IsNull (CheckPackage, Node) ; Node = GetNextNode(CheckPackage, Node) ) {\r
+ for ( Node = GetFirstNode(CheckPackage) \r
+ ; !IsNull (CheckPackage, Node) \r
+ ; Node = GetNextNode(CheckPackage, Node) \r
+ ){\r
//\r
// If the Name matches, return TRUE (and there may be NULL name)\r
//\r
if (((SHELL_PARAM_PACKAGE*)Node)->Name != NULL) {\r
- if (StrCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {\r
+ //\r
+ // If Type is TypeStart then only compare the begining of the strings\r
+ //\r
+ if ( ((SHELL_PARAM_PACKAGE*)Node)->Type == TypeStart \r
+ && StrnCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name, StrLen(KeyString)) == 0\r
+ ){\r
+ return (TRUE);\r
+ } else if (StrCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {\r
return (TRUE);\r
}\r
}\r
//\r
// enumerate through the list of parametrs\r
//\r
- for (Node = GetFirstNode(CheckPackage) ; !IsNull (CheckPackage, Node) ; Node = GetNextNode(CheckPackage, Node) ) {\r
+ for ( Node = GetFirstNode(CheckPackage) \r
+ ; !IsNull (CheckPackage, Node) \r
+ ; Node = GetNextNode(CheckPackage, Node) \r
+ ){\r
//\r
// If the Name matches, return the value (name can be NULL)\r
//\r
if (((SHELL_PARAM_PACKAGE*)Node)->Name != NULL) {\r
- if (StrCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {\r
+ //\r
+ // If Type is TypeStart then only compare the begining of the strings\r
+ //\r
+ if ( ((SHELL_PARAM_PACKAGE*)Node)->Type == TypeStart \r
+ && StrnCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name, StrLen(KeyString)) == 0\r
+ ){\r
+ //\r
+ // return the string part after the flag\r
+ //\r
+ return (((SHELL_PARAM_PACKAGE*)Node)->Name + StrLen(KeyString));\r
+ } else if (StrCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {\r
+ //\r
+ // return the value\r
+ //\r
return (((SHELL_PARAM_PACKAGE*)Node)->Value);\r
}\r
}\r
//\r
// enumerate through the list of parametrs\r
//\r
- for (Node = GetFirstNode(CheckPackage) ; !IsNull (CheckPackage, Node) ; Node = GetNextNode(CheckPackage, Node) ) {\r
+ for ( Node = GetFirstNode(CheckPackage) \r
+ ; !IsNull (CheckPackage, Node) \r
+ ; Node = GetNextNode(CheckPackage, Node) \r
+ ){\r
//\r
// If the position matches, return the value\r
//\r
If the string would grow bigger than NewSize it will halt and return error.\r
\r
@param[in] SourceString String with source buffer\r
- @param[in][out] NewString String with resultant buffer\r
+ @param[in,out] NewString String with resultant buffer\r
@param[in] NewSize Size in bytes of NewString\r
@param[in] FindTarget String to look for\r
@param[in[ ReplaceWith String to replace FindTarget with\r
while (*SourceString != L'\0') {\r
if (StrnCmp(SourceString, FindTarget, StrLen(FindTarget)) == 0) {\r
SourceString += StrLen(FindTarget);\r
- if (StrSize(NewString) + (StrLen(ReplaceWith)*sizeof(CHAR16)) > NewSize) {\r
+ if ((StrSize(NewString) + (StrLen(ReplaceWith)*sizeof(CHAR16))) > NewSize) {\r
return (EFI_BUFFER_TOO_SMALL);\r
}\r
StrCat(NewString, ReplaceWith);\r
/**\r
Print at a specific location on the screen.\r
\r
- This function will move the cursor to a given screen location, print the specified string, \r
- and return the cursor to the original locaiton. \r
+ This function will move the cursor to a given screen location and print the specified string\r
\r
If -1 is specified for either the Row or Col the current screen location for BOTH \r
- will be used and the cursor's position will not be moved back to an original location.\r
+ will be used.\r
\r
if either Row or Col is out of range for the current console, then ASSERT\r
if Format is NULL, then ASSERT\r
CHAR16 *PostReplaceFormat;\r
CHAR16 *PostReplaceFormat2;\r
UINTN Return;\r
- INT32 CurrentCol;\r
- INT32 CurrentRow;\r
+\r
EFI_STATUS Status;\r
UINTN NormalAttribute;\r
CHAR16 *ResumeLocation;\r
FreePool(PostReplaceFormat);\r
\r
if (Col != -1 && Row != -1) {\r
- CurrentCol = gST->ConOut->Mode->CursorColumn;\r
- CurrentRow = gST->ConOut->Mode->CursorRow;\r
Status = gST->ConOut->SetCursorPosition(gST->ConOut, Col, Row);\r
ASSERT_EFI_ERROR(Status);\r
- } else {\r
- CurrentCol = 0;\r
- CurrentRow = 0;\r
}\r
\r
NormalAttribute = gST->ConOut->Mode->Attribute;\r
//\r
FormatWalker = ResumeLocation + 2;\r
}\r
- \r
- if (Col != -1 && Row != -1) {\r
- Status = gST->ConOut->SetCursorPosition(gST->ConOut, CurrentCol, CurrentRow);\r
- ASSERT_EFI_ERROR(Status);\r
- }\r
\r
FreePool(PostReplaceFormat2);\r
\r
return (Return);\r
-}
\ No newline at end of file
+}\r