2. Added NULL pointer check before calling FreePool () to fix bugs when free memory. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2513 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			294 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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]);
 | |
| 
 | |
|   FreePool (Buffer);
 | |
|   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
 | |
| 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);
 | |
| }
 | |
| 
 | |
| 
 |