/* If String is not NULL and not aligned on a 16-bit boundary, then ASSERT(). If FormatString is NULL, then ASSERT(). If FormatString is not aligned on a 16-bit boundary, then ASSERT(). */
CHAR16* EFIAPI CatVSPrint(IN CHAR16 *String OPTIONAL, IN CONST CHAR16 *FormatString, IN VA_LIST Marker)
/* If String is not NULL and not aligned on a 16-bit boundary, then ASSERT(). If FormatString is NULL, then ASSERT(). If FormatString is not aligned on a 16-bit boundary, then ASSERT(). */
CHAR16* EFIAPI CatVSPrint(IN CHAR16 *String OPTIONAL, IN CONST CHAR16 *FormatString, IN VA_LIST Marker)
{
  UINTN    CharactersRequired;
  UINTN    SizeRequired;
  CHAR16   *BufferToReturn;
  VA_LIST  ExtraMarker;
  VA_COPY (ExtraMarker, Marker);
  CharactersRequired = SPrintLength (FormatString, ExtraMarker);
  VA_END (ExtraMarker);
  if (String != NULL) {
    SizeRequired = StrSize (String) + (CharactersRequired * sizeof (CHAR16));
  } else {
    SizeRequired = sizeof (CHAR16) + (CharactersRequired * sizeof (CHAR16));
  }
  BufferToReturn = AllocatePool (SizeRequired);
  if (BufferToReturn == NULL) {
    return NULL;
  } else {
    BufferToReturn[0] = L'\0';
  }
  if (String != NULL) {
    StrCpyS (BufferToReturn, SizeRequired / sizeof (CHAR16), String);
  }
  UnicodeVSPrint (BufferToReturn + StrLen (BufferToReturn), (CharactersRequired+1) * sizeof (CHAR16), FormatString, Marker);
  ASSERT (StrSize (BufferToReturn) == SizeRequired);
  return (BufferToReturn);
}