adding new parameter to search and replace function to allow for easy skipping of items preceded by ^

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9726 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jcarsey 2010-01-13 16:46:33 +00:00
parent 965626c940
commit 969c783b46
2 changed files with 34 additions and 17 deletions

View File

@ -1033,6 +1033,8 @@ StrnCatGrow (
@param[in] NewSize Size in bytes of NewString. @param[in] NewSize Size in bytes of NewString.
@param[in] FindTarget String to look for. @param[in] FindTarget String to look for.
@param[in] ReplaceWith String to replace FindTarget with. @param[in] ReplaceWith String to replace FindTarget with.
@param[in] SkipPreCarrot If TRUE will skip a FindTarget that has a '^'
immediately before it.
@retval EFI_INVALID_PARAMETER SourceString was NULL. @retval EFI_INVALID_PARAMETER SourceString was NULL.
@retval EFI_INVALID_PARAMETER NewString was NULL. @retval EFI_INVALID_PARAMETER NewString was NULL.
@ -1042,19 +1044,25 @@ StrnCatGrow (
@retval EFI_INVALID_PARAMETER SourceString had length < 1. @retval EFI_INVALID_PARAMETER SourceString had length < 1.
@retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold @retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold
the new string (truncation occurred). the new string (truncation occurred).
@retval EFI_SUCCESS the string was sucessfully copied with replacement. @retval EFI_SUCCESS The string was sucessfully copied with replacement.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ShellLibCopySearchAndReplace( ShellCopySearchAndReplace2(
IN CHAR16 CONST *SourceString, IN CHAR16 CONST *SourceString,
IN CHAR16 *NewString, IN CHAR16 *NewString,
IN UINTN NewSize, IN UINTN NewSize,
IN CONST CHAR16 *FindTarget, IN CONST CHAR16 *FindTarget,
IN CONST CHAR16 *ReplaceWith IN CONST CHAR16 *ReplaceWith,
IN CONST BOOLEAN SkipPreCarrot
); );
///
/// make upgrades easier from old version
///
#define ShellLibCopySearchAndReplace(a,b,c,d,e) ShellCopySearchAndReplace2(a,b,c,d,e,FALSE)
/** /**
Check if a Unicode character is a hexadecimal character. Check if a Unicode character is a hexadecimal character.
@ -1070,7 +1078,7 @@ ShellLibCopySearchAndReplace(
**/ **/
BOOLEAN BOOLEAN
EFIAPI EFIAPI
ShellLibIsHexaDecimalDigitCharacter ( ShellIsHexaDecimalDigitCharacter (
IN CHAR16 Char IN CHAR16 Char
); );

View File

@ -53,7 +53,7 @@ STATIC CHAR16 *mPostReplaceFormat2;
**/ **/
BOOLEAN BOOLEAN
EFIAPI EFIAPI
ShellLibIsHexaDecimalDigitCharacter ( ShellIsHexaDecimalDigitCharacter (
IN CHAR16 Char IN CHAR16 Char
) { ) {
return (BOOLEAN) ((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F') || (Char >= L'a' && Char <= L'f')); return (BOOLEAN) ((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F') || (Char >= L'a' && Char <= L'f'));
@ -1684,7 +1684,7 @@ InternalIsFlag (
// //
// If we accept numbers then dont return TRUE. (they will be values) // If we accept numbers then dont return TRUE. (they will be values)
// //
if (((Name[0] == L'-' || Name[0] == L'+') && ShellLibIsHexaDecimalDigitCharacter(Name[1])) && AlwaysAllowNumbers != FALSE) { if (((Name[0] == L'-' || Name[0] == L'+') && ShellIsHexaDecimalDigitCharacter(Name[1])) && AlwaysAllowNumbers != FALSE) {
return (FALSE); return (FALSE);
} }
@ -2249,26 +2249,29 @@ ShellCommandLineCheckDuplicate (
@param[in] NewSize Size in bytes of NewString @param[in] NewSize Size in bytes of NewString
@param[in] FindTarget String to look for @param[in] FindTarget String to look for
@param[in[ ReplaceWith String to replace FindTarget with @param[in[ ReplaceWith String to replace FindTarget with
@param[in] SkipPreCarrot If TRUE will skip a FindTarget that has a '^'
immediately before it.
@retval EFI_INVALID_PARAMETER SourceString was NULL @retval EFI_INVALID_PARAMETER SourceString was NULL.
@retval EFI_INVALID_PARAMETER NewString was NULL @retval EFI_INVALID_PARAMETER NewString was NULL.
@retval EFI_INVALID_PARAMETER FindTarget was NULL @retval EFI_INVALID_PARAMETER FindTarget was NULL.
@retval EFI_INVALID_PARAMETER ReplaceWith was NULL @retval EFI_INVALID_PARAMETER ReplaceWith was NULL.
@retval EFI_INVALID_PARAMETER FindTarget had length < 1 @retval EFI_INVALID_PARAMETER FindTarget had length < 1.
@retval EFI_INVALID_PARAMETER SourceString had length < 1 @retval EFI_INVALID_PARAMETER SourceString had length < 1.
@retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold @retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold
the new string (truncation occurred) the new string (truncation occurred).
@retval EFI_SUCCESS the string was sucessfully copied with replacement @retval EFI_SUCCESS the string was sucessfully copied with replacement.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ShellLibCopySearchAndReplace( ShellCopySearchAndReplace2(
IN CHAR16 CONST *SourceString, IN CHAR16 CONST *SourceString,
IN CHAR16 *NewString, IN CHAR16 *NewString,
IN UINTN NewSize, IN UINTN NewSize,
IN CONST CHAR16 *FindTarget, IN CONST CHAR16 *FindTarget,
IN CONST CHAR16 *ReplaceWith IN CONST CHAR16 *ReplaceWith,
IN CONST BOOLEAN SkipPreCarrot
) )
{ {
UINTN Size; UINTN Size;
@ -2283,7 +2286,13 @@ ShellLibCopySearchAndReplace(
} }
NewString = SetMem16(NewString, NewSize, CHAR_NULL); NewString = SetMem16(NewString, NewSize, CHAR_NULL);
while (*SourceString != CHAR_NULL) { while (*SourceString != CHAR_NULL) {
if (StrnCmp(SourceString, FindTarget, StrLen(FindTarget)) == 0) { //
// if we find the FindTarget and either Skip == FALSE or Skip == TRUE and we
// dont have a carrot do a replace...
//
if (StrnCmp(SourceString, FindTarget, StrLen(FindTarget)) == 0
&& ((SkipPreCarrot && *(SourceString-1) != L'^') || SkipPreCarrot == FALSE)
){
SourceString += StrLen(FindTarget); SourceString += StrLen(FindTarget);
Size = StrSize(NewString); Size = StrSize(NewString);
if ((Size + (StrLen(ReplaceWith)*sizeof(CHAR16))) > NewSize) { if ((Size + (StrLen(ReplaceWith)*sizeof(CHAR16))) > NewSize) {