Home | History | Annotate | Download | only in PrintLite
      1 /*++
      2 
      3 Copyright (c) 2004 - 2007, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   Print.c
     15 
     16 Abstract:
     17 
     18   Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very
     19   simple implemenation of SPrint() and Print() to support debug.
     20 
     21   You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a
     22   time. This makes the implementation very simple.
     23 
     24   VSPrint, Print, SPrint format specification has the follwoing form
     25 
     26   %[flags][width]type
     27 
     28   flags:
     29     '-' - Left justify
     30     '+' - Prefix a sign
     31     ' ' - Prefix a blank
     32     ',' - Place commas in numberss
     33     '0' - Prefix for width with zeros
     34     'l' - UINT64
     35     'L' - UINT64
     36 
     37   width:
     38     '*' - Get width from a UINTN argumnet from the argument list
     39     Decimal number that represents width of print
     40 
     41   type:
     42     'X' - argument is a UINTN hex number, prefix '0'
     43     'x' - argument is a hex number
     44     'd' - argument is a decimal number
     45     'a' - argument is an ascii string
     46     'S','s' - argument is an Unicode string
     47     'g' - argument is a pointer to an EFI_GUID
     48     't' - argument is a pointer to an EFI_TIME structure
     49     'c' - argument is an ascii character
     50     'r' - argument is EFI_STATUS
     51     '%' - Print a %
     52 
     53 --*/
     54 
     55 #include "Tiano.h"
     56 #include "EfiDriverLib.h"
     57 #include "TianoCommon.h"
     58 #include "EfiCommonLib.h"
     59 #include "PrintWidth.h"
     60 #include "EfiPrintLib.h"
     61 #include "Print.h"
     62 
     63 UINTN
     64 SPrint (
     65   OUT CHAR_W        *Buffer,
     66   IN  UINTN         BufferSize,
     67   IN  CONST CHAR_W  *Format,
     68   ...
     69   )
     70 /*++
     71 
     72 Routine Description:
     73 
     74   SPrint function to process format and place the results in Buffer.
     75 
     76 Arguments:
     77 
     78   Buffer     - Wide char buffer to print the results of the parsing of Format into.
     79 
     80   BufferSize - Maximum number of characters to put into buffer. Zero means no
     81                limit.
     82 
     83   Format - Format string see file header for more details.
     84 
     85   ...    - Vararg list consumed by processing Format.
     86 
     87 Returns:
     88 
     89   Number of characters printed.
     90 
     91 --*/
     92 {
     93   UINTN   Return;
     94   VA_LIST Marker;
     95 
     96   VA_START (Marker, Format);
     97   Return = VSPrint (Buffer, BufferSize, Format, Marker);
     98   VA_END (Marker);
     99 
    100   return Return;
    101 }
    102 
    103 UINTN
    104 EFIAPI
    105 VSPrint (
    106   OUT CHAR_W        *StartOfBuffer,
    107   IN  UINTN         BufferSize,
    108   IN  CONST CHAR_W  *FormatString,
    109   IN  VA_LIST       Marker
    110   )
    111 /*++
    112 
    113 Routine Description:
    114 
    115   VSPrint function to process format and place the results in Buffer. Since a
    116   VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
    117   this is the main print working routine
    118 
    119 Arguments:
    120 
    121   StartOfBuffer - Unicode buffer to print the results of the parsing of Format into.
    122 
    123   BufferSize    - Maximum number of characters to put into buffer. Zero means
    124                   no limit.
    125 
    126   FormatString  - Unicode format string see file header for more details.
    127 
    128   Marker        - Vararg list consumed by processing Format.
    129 
    130 Returns:
    131 
    132   Number of characters printed.
    133 
    134 --*/
    135 {
    136   EFI_STATUS          Status;
    137   EFI_PRINT_PROTOCOL  *PrintProtocol;
    138 
    139   Status = gBS->LocateProtocol (
    140                   &gEfiPrintProtocolGuid,
    141                   NULL,
    142                   (VOID*)&PrintProtocol
    143                   );
    144   if (EFI_ERROR (Status)) {
    145     return 0;
    146   } else {
    147     return PrintProtocol->VSPrint (
    148                             StartOfBuffer,
    149                             BufferSize,
    150                             FormatString,
    151                             Marker
    152                             );
    153   }
    154 }
    155