git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5472 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			350 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
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 %
 | 
						|
 | 
						|
 | 
						|
Copyright (c) 2004 - 2007, 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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "Setup.h"
 | 
						|
 | 
						|
/**
 | 
						|
  VSPrint worker function that prints a Value as a decimal number in Buffer.
 | 
						|
 | 
						|
  @param  Buffer     Location to place ascii decimal number string of Value.
 | 
						|
  @param  Flags      Flags to use in printing decimal string, see file header for
 | 
						|
                     details.
 | 
						|
  @param  Value      Decimal value to convert to a string in Buffer.
 | 
						|
 | 
						|
  @return Number of characters printed.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
ValueToString (
 | 
						|
  IN  OUT CHAR16  *Buffer,
 | 
						|
  IN  BOOLEAN     Flags,
 | 
						|
  IN  INT64       Value
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
 | 
						|
  protocol instance.
 | 
						|
 | 
						|
  @param Column          The position of the output string.
 | 
						|
  @param Row             The position of the output string.
 | 
						|
  @param Out             The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.
 | 
						|
  @param Fmt             The format string.
 | 
						|
  @param Args            The additional argument for the variables in the format string.
 | 
						|
 | 
						|
  @return Number of Unicode character printed.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintInternal (
 | 
						|
  IN UINTN                            Column,
 | 
						|
  IN UINTN                            Row,
 | 
						|
  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,
 | 
						|
  IN CHAR16                           *Fmt,
 | 
						|
  IN VA_LIST                          Args
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  *Buffer;
 | 
						|
  CHAR16  *BackupBuffer;
 | 
						|
  UINTN   Index;
 | 
						|
  UINTN   PreviousIndex;
 | 
						|
  UINTN   Count;
 | 
						|
 | 
						|
  //
 | 
						|
  // 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;
 | 
						|
  Count         = 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]);
 | 
						|
    Count += StrLen (&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]);
 | 
						|
  Count += StrLen (&BackupBuffer[PreviousIndex]);
 | 
						|
 | 
						|
  gBS->FreePool (Buffer);
 | 
						|
  gBS->FreePool (BackupBuffer);
 | 
						|
  return Count;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a formatted unicode string to the default console.
 | 
						|
 | 
						|
  @param  Fmt        Format string
 | 
						|
  @param  ...        Variable argument list for format string.
 | 
						|
 | 
						|
  @return Length of string printed to the console.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
ConsolePrint (
 | 
						|
  IN CHAR16   *Fmt,
 | 
						|
  IN ...
 | 
						|
  )
 | 
						|
{
 | 
						|
  VA_LIST Args;
 | 
						|
 | 
						|
  VA_START (Args, Fmt);
 | 
						|
  return PrintInternal ((UINTN) -1, (UINTN) -1, gST->ConOut, Fmt, Args);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a unicode string to the default console,
 | 
						|
  using L"%s" format.
 | 
						|
 | 
						|
  @param  String     String pointer.
 | 
						|
 | 
						|
  @return Length of string printed to the console
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintString (
 | 
						|
  IN CHAR16       *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  return ConsolePrint (L"%s", String);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a chracter to the default console,
 | 
						|
  using L"%c" format.
 | 
						|
 | 
						|
  @param  Character  Character to print.
 | 
						|
 | 
						|
  @return Length of string printed to the console.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintChar (
 | 
						|
  CHAR16       Character
 | 
						|
  )
 | 
						|
{
 | 
						|
  return ConsolePrint (L"%c", Character);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a formatted unicode string to the default console, at
 | 
						|
  the supplied cursor position.
 | 
						|
 | 
						|
  @param  Column     The cursor position to print the string at.
 | 
						|
  @param  Row        The cursor position to print the string at.
 | 
						|
  @param  Fmt        Format string.
 | 
						|
  @param  ...        Variable argument list for format string.
 | 
						|
 | 
						|
  @return Length of string printed to the console
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintAt (
 | 
						|
  IN UINTN     Column,
 | 
						|
  IN UINTN     Row,
 | 
						|
  IN CHAR16    *Fmt,
 | 
						|
  ...
 | 
						|
  )
 | 
						|
{
 | 
						|
  VA_LIST Args;
 | 
						|
 | 
						|
  VA_START (Args, Fmt);
 | 
						|
  return PrintInternal (Column, Row, gST->ConOut, Fmt, Args);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a unicode string to the default console, at
 | 
						|
  the supplied cursor position, using L"%s" format.
 | 
						|
 | 
						|
  @param  Column     The cursor position to print the string at.
 | 
						|
  @param  Row        The cursor position to print the string at
 | 
						|
  @param  String     String pointer.
 | 
						|
 | 
						|
  @return Length of string printed to the console
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintStringAt (
 | 
						|
  IN UINTN     Column,
 | 
						|
  IN UINTN     Row,
 | 
						|
  CHAR16       *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  return PrintAt (Column, Row, L"%s", String);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Prints a chracter to the default console, at
 | 
						|
  the supplied cursor position, using L"%c" format.
 | 
						|
 | 
						|
  @param  Column     The cursor position to print the string at.
 | 
						|
  @param  Row        The cursor position to print the string at.
 | 
						|
  @param  Character  Character to print.
 | 
						|
 | 
						|
  @return Length of string printed to the console.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
PrintCharAt (
 | 
						|
  IN UINTN     Column,
 | 
						|
  IN UINTN     Row,
 | 
						|
  CHAR16       Character
 | 
						|
  )
 | 
						|
{
 | 
						|
  return PrintAt (Column, Row, L"%c", Character);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  VSPrint worker function that prints a Value as a decimal number in Buffer.
 | 
						|
 | 
						|
  @param  Buffer     Location to place ascii decimal number string of Value.
 | 
						|
  @param  Flags      Flags to use in printing decimal string, see file header for
 | 
						|
                     details.
 | 
						|
  @param  Value      Decimal value to convert to a string in Buffer.
 | 
						|
 | 
						|
  @return Number of characters printed.
 | 
						|
 | 
						|
**/
 | 
						|
