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:
Olivier Martin 2014-04-11 10:59:48 +00:00 committed by oliviermartin
parent 6bcedcecb5
commit 135b09a2c2
2 changed files with 98 additions and 1 deletions

View File

@ -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;
}

View File

@ -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_ */