mirror of https://github.com/acidanthera/audk.git
ArmPlatformPkg/Bds: Introduced helper function to detect if an Ascii/Unicode string is printable
Some limitations: - it only supports unicode string that use ASCII character (< 0x100) - single character ASCII strings are interpreted as Unicode string - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15455 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
6bcedcecb5
commit
135b09a2c2
|
@ -1,6 +1,6 @@
|
||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
* Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program and the accompanying materials
|
* This program and the accompanying materials
|
||||||
* are licensed and made available under the terms and conditions of the BSD License
|
* are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -338,3 +338,79 @@ IsUnicodeString (
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to detect if the given string is an ASCII or Unicode string
|
||||||
|
*
|
||||||
|
* There are actually few limitation to this function but it is mainly to give
|
||||||
|
* a user friendly output.
|
||||||
|
*
|
||||||
|
* Some limitations:
|
||||||
|
* - it only supports unicode string that use ASCII character (< 0x100)
|
||||||
|
* - single character ASCII strings are interpreted as Unicode string
|
||||||
|
* - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes)
|
||||||
|
*
|
||||||
|
* @param String Buffer that might contain a Unicode or Ascii string
|
||||||
|
* @param IsUnicode If not NULL this boolean value returns if the string is an
|
||||||
|
* ASCII or Unicode string.
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
IsPrintableString (
|
||||||
|
IN VOID* String,
|
||||||
|
OUT BOOLEAN *IsUnicode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
BOOLEAN UnicodeDetected;
|
||||||
|
BOOLEAN IsPrintable;
|
||||||
|
UINTN Index;
|
||||||
|
CHAR16 Character;
|
||||||
|
|
||||||
|
// We do not support NULL pointer
|
||||||
|
ASSERT (String != NULL);
|
||||||
|
|
||||||
|
// Test empty string
|
||||||
|
if (*(CHAR16*)String == L'\0') {
|
||||||
|
if (IsUnicode) {
|
||||||
|
*IsUnicode = TRUE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
} else if (*(CHAR16*)String == '\0') {
|
||||||
|
if (IsUnicode) {
|
||||||
|
*IsUnicode = FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limitation: if the string is an ASCII single character string. This comparison
|
||||||
|
// will assume it is a Unicode string.
|
||||||
|
if (*(CHAR16*)String < 0x100) {
|
||||||
|
UnicodeDetected = TRUE;
|
||||||
|
} else {
|
||||||
|
UnicodeDetected = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
IsPrintable = FALSE;
|
||||||
|
for (Index = 0; Index < BOOT_DEVICE_OPTION_MAX * 2; Index++) {
|
||||||
|
if (UnicodeDetected) {
|
||||||
|
Character = ((CHAR16*)String)[Index];
|
||||||
|
} else {
|
||||||
|
Character = ((CHAR8*)String)[Index];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Character == '\0') {
|
||||||
|
// End of the string
|
||||||
|
IsPrintable = TRUE;
|
||||||
|
break;
|
||||||
|
} else if ((Character < 0x20) || (Character > 0x7f)) {
|
||||||
|
// We only support the range of printable ASCII character
|
||||||
|
IsPrintable = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsPrintable && IsUnicode) {
|
||||||
|
*IsUnicode = UnicodeDetected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IsPrintable;
|
||||||
|
}
|
||||||
|
|
|
@ -257,4 +257,25 @@ IsUnicodeString (
|
||||||
IN VOID* String
|
IN VOID* String
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to detect if the given string is an ASCII or Unicode string
|
||||||
|
*
|
||||||
|
* There are actually few limitation to this function but it is mainly to give
|
||||||
|
* a user friendly output.
|
||||||
|
*
|
||||||
|
* Some limitations:
|
||||||
|
* - it only supports unicode string that use ASCII character (< 0x100)
|
||||||
|
* - single character ASCII strings are interpreted as Unicode string
|
||||||
|
* - string cannot be longer than 2 x BOOT_DEVICE_OPTION_MAX (600 bytes)
|
||||||
|
*
|
||||||
|
* @param String Buffer that might contain a Unicode or Ascii string
|
||||||
|
* @param IsUnicode If not NULL this boolean value returns if the string is an
|
||||||
|
* ASCII or Unicode string.
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
IsPrintableString (
|
||||||
|
IN VOID* String,
|
||||||
|
OUT BOOLEAN *IsUnicode
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* _BDSINTERNAL_H_ */
|
#endif /* _BDSINTERNAL_H_ */
|
||||||
|
|
Loading…
Reference in New Issue