diff options
Diffstat (limited to 'EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Print.c')
-rw-r--r-- | EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Print.c | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Print.c b/EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Print.c new file mode 100644 index 0000000000..ec7bb1e174 --- /dev/null +++ b/EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Print.c @@ -0,0 +1,338 @@ +/*++
+
+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:
+
+ Print.c
+
+Abstract:
+
+ Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very
+ simple implemenation of SPrint() and Print() to support debug.
+
+ You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a
+ time. This makes the implementation very simple.
+
+ VSPrint, Print, SPrint format specification has the follwoing form
+
+ %type
+
+ type:
+ 'S','s' - argument is an Unicode string
+ 'c' - argument is an ascii character
+ '%' - Print a %
+
+--*/
+
+#include "print.h"
+
+STATIC
+UINTN
+_IPrint (
+ IN UINTN Column,
+ IN UINTN Row,
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Out,
+ IN CHAR16 *fmt,
+ IN VA_LIST args
+ )
+//
+// Display string worker for: Print, PrintAt, IPrint, IPrintAt
+//
+{
+ CHAR16 *Buffer;
+ CHAR16 *BackupBuffer;
+ UINTN Index;
+ UINTN PreviousIndex;
+
+ //
+ // For now, allocate an arbitrarily long buffer
+ //
+ Buffer = AllocateZeroPool (0x10000);
+ BackupBuffer = AllocateZeroPool (0x10000);
+ ASSERT (Buffer);
+ ASSERT (BackupBuffer);
+
+ if (Column != (UINTN) -1) {
+ Out->SetCursorPosition (Out, Column, Row);
+ }
+
+ UnicodeVSPrint (Buffer, 0x10000, fmt, args);
+
+ Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;
+
+ Out->SetAttribute (Out, Out->Mode->Attribute);
+
+ Index = 0;
+ PreviousIndex = 0;
+
+ do {
+ for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {
+ BackupBuffer[Index] = Buffer[Index];
+ }
+
+ if (Buffer[Index] == 0) {
+ break;
+ }
+ //
+ // Null-terminate the temporary string
+ //
+ BackupBuffer[Index] = 0;
+
+ //
+ // Print this out, we are about to switch widths
+ //
+ Out->OutputString (Out, &BackupBuffer[PreviousIndex]);
+
+ //
+ // Preserve the current index + 1, since this is where we will start printing from next
+ //
+ PreviousIndex = Index + 1;
+
+ //
+ // We are at a narrow or wide character directive. Set attributes and strip it and print it
+ //
+ if (Buffer[Index] == NARROW_CHAR) {
+ //
+ // Preserve bits 0 - 6 and zero out the rest
+ //
+ Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;
+ Out->SetAttribute (Out, Out->Mode->Attribute);
+ } else {
+ //
+ // Must be wide, set bit 7 ON
+ //
+ Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE;
+ Out->SetAttribute (Out, Out->Mode->Attribute);
+ }
+
+ Index++;
+
+ } while (Buffer[Index] != 0);
+
+ //
+ // We hit the end of the string - print it
+ //
+ Out->OutputString (Out, &BackupBuffer[PreviousIndex]);
+
+ gBS->FreePool (Buffer);
+ gBS->FreePool (BackupBuffer);
+ return EFI_SUCCESS;
+}
+
+UINTN
+Print (
+ IN CHAR16 *fmt,
+ ...
+ )
+/*++
+
+Routine Description:
+
+ Prints a formatted unicode string to the default console
+
+Arguments:
+
+ fmt - Format string
+
+Returns:
+
+ Length of string printed to the console
+
+--*/
+{
+ VA_LIST args;
+
+ VA_START (args, fmt);
+ return _IPrint ((UINTN) -1, (UINTN) -1, gST->ConOut, fmt, args);
+}
+
+UINTN
+PrintString (
+ CHAR16 *String
+ )
+/*++
+
+Routine Description:
+
+ Prints a unicode string to the default console,
+ using L"%s" format.
+
+Arguments:
+
+ String - String pointer.
+
+Returns:
+
+ Length of string printed to the console
+
+--*/
+{
+ return Print ((CHAR16 *) L"%s", String);
+}
+
+UINTN
+PrintChar (
+ CHAR16 Character
+ )
+/*++
+
+Routine Description:
+
+ Prints a chracter to the default console,
+ using L"%c" format.
+
+Arguments:
+
+ Character - Character to print.
+
+Returns:
+
+ Length of string printed to the console.
+
+--*/
+{
+ return Print ((CHAR16 *) L"%c", Character);
+}
+
+/*
+UINTN
+PrintToken (
+ IN EFI_HII_HANDLE Handle,
+ IN UINT16 Token,
+ IN CHAR16 *Language,
+ ...
+ )
+{
+ VA_LIST args;
+ UINTN NumberOfHiiHandles;
+ EFI_HANDLE *HandleBuffer;
+ EFI_HII_PROTOCOL *Hii;
+
+ //
+ // There should only be one HII image
+ //
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiHiiProtocolGuid,
+ NULL,
+ &NumberOfHiiHandles,
+ &HandleBuffer
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Retrieve the Hii protocol interface
+ //
+ Status = gBS->HandleProtocol (
+ HandleBuffer[0],
+ &gEfiHiiProtocolGuid,
+ &Hii
+ );
+
+ Hii->GetString (Hii, Handle, Token, FALSE, Language,
+
+ VA_START (args, fmt);
+ return _IPrint ((UINTN) -1, (UINTN) -1, gST->ConOut, fmt, args);
+}
+
+*/
+UINTN
+PrintAt (
+ IN UINTN Column,
+ IN UINTN Row,
+ IN CHAR16 *fmt,
+ ...
+ )
+/*++
+
+Routine Description:
+
+ Prints a formatted unicode string to the default console, at
+ the supplied cursor position
+
+Arguments:
+
+ Column, Row - The cursor position to print the string at
+
+ fmt - Format string
+
+Returns:
+
+ Length of string printed to the console
+
+--*/
+{
+ VA_LIST args;
+
+ VA_START (args, fmt);
+ return _IPrint (Column, Row, gST->ConOut, fmt, args);
+}
+
+UINTN
+PrintStringAt (
+ IN UINTN Column,
+ IN UINTN Row,
+ CHAR16 *String
+ )
+/*++
+
+Routine Description:
+
+ Prints a unicode string to the default console, at
+ the supplied cursor position, using L"%s" format.
+
+Arguments:
+
+ Column, Row - The cursor position to print the string at
+
+ String - String pointer.
+
+Returns:
+
+ Length of string printed to the console
+
+--*/
+{
+ return PrintAt (Column, Row, (CHAR16 *) L"%s", String);
+}
+
+UINTN
+PrintCharAt (
+ IN UINTN Column,
+ IN UINTN Row,
+ CHAR16 Character
+ )
+/*++
+
+Routine Description:
+
+ Prints a chracter to the default console, at
+ the supplied cursor position, using L"%c" format.
+
+Arguments:
+
+ Column, Row - The cursor position to print the string at
+
+ Character - Character to print.
+
+Returns:
+
+ Length of string printed to the console.
+
+--*/
+{
+ return PrintAt (Column, Row, (CHAR16 *) L"%c", Character);
+}
+
+
|