/*++

Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

Module Name:

  PrintLib.c

Abstract:

  Print Library

--*/




#include <PiDxe.h>

#include <Protocol/Print.h>

#include <Library/PrintLib.h>
#include <Library/UefiBootServicesTableLib.h>

static EFI_PRINT_PROTOCOL  *gPrintProtocol = NULL;

UINTN
UnicodeVSPrint (
  OUT CHAR16        *StartOfBuffer,
  IN  UINTN         BufferSize,
  IN  const CHAR16  *FormatString,
  IN  VA_LIST       Marker
  )
/*++

Routine Description:

  VSPrint function to process format and place the results in Buffer. Since a
  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
  this is the main print working routine

Arguments:

  StartOfBuffer - Unicode buffer to print the results of the parsing of Format into.

  BufferSize    - Maximum number of characters to put into buffer. Zero means
                  no limit.

  FormatString  - Unicode format string see file header for more details.

  Marker        - Vararg list consumed by processing Format.

Returns:

  Number of characters printed.

--*/
{
  EFI_STATUS  Status;

  if (gPrintProtocol == NULL) {
    Status = gBS->LocateProtocol (
                    &gEfiPrintProtocolGuid,
                    NULL,
                    (VOID **)&gPrintProtocol
                    );
    if (EFI_ERROR (Status)) {
      gPrintProtocol = NULL;
    }
    if (gPrintProtocol == NULL) {
      return 0;
    }
  }
  return gPrintProtocol->VSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
}

UINTN
UnicodeSPrint (
  OUT CHAR16        *StartOfBuffer,
  IN  UINTN         BufferSize,
  IN  const CHAR16  *FormatString,
  ...
  )

{
  UINTN    Return;
  VA_LIST  Marker;

  VA_START (Marker, FormatString);
  Return = UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
  VA_END (Marker);
  return Return;
}

UINTN
AsciiVSPrint (
  OUT CHAR8         *StartOfBuffer,
  IN  UINTN         BufferSize,
  IN  const CHAR8   *FormatString,
  IN  VA_LIST       Marker
  )
/*++

Routine Description:

  VSPrint function to process format and place the results in Buffer. Since a
  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
  this is the main print working routine

Arguments:

  StartOfBuffer - Unicode buffer to print the results of the parsing of Format into.

  BufferSize    - Maximum number of characters to put into buffer. Zero means
                  no limit.

  FormatString  - Unicode format string see file header for more details.

  Marker        - Vararg list consumed by processing Format.

Returns:

  Number of characters printed.

--*/
{
  return 0;
}

UINTN
AsciiSPrint (
  OUT CHAR8        *StartOfBuffer,
  IN  UINTN        BufferSize,
  IN  const CHAR8  *FormatString,
  ...
  )

{
  UINTN    Return;
  VA_LIST  Marker;

  VA_START (Marker, FormatString);
  Return = AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
  VA_END (Marker);
  return Return;
}