UINTN
 | 
						|
ValueToString (
 | 
						|
  IN  OUT CHAR16  *Buffer,
 | 
						|
  IN  BOOLEAN     Flags,
 | 
						|
  IN  INT64       Value
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  TempBuffer[30];
 | 
						|
  CHAR16  *TempStr;
 | 
						|
  CHAR16  *BufferPtr;
 | 
						|
  UINTN   Count;
 | 
						|
  UINTN   NumberCount;
 | 
						|
  UINT32  Remainder;
 | 
						|
  BOOLEAN Negative;
 | 
						|
 | 
						|
  Negative    = FALSE;
 | 
						|
  TempStr     = TempBuffer;
 | 
						|
  BufferPtr   = Buffer;
 | 
						|
  Count       = 0;
 | 
						|
  NumberCount = 0;
 | 
						|
 | 
						|
  if (Value < 0) {
 | 
						|
    Negative = TRUE;
 | 
						|
    Value    = -Value;
 | 
						|
  }
 | 
						|
 | 
						|
  do {
 | 
						|
    Value         = (INT64) DivU64x32Remainder  ((UINT64) Value, 10, &Remainder);
 | 
						|
    *(TempStr++)  = (CHAR16) (Remainder + '0');
 | 
						|
    Count++;
 | 
						|
    NumberCount++;
 | 
						|
    if ((Flags & COMMA_TYPE) == COMMA_TYPE) {
 | 
						|
      if (NumberCount % 3 == 0 && Value != 0) {
 | 
						|
        *(TempStr++) = ',';
 | 
						|
        Count++;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } while (Value != 0);
 | 
						|
 | 
						|
  if (Negative) {
 | 
						|
    *(BufferPtr++) = '-';
 | 
						|
    Count++;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Reverse temp string into Buffer.
 | 
						|
  //
 | 
						|
  while (TempStr != TempBuffer) {
 | 
						|
    *(BufferPtr++) = *(--TempStr);
 | 
						|
  }
 | 
						|
 | 
						|
  *BufferPtr = 0;
 | 
						|
  return Count;
 | 
						|
}
 |