+/**\r
+ This is a find and replace function. it will return the NewString as a copy of \r
+ SourceString with each instance of FindTarget replaced with ReplaceWith.\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] NewSize Size in bytes of NewString\r
+ @param[in] FindTarget String to look for\r
+ @param[in[ ReplaceWith String to replace FindTarget with\r
+\r
+ @retval EFI_INVALID_PARAMETER SourceString was NULL\r
+ @retval EFI_INVALID_PARAMETER NewString was NULL\r
+ @retval EFI_INVALID_PARAMETER FindTarget was NULL\r
+ @retval EFI_INVALID_PARAMETER ReplaceWith was NULL\r
+ @retval EFI_INVALID_PARAMETER FindTarget had length < 1\r
+ @retval EFI_INVALID_PARAMETER SourceString had length < 1\r
+ @retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold \r
+ the new string (truncation occurred)\r
+ @retval EFI_SUCCESS the string was sucessfully copied with replacement\r
+**/\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+CopyReplace(\r
+ IN CHAR16 CONST *SourceString,\r
+ IN CHAR16 *NewString,\r
+ IN UINTN NewSize,\r
+ IN CONST CHAR16 *FindTarget,\r
+ IN CONST CHAR16 *ReplaceWith\r
+ ){\r
+ if ( (SourceString == NULL)\r
+ || (NewString == NULL)\r
+ || (FindTarget == NULL)\r
+ || (ReplaceWith == NULL)\r
+ || (StrLen(FindTarget) < 1)\r
+ || (StrLen(SourceString) < 1)\r
+ ){\r
+ return (EFI_INVALID_PARAMETER);\r
+ }\r
+ NewString = SetMem16(NewString, NewSize, L'\0');\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
+ return (EFI_BUFFER_TOO_SMALL);\r
+ }\r
+ StrCat(NewString, ReplaceWith);\r
+ } else {\r
+ if (StrSize(NewString) + sizeof(CHAR16) > NewSize) {\r
+ return (EFI_BUFFER_TOO_SMALL);\r
+ }\r
+ StrnCat(NewString, SourceString, 1);\r
+ SourceString++;\r
+ }\r
+ }\r
+ return (EFI_SUCCESS);\r
+}\r