]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Print.c
Update the logic:
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Print.c
index 235ee45d2da78bab4acb0e14b8e23c89c49e9783..eeadf2494fb418bea03076e4452c08aa3e51b530 100644 (file)
-/** @file
-
-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.
-
-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 "Setup.h"
-
-UINTN
-ValueToString (
-  IN  OUT CHAR16  *Buffer,
-  IN  BOOLEAN     Flags,
-  IN  INT64       Value
-  );
-
-UINTN
-PrintInternal (
-  IN UINTN                            Column,
-  IN UINTN                            Row,
-  IN EFI_SIMPLE_TEXT_OUTPUT_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;
-}
-
-
-/**
-  Prints a formatted unicode string to the default console
-
-  @param  fmt        Format string
-
-  @return Length of string printed to the console
-
-**/
-UINTN
-ConsolePrint (
-  IN CHAR16   *fmt,
-  ...
-  )
-{
-  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 (
-  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  Row        The cursor position to print the string at
-  @param  fmt        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  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  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  Value      Decimal value to convert to a string in Buffer.
-  @param  Flags      Flags to use in printing decimal string, see file header for
-                     details.
-
-  @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;
-}
+/** @file\r
+Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very\r
+simple implemenation of SPrint() and Print() to support debug.\r
+\r
+You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a\r
+time. This makes the implementation very simple.\r
+\r
+VSPrint, Print, SPrint format specification has the follwoing form\r
+\r
+%type\r
+\r
+type:\r
+  'S','s' - argument is an Unicode string\r
+  'c' - argument is an ascii character\r
+  '%' - Print a %\r
+\r
+\r
+Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Setup.h"\r
+\r
+/**\r
+  The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL\r
+  protocol instance.\r
+\r
+  @param Column          The position of the output string.\r
+  @param Row             The position of the output string.\r
+  @param Out             The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.\r
+  @param Fmt             The format string.\r
+  @param Args            The additional argument for the variables in the format string.\r
+\r
+  @return Number of Unicode character printed.\r
+\r
+**/\r
+UINTN\r
+PrintInternal (\r
+  IN UINTN                            Column,\r
+  IN UINTN                            Row,\r
+  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,\r
+  IN CHAR16                           *Fmt,\r
+  IN VA_LIST                          Args\r
+  )\r
+{\r
+  CHAR16  *Buffer;\r
+  CHAR16  *BackupBuffer;\r
+  UINTN   Index;\r
+  UINTN   PreviousIndex;\r
+  UINTN   Count;\r
+\r
+  //\r
+  // For now, allocate an arbitrarily long buffer\r
+  //\r
+  Buffer        = AllocateZeroPool (0x10000);\r
+  BackupBuffer  = AllocateZeroPool (0x10000);\r
+  ASSERT (Buffer);\r
+  ASSERT (BackupBuffer);\r
+\r
+  if (Column != (UINTN) -1) {\r
+    Out->SetCursorPosition (Out, Column, Row);\r
+  }\r
+\r
+  UnicodeVSPrint (Buffer, 0x10000, Fmt, Args);\r
+\r
+  Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
+\r
+  Out->SetAttribute (Out, Out->Mode->Attribute);\r
+\r
+  Index         = 0;\r
+  PreviousIndex = 0;\r
+  Count         = 0;\r
+\r
+  do {\r
+    for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
+      BackupBuffer[Index] = Buffer[Index];\r
+    }\r
+\r
+    if (Buffer[Index] == 0) {\r
+      break;\r
+    }\r
+    //\r
+    // Null-terminate the temporary string\r
+    //\r
+    BackupBuffer[Index] = 0;\r
+\r
+    //\r
+    // Print this out, we are about to switch widths\r
+    //\r
+    Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
+    Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+\r
+    //\r
+    // Preserve the current index + 1, since this is where we will start printing from next\r
+    //\r
+    PreviousIndex = Index + 1;\r
+\r
+    //\r
+    // We are at a narrow or wide character directive.  Set attributes and strip it and print it\r
+    //\r
+    if (Buffer[Index] == NARROW_CHAR) {\r
+      //\r
+      // Preserve bits 0 - 6 and zero out the rest\r
+      //\r
+      Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
+      Out->SetAttribute (Out, Out->Mode->Attribute);\r
+    } else {\r
+      //\r
+      // Must be wide, set bit 7 ON\r
+      //\r
+      Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE;\r
+      Out->SetAttribute (Out, Out->Mode->Attribute);\r
+    }\r
+\r
+    Index++;\r
+\r
+  } while (Buffer[Index] != 0);\r
+\r
+  //\r
+  // We hit the end of the string - print it\r
+  //\r
+  Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
+  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+\r
+  FreePool (Buffer);\r
+  FreePool (BackupBuffer);\r
+  return Count;\r
+}\r
+\r
+\r
+/**\r
+  Prints a formatted unicode string to the default console.\r
+\r
+  @param  Fmt        Format string\r
+  @param  ...        Variable argument list for format string.\r
+\r
+  @return Length of string printed to the console.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+ConsolePrint (\r
+  IN CHAR16   *Fmt,\r
+  ...\r
+  )\r
+{\r
+  VA_LIST Args;\r
+  UINTN   LengthOfPrinted;\r
+\r
+  VA_START (Args, Fmt);\r
+  LengthOfPrinted = PrintInternal ((UINTN) -1, (UINTN) -1, gST->ConOut, Fmt, Args);\r
+  VA_END (Args);\r
+  return LengthOfPrinted;\r
+}\r
+\r
+\r
+/**\r
+  Prints a unicode string to the default console,\r
+  using L"%s" format.\r
+\r
+  @param  String     String pointer.\r
+\r
+  @return Length of string printed to the console\r
+\r
+**/\r
+UINTN\r
+PrintString (\r
+  IN CHAR16       *String\r
+  )\r
+{\r
+  return ConsolePrint (L"%s", String);\r
+}\r
+\r
+\r
+/**\r
+  Prints a chracter to the default console,\r
+  using L"%c" format.\r
+\r
+  @param  Character  Character to print.\r
+\r
+  @return Length of string printed to the console.\r
+\r
+**/\r
+UINTN\r
+PrintChar (\r
+  CHAR16       Character\r
+  )\r
+{\r
+  return ConsolePrint (L"%c", Character);\r
+}\r
+\r
+\r
+/**\r
+  Prints a formatted unicode string to the default console, at\r
+  the supplied cursor position.\r
+\r
+  @param  Column     The cursor position to print the string at.\r
+  @param  Row        The cursor position to print the string at.\r
+  @param  Fmt        Format string.\r
+  @param  ...        Variable argument list for format string.\r
+\r
+  @return Length of string printed to the console\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+PrintAt (\r
+  IN UINTN     Column,\r
+  IN UINTN     Row,\r
+  IN CHAR16    *Fmt,\r
+  ...\r
+  )\r
+{\r
+  VA_LIST Args;\r
+  UINTN   LengthOfPrinted;\r
+\r
+  VA_START (Args, Fmt);\r
+  LengthOfPrinted = PrintInternal (Column, Row, gST->ConOut, Fmt, Args);\r
+  VA_END (Args);\r
+  return LengthOfPrinted;\r
+}\r
+\r
+\r
+/**\r
+  Prints a unicode string to the default console, at\r
+  the supplied cursor position, using L"%s" format.\r
+\r
+  @param  Column     The cursor position to print the string at.\r
+  @param  Row        The cursor position to print the string at\r
+  @param  String     String pointer.\r
+\r
+  @return Length of string printed to the console\r
+\r
+**/\r
+UINTN\r
+PrintStringAt (\r
+  IN UINTN     Column,\r
+  IN UINTN     Row,\r
+  IN CHAR16    *String\r
+  )\r
+{\r
+  return PrintAt (Column, Row, L"%s", String);\r
+}\r
+\r
+\r
+/**\r
+  Prints a chracter to the default console, at\r
+  the supplied cursor position, using L"%c" format.\r
+\r
+  @param  Column     The cursor position to print the string at.\r
+  @param  Row        The cursor position to print the string at.\r
+  @param  Character  Character to print.\r
+\r
+  @return Length of string printed to the console.\r
+\r
+**/\r
+UINTN\r
+PrintCharAt (\r
+  IN UINTN     Column,\r
+  IN UINTN     Row,\r
+  CHAR16       Character\r
+  )\r
+{\r
+  return PrintAt (Column, Row, L"%c", Character);\r
+}\r