diff --git a/ArmPlatformPkg/Bds/BdsHelper.c b/ArmPlatformPkg/Bds/BdsHelper.c index b5a3fa91b1..152061d0f7 100644 --- a/ArmPlatformPkg/Bds/BdsHelper.c +++ b/ArmPlatformPkg/Bds/BdsHelper.c @@ -1,6 +1,6 @@ /** @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 * are licensed and made available under the terms and conditions of the BSD License @@ -338,3 +338,79 @@ IsUnicodeString ( 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; +} diff --git a/ArmPlatformPkg/Bds/BdsInternal.h b/ArmPlatformPkg/Bds/BdsInternal.h index da7b8ca704..447b8c9cd1 100644 --- a/ArmPlatformPkg/Bds/BdsInternal.h +++ b/ArmPlatformPkg/Bds/BdsInternal.h @@ -257,4 +257,25 @@ IsUnicodeString ( 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_ */