Sync UefiLib instance in IntelFrameworkPkg with the one in MdePkg.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6797 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -1,5 +1,9 @@
|
||||
/** @file
|
||||
Implementation of UefiLib
|
||||
The UEFI Library provides functions and macros that simplify the development of
|
||||
UEFI Drivers and UEFI Applications. These functions and macros help manage EFI
|
||||
events, build simple locks utilizing EFI Task Priority Levels (TPLs), install
|
||||
EFI Driver Model related protocols, manage Unicode string tables for UEFI Drivers,
|
||||
and print messages on the console output and standard error devices.
|
||||
|
||||
Copyright (c) 2006 - 2007, Intel Corporation<BR>
|
||||
All rights reserved. This program and the accompanying materials
|
||||
@ -12,7 +16,8 @@
|
||||
|
||||
**/
|
||||
|
||||
#include "FrameworkUefiLib.h"
|
||||
|
||||
#include "UefiLibInternal.h"
|
||||
|
||||
/**
|
||||
Compare whether two names of languages are identical.
|
||||
@ -40,10 +45,15 @@ CompareIso639LanguageCode (
|
||||
}
|
||||
|
||||
/**
|
||||
This function searches the list of configuration tables stored in the EFI System
|
||||
Table for a table with a GUID that matches TableGuid. If a match is found,
|
||||
then a pointer to the configuration table is returned in Table, and EFI_SUCCESS
|
||||
is returned. If a matching GUID is not found, then EFI_NOT_FOUND is returned.
|
||||
Retrieves a pointer to the system configuration table from the EFI System Table
|
||||
based on a specified GUID.
|
||||
|
||||
This function searches the list of configuration tables stored in the EFI System Table
|
||||
for a table with a GUID that matches TableGuid. If a match is found, then a pointer to
|
||||
the configuration table is returned in Table., and EFI_SUCCESS is returned. If a matching GUID
|
||||
is not found, then EFI_NOT_FOUND is returned.
|
||||
If TableGuid is NULL, then ASSERT().
|
||||
If Table is NULL, then ASSERT().
|
||||
|
||||
@param TableGuid Pointer to table's GUID type..
|
||||
@param Table Pointer to the table associated with TableGuid in the EFI System Table.
|
||||
@ -78,16 +88,26 @@ EfiGetSystemConfigurationTable (
|
||||
}
|
||||
|
||||
/**
|
||||
This function causes the notification function to be executed for every protocol
|
||||
of type ProtocolGuid instance that exists in the system when this function is
|
||||
invoked. In addition, every time a protocol of type ProtocolGuid instance is
|
||||
installed or reinstalled, the notification function is also executed.
|
||||
Creates and returns a notification event and registers that event with all the protocol
|
||||
instances specified by ProtocolGuid.
|
||||
|
||||
This function causes the notification function to be executed for every protocol of type
|
||||
ProtocolGuid instance that exists in the system when this function is invoked.
|
||||
In addition, every time a protocol of type ProtocolGuid instance is installed or reinstalled,
|
||||
the notification function is also executed. This function returns the notification event
|
||||
that was created.
|
||||
If ProtocolGuid is NULL, then ASSERT().
|
||||
If NotifyTpl is not a legal TPL value, then ASSERT().
|
||||
If NotifyFunction is NULL, then ASSERT().
|
||||
If Registration is NULL, then ASSERT().
|
||||
|
||||
@param ProtocolGuid Supplies GUID of the protocol upon whose installation the event is fired.
|
||||
@param NotifyTpl Supplies the task priority level of the event notifications.
|
||||
@param NotifyFunction Supplies the function to notify when the event is signaled.
|
||||
@param NotifyContext The context parameter to pass to NotifyFunction.
|
||||
@param Registration A pointer to a memory location to receive the registration value.
|
||||
This value is passed to LocateHandle() to obtain new handles that
|
||||
have been added that support the ProtocolGuid-specified protocol.
|
||||
|
||||
@return The notification event that was created.
|
||||
|
||||
@ -105,6 +125,10 @@ EfiCreateProtocolNotifyEvent(
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT Event;
|
||||
|
||||
ASSERT (ProtocolGuid != NULL);
|
||||
ASSERT (NotifyFunction != NULL);
|
||||
ASSERT (Registration != NULL);
|
||||
|
||||
//
|
||||
// Create the event
|
||||
//
|
||||
@ -140,14 +164,19 @@ EfiCreateProtocolNotifyEvent(
|
||||
}
|
||||
|
||||
/**
|
||||
Creates a named event that can be signaled with EfiNamedEventSignal().
|
||||
|
||||
This function creates an event using NotifyTpl, NoifyFunction, and NotifyContext.
|
||||
This event is signaled with EfiNamedEventSignal(). This provide the ability for
|
||||
one or more listeners on the same event named by the GUID specified by Name.
|
||||
This event is signaled with EfiNamedEventSignal(). This provides the ability for one or more
|
||||
listeners on the same event named by the GUID specified by Name.
|
||||
If Name is NULL, then ASSERT().
|
||||
If NotifyTpl is not a legal TPL value, then ASSERT().
|
||||
If NotifyFunction is NULL, then ASSERT().
|
||||
|
||||
@param Name Supplies GUID name of the event.
|
||||
@param NotifyTpl Supplies the task priority level of the event notifications.
|
||||
@param NotifyFunction Supplies the function to notify when the event is signaled.
|
||||
@param NotifyContext The context parameter to pass to NotifyFunction.
|
||||
@param NotifyContext The context parameter to pass to NotifyFunction.
|
||||
@param Registration A pointer to a memory location to receive the registration value.
|
||||
|
||||
@retval EFI_SUCCESS A named event was created.
|
||||
@ -168,6 +197,10 @@ EfiNamedEventListen (
|
||||
EFI_EVENT Event;
|
||||
VOID *RegistrationLocal;
|
||||
|
||||
ASSERT (Name != NULL);
|
||||
ASSERT (NotifyFunction != NULL);
|
||||
ASSERT (NotifyTpl <= TPL_HIGH_LEVEL);
|
||||
|
||||
//
|
||||
// Create event
|
||||
//
|
||||
@ -201,12 +234,15 @@ EfiNamedEventListen (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
This function signals the named event specified by Name. The named event must
|
||||
have been created with EfiNamedEventListen().
|
||||
Signals a named event created with EfiNamedEventListen().
|
||||
|
||||
This function signals the named event specified by Name. The named event must have been
|
||||
created with EfiNamedEventListen().
|
||||
If Name is NULL, then ASSERT().
|
||||
|
||||
@param Name Supplies GUID name of the event.
|
||||
|
||||
@ -223,6 +259,8 @@ EfiNamedEventSignal (
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
ASSERT(Name != NULL);
|
||||
|
||||
Handle = NULL;
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&Handle,
|
||||
@ -239,16 +277,16 @@ EfiNamedEventSignal (
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
Returns the current TPL.
|
||||
|
||||
This function returns the current TPL. There is no EFI service to directly
|
||||
retrieve the current TPL. Instead, the RaiseTPL() function is used to raise
|
||||
the TPL to TPL_HIGH_LEVEL. This will return the current TPL. The TPL level
|
||||
can then immediately be restored back to the current TPL level with a call
|
||||
This function returns the current TPL. There is no EFI service to directly
|
||||
retrieve the current TPL. Instead, the RaiseTPL() function is used to raise
|
||||
the TPL to TPL_HIGH_LEVEL. This will return the current TPL. The TPL level
|
||||
can then immediately be restored back to the current TPL level with a call
|
||||
to RestoreTPL().
|
||||
|
||||
@return The current TPL.
|
||||
@ -270,10 +308,14 @@ EfiGetCurrentTpl (
|
||||
|
||||
|
||||
/**
|
||||
This function initializes a basic mutual exclusion lock to the released state
|
||||
and returns the lock. Each lock provides mutual exclusion access at its task
|
||||
Initializes a basic mutual exclusion lock.
|
||||
|
||||
This function initializes a basic mutual exclusion lock to the released state
|
||||
and returns the lock. Each lock provides mutual exclusion access at its task
|
||||
priority level. Since there is no preemption or multiprocessor support in EFI,
|
||||
acquiring the lock only consists of raising to the locks TPL.
|
||||
If Lock is NULL, then ASSERT().
|
||||
If Priority is not a valid TPL value, then ASSERT().
|
||||
|
||||
@param Lock A pointer to the lock data structure to initialize.
|
||||
@param Priority EFI TPL associated with the lock.
|
||||
@ -298,11 +340,16 @@ EfiInitializeLock (
|
||||
}
|
||||
|
||||
/**
|
||||
This function raises the system's current task priority level to the task
|
||||
priority level of the mutual exclusion lock. Then, it places the lock in the
|
||||
acquired state.
|
||||
Acquires ownership of a lock.
|
||||
|
||||
@param Lock Point to EFI_LOCK instance
|
||||
This function raises the system's current task priority level to the task
|
||||
priority level of the mutual exclusion lock. Then, it places the lock in the
|
||||
acquired state.
|
||||
If Lock is NULL, then ASSERT().
|
||||
If Lock is not initialized, then ASSERT().
|
||||
If Lock is already in the acquired state, then ASSERT().
|
||||
|
||||
@param Lock A pointer to the lock to acquire.
|
||||
|
||||
**/
|
||||
VOID
|
||||
@ -319,9 +366,14 @@ EfiAcquireLock (
|
||||
}
|
||||
|
||||
/**
|
||||
This function raises the system's current task priority level to the task
|
||||
priority level of the mutual exclusion lock. Then, it attempts to place the
|
||||
lock in the acquired state.
|
||||
Acquires ownership of a lock.
|
||||
|
||||
This function raises the system's current task priority level to the task priority
|
||||
level of the mutual exclusion lock. Then, it attempts to place the lock in the acquired state.
|
||||
If the lock is already in the acquired state, then EFI_ACCESS_DENIED is returned.
|
||||
Otherwise, EFI_SUCCESS is returned.
|
||||
If Lock is NULL, then ASSERT().
|
||||
If Lock is not initialized, then ASSERT().
|
||||
|
||||
@param Lock A pointer to the lock to acquire.
|
||||
|
||||
@ -354,9 +406,14 @@ EfiAcquireLockOrFail (
|
||||
}
|
||||
|
||||
/**
|
||||
This function transitions a mutual exclusion lock from the acquired state to
|
||||
the released state, and restores the system's task priority level to its
|
||||
Releases ownership of a lock.
|
||||
|
||||
This function transitions a mutual exclusion lock from the acquired state to
|
||||
the released state, and restores the system's task priority level to its
|
||||
previous level.
|
||||
If Lock is NULL, then ASSERT().
|
||||
If Lock is not initialized, then ASSERT().
|
||||
If Lock is already in the released state, then ASSERT().
|
||||
|
||||
@param Lock A pointer to the lock to release.
|
||||
|
||||
@ -386,7 +443,7 @@ EfiReleaseLock (
|
||||
currently managing the controller specified by ControllerHandle. This test
|
||||
is performed by evaluating if the the protocol specified by ProtocolGuid is
|
||||
present on ControllerHandle and is was opened by DriverBindingHandle with an
|
||||
attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
|
||||
attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
|
||||
If ProtocolGuid is NULL, then ASSERT().
|
||||
|
||||
@param ControllerHandle A handle for a controller to test.
|
||||
@ -449,10 +506,10 @@ EfiTestManagedDevice (
|
||||
ChildHandle with an attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
|
||||
If ProtocolGuid is NULL, then ASSERT().
|
||||
|
||||
@param ControllerHandle A handle for a (parent) controller to test.
|
||||
@param ControllerHandle A handle for a (parent) controller to test.
|
||||
@param ChildHandle A child handle to test.
|
||||
@param ProtocolGuid Supplies the protocol that the child controller
|
||||
opens on its parent controller.
|
||||
opens on its parent controller.
|
||||
|
||||
@retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
|
||||
@retval EFI_UNSUPPORTED ChildHandle is not a child of the
|
||||
@ -505,31 +562,32 @@ EfiTestChildHandle (
|
||||
}
|
||||
|
||||
/**
|
||||
This function looks up a Unicode string in UnicodeStringTable. If Language is
|
||||
a member of SupportedLanguages and a Unicode string is found in UnicodeStringTable
|
||||
that matches the language code specified by Language, then it is returned in
|
||||
UnicodeString.
|
||||
This function looks up a Unicode string in UnicodeStringTable.
|
||||
|
||||
@param Language A pointer to the ISO 639-2 language code for the
|
||||
If Language is a member of SupportedLanguages and a Unicode string is found in
|
||||
UnicodeStringTable that matches the language code specified by Language, then it
|
||||
is returned in UnicodeString.
|
||||
|
||||
@param Language A pointer to the ISO 639-2 language code for the
|
||||
Unicode string to look up and return.
|
||||
@param SupportedLanguages A pointer to the set of ISO 639-2 language codes
|
||||
that the Unicode string table supports. Language
|
||||
@param SupportedLanguages A pointer to the set of ISO 639-2 language codes
|
||||
that the Unicode string table supports. Language
|
||||
must be a member of this set.
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
@param UnicodeString A pointer to the Unicode string from UnicodeStringTable
|
||||
that matches the language specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
specified by Language was found
|
||||
in the table of Unicoide strings UnicodeStringTable,
|
||||
in the table of Unicoide strings UnicodeStringTable,
|
||||
and it was returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_UNSUPPORTED UnicodeStringTable is NULL.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_UNSUPPORTED UnicodeStringTable is NULL.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
member of SupportedLanguages.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not
|
||||
supported by UnicodeStringTable.
|
||||
|
||||
**/
|
||||
@ -588,15 +646,138 @@ LookupUnicodeString (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
This function looks up a Unicode string in UnicodeStringTable.
|
||||
|
||||
If Language is a member of SupportedLanguages and a Unicode string is found in
|
||||
UnicodeStringTable that matches the language code specified by Language, then
|
||||
it is returned in UnicodeString.
|
||||
|
||||
@param Language A pointer to an ASCII string containing the ISO 639-2 or the
|
||||
RFC 4646 language code for the Unicode string to look up and
|
||||
return. If Iso639Language is TRUE, then this ASCII string is
|
||||
not assumed to be Null-terminated, and only the first three
|
||||
chacters are used. If Iso639Language is FALSE, then this ASCII
|
||||
string must be Null-terminated.
|
||||
@param SupportedLanguages A pointer to a Null-terminated ASCII string that contains a
|
||||
set of ISO 639-2 or RFC 4646 language codes that the Unicode
|
||||
string table supports. Language must be a member of this set.
|
||||
If Iso639Language is TRUE, then this string contains one or more
|
||||
ISO 639-2 language codes with no separator characters. If Iso639Language
|
||||
is FALSE, then is string contains one or more RFC 4646 language
|
||||
codes separated by ';'.
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings. Type EFI_UNICODE_STRING_TABLE
|
||||
is defined in "Related Definitions".
|
||||
@param UnicodeString A pointer to the Null-terminated Unicode string from UnicodeStringTable
|
||||
that matches the language specified by Language.
|
||||
@param Iso639Language Specifies the supported language code format. If it is TRUE, then
|
||||
Language and SupportedLanguages follow ISO 639-2 language code format.
|
||||
Otherwise, they follow RFC 4646 language code format.
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language specified by Language
|
||||
was found in the table of Unicode strings UnicodeStringTable, and
|
||||
it was returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_UNSUPPORTED UnicodeStringTable is NULL.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a member of SupportedLanguages.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not supported by UnicodeStringTable.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
|
||||
EFIAPI
|
||||
LookupUnicodeString2 (
|
||||
IN CONST CHAR8 *Language,
|
||||
IN CONST CHAR8 *SupportedLanguages,
|
||||
IN CONST EFI_UNICODE_STRING_TABLE *UnicodeStringTable,
|
||||
OUT CHAR16 **UnicodeString,
|
||||
IN BOOLEAN Iso639Language
|
||||
)
|
||||
{
|
||||
BOOLEAN Found;
|
||||
UINTN Index;
|
||||
CHAR8 *LanguageString;
|
||||
|
||||
//
|
||||
// Make sure the parameters are valid
|
||||
//
|
||||
if (Language == NULL || UnicodeString == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// If there are no supported languages, or the Unicode String Table is empty, then the
|
||||
// Unicode String specified by Language is not supported by this Unicode String Table
|
||||
//
|
||||
if (SupportedLanguages == NULL || UnicodeStringTable == NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure Language is in the set of Supported Languages
|
||||
//
|
||||
Found = FALSE;
|
||||
while (*SupportedLanguages != 0) {
|
||||
if (Iso639Language) {
|
||||
if (CompareIso639LanguageCode (Language, SupportedLanguages)) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
SupportedLanguages += 3;
|
||||
} else {
|
||||
for (Index = 0; SupportedLanguages[Index] != 0 && SupportedLanguages[Index] != ';'; Index++);
|
||||
if ((AsciiStrnCmp(SupportedLanguages, Language, Index) == 0) && (Language[Index] == 0)) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
SupportedLanguages += Index;
|
||||
for (; *SupportedLanguages != 0 && *SupportedLanguages == ';'; SupportedLanguages++);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If Language is not a member of SupportedLanguages, then return EFI_UNSUPPORTED
|
||||
//
|
||||
if (!Found) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Search the Unicode String Table for the matching Language specifier
|
||||
//
|
||||
while (UnicodeStringTable->Language != NULL) {
|
||||
LanguageString = UnicodeStringTable->Language;
|
||||
while (0 != *LanguageString) {
|
||||
for (Index = 0 ;LanguageString[Index] != 0 && LanguageString[Index] != ';'; Index++);
|
||||
if (AsciiStrnCmp(LanguageString, Language, Index) == 0) {
|
||||
*UnicodeString = UnicodeStringTable->UnicodeString;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
LanguageString += Index;
|
||||
for (Index = 0 ;LanguageString[Index] != 0 && LanguageString[Index] == ';'; Index++);
|
||||
}
|
||||
UnicodeStringTable++;
|
||||
}
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function adds a Unicode string to UnicodeStringTable.
|
||||
If Language is a member of SupportedLanguages then UnicodeString is added to
|
||||
UnicodeStringTable. New buffers are allocated for both Language and
|
||||
UnicodeString. The contents of Language and UnicodeString are copied into
|
||||
these new buffers. These buffers are automatically freed when
|
||||
|
||||
If Language is a member of SupportedLanguages then UnicodeString is added to
|
||||
UnicodeStringTable. New buffers are allocated for both Language and
|
||||
UnicodeString. The contents of Language and UnicodeString are copied into
|
||||
these new buffers. These buffers are automatically freed when
|
||||
FreeUnicodeStringTable() is called.
|
||||
|
||||
@param Language A pointer to the ISO 639-2 language code for the Unicode
|
||||
@param Language A pointer to the ISO 639-2 language code for the Unicode
|
||||
string to add.
|
||||
@param SupportedLanguages A pointer to the set of ISO 639-2 language codes
|
||||
that the Unicode string table supports.
|
||||
@ -604,19 +785,19 @@ LookupUnicodeString (
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
@param UnicodeString A pointer to the Unicode string to add.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
specified by Language was found in the table of
|
||||
Unicode strings UnicodeStringTable, and it was
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language
|
||||
specified by Language was found in the table of
|
||||
Unicode strings UnicodeStringTable, and it was
|
||||
returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is an empty string.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_ALREADY_STARTED A Unicode string with language Language is
|
||||
@retval EFI_ALREADY_STARTED A Unicode string with language Language is
|
||||
already present in UnicodeStringTable.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not enough memory to add another
|
||||
@retval EFI_OUT_OF_RESOURCES There is not enough memory to add another
|
||||
Unicode string to UnicodeStringTable.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a
|
||||
member of SupportedLanguages.
|
||||
|
||||
**/
|
||||
@ -754,10 +935,212 @@ AddUnicodeString (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function adds the Null-terminated Unicode string specified by UnicodeString
|
||||
to UnicodeStringTable.
|
||||
|
||||
If Language is a member of SupportedLanguages then UnicodeString is added to
|
||||
UnicodeStringTable. New buffers are allocated for both Language and UnicodeString.
|
||||
The contents of Language and UnicodeString are copied into these new buffers.
|
||||
These buffers are automatically freed when EfiLibFreeUnicodeStringTable() is called.
|
||||
|
||||
@param Language A pointer to an ASCII string containing the ISO 639-2 or
|
||||
the RFC 4646 language code for the Unicode string to add.
|
||||
If Iso639Language is TRUE, then this ASCII string is not
|
||||
assumed to be Null-terminated, and only the first three
|
||||
chacters are used. If Iso639Language is FALSE, then this
|
||||
ASCII string must be Null-terminated.
|
||||
@param SupportedLanguages A pointer to a Null-terminated ASCII string that contains
|
||||
a set of ISO 639-2 or RFC 4646 language codes that the Unicode
|
||||
string table supports. Language must be a member of this set.
|
||||
If Iso639Language is TRUE, then this string contains one or more
|
||||
ISO 639-2 language codes with no separator characters.
|
||||
If Iso639Language is FALSE, then is string contains one or more
|
||||
RFC 4646 language codes separated by ';'.
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings. Type EFI_UNICODE_STRING_TABLE
|
||||
is defined in "Related Definitions".
|
||||
@param UnicodeString A pointer to the Unicode string to add.
|
||||
@param Iso639Language Specifies the supported language code format. If it is TRUE,
|
||||
then Language and SupportedLanguages follow ISO 639-2 language code format.
|
||||
Otherwise, they follow RFC 4646 language code format.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string that matches the language specified by
|
||||
Language was found in the table of Unicode strings UnicodeStringTable,
|
||||
and it was returned in UnicodeString.
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is NULL.
|
||||
@retval EFI_INVALID_PARAMETER UnicodeString is an empty string.
|
||||
@retval EFI_UNSUPPORTED SupportedLanguages is NULL.
|
||||
@retval EFI_ALREADY_STARTED A Unicode string with language Language is already present in
|
||||
UnicodeStringTable.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not enough memory to add another Unicode string UnicodeStringTable.
|
||||
@retval EFI_UNSUPPORTED The language specified by Language is not a member of SupportedLanguages.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AddUnicodeString2 (
|
||||
IN CONST CHAR8 *Language,
|
||||
IN CONST CHAR8 *SupportedLanguages,
|
||||
IN EFI_UNICODE_STRING_TABLE **UnicodeStringTable,
|
||||
IN CONST CHAR16 *UnicodeString,
|
||||
IN BOOLEAN Iso639Language
|
||||
)
|
||||
{
|
||||
UINTN NumberOfEntries;
|
||||
EFI_UNICODE_STRING_TABLE *OldUnicodeStringTable;
|
||||
EFI_UNICODE_STRING_TABLE *NewUnicodeStringTable;
|
||||
UINTN UnicodeStringLength;
|
||||
BOOLEAN Found;
|
||||
UINTN Index;
|
||||
CHAR8 *LanguageString;
|
||||
|
||||
//
|
||||
// Make sure the parameter are valid
|
||||
//
|
||||
if (Language == NULL || UnicodeString == NULL || UnicodeStringTable == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// If there are no supported languages, then a Unicode String can not be added
|
||||
//
|
||||
if (SupportedLanguages == NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// If the Unicode String is empty, then a Unicode String can not be added
|
||||
//
|
||||
if (UnicodeString[0] == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure Language is a member of SupportedLanguages
|
||||
//
|
||||
Found = FALSE;
|
||||
while (*SupportedLanguages != 0) {
|
||||
if (Iso639Language) {
|
||||
if (CompareIso639LanguageCode (Language, SupportedLanguages)) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
SupportedLanguages += 3;
|
||||
} else {
|
||||
for (Index = 0; SupportedLanguages[Index] != 0 && SupportedLanguages[Index] != ';'; Index++);
|
||||
if (AsciiStrnCmp(SupportedLanguages, Language, Index) == 0) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
SupportedLanguages += Index;
|
||||
for (; *SupportedLanguages != 0 && *SupportedLanguages == ';'; SupportedLanguages++);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If Language is not a member of SupportedLanguages, then return EFI_UNSUPPORTED
|
||||
//
|
||||
if (!Found) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Determine the size of the Unicode String Table by looking for a NULL Language entry
|
||||
//
|
||||
NumberOfEntries = 0;
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
OldUnicodeStringTable = *UnicodeStringTable;
|
||||
while (OldUnicodeStringTable->Language != NULL) {
|
||||
LanguageString = OldUnicodeStringTable->Language;
|
||||
|
||||
while (*LanguageString != 0) {
|
||||
for (Index = 0; LanguageString[Index] != 0 && LanguageString[Index] != ';'; Index++);
|
||||
|
||||
if (AsciiStrnCmp (Language, LanguageString, Index) == 0) {
|
||||
return EFI_ALREADY_STARTED;
|
||||
}
|
||||
LanguageString += Index;
|
||||
for (; *LanguageString != 0 && *LanguageString == ';'; LanguageString++);
|
||||
}
|
||||
OldUnicodeStringTable++;
|
||||
NumberOfEntries++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for a new Unicode String Table. It must hold the current number of
|
||||
// entries, plus 1 entry for the new Unicode String, plus 1 entry for the end of table
|
||||
// marker
|
||||
//
|
||||
NewUnicodeStringTable = AllocatePool ((NumberOfEntries + 2) * sizeof (EFI_UNICODE_STRING_TABLE));
|
||||
if (NewUnicodeStringTable == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// If the current Unicode String Table contains any entries, then copy them to the
|
||||
// newly allocated Unicode String Table.
|
||||
//
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
CopyMem (
|
||||
NewUnicodeStringTable,
|
||||
*UnicodeStringTable,
|
||||
NumberOfEntries * sizeof (EFI_UNICODE_STRING_TABLE)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate space for a copy of the Language specifier
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries].Language = AllocateCopyPool (AsciiStrSize(Language), Language);
|
||||
if (NewUnicodeStringTable[NumberOfEntries].Language == NULL) {
|
||||
gBS->FreePool (NewUnicodeStringTable);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// Compute the length of the Unicode String
|
||||
//
|
||||
for (UnicodeStringLength = 0; UnicodeString[UnicodeStringLength] != 0; UnicodeStringLength++);
|
||||
|
||||
//
|
||||
// Allocate space for a copy of the Unicode String
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries].UnicodeString = AllocateCopyPool (StrSize (UnicodeString), UnicodeString);
|
||||
if (NewUnicodeStringTable[NumberOfEntries].UnicodeString == NULL) {
|
||||
gBS->FreePool (NewUnicodeStringTable[NumberOfEntries].Language);
|
||||
gBS->FreePool (NewUnicodeStringTable);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// Mark the end of the Unicode String Table
|
||||
//
|
||||
NewUnicodeStringTable[NumberOfEntries + 1].Language = NULL;
|
||||
NewUnicodeStringTable[NumberOfEntries + 1].UnicodeString = NULL;
|
||||
|
||||
//
|
||||
// Free the old Unicode String Table
|
||||
//
|
||||
if (*UnicodeStringTable != NULL) {
|
||||
gBS->FreePool (*UnicodeStringTable);
|
||||
}
|
||||
|
||||
//
|
||||
// Point UnicodeStringTable at the newly allocated Unicode String Table
|
||||
//
|
||||
*UnicodeStringTable = NewUnicodeStringTable;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
This function frees the table of Unicode strings in UnicodeStringTable.
|
||||
|
||||
If UnicodeStringTable is NULL, then EFI_SUCCESS is returned.
|
||||
Otherwise, each language code, and each Unicode string in the Unicode string
|
||||
Otherwise, each language code, and each Unicode string in the Unicode string
|
||||
table are freed, and EFI_SUCCESS is returned.
|
||||
|
||||
@param UnicodeStringTable A pointer to the table of Unicode strings.
|
||||
@ -805,4 +1188,3 @@ FreeUnicodeStringTable (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user