]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiLib/Console.c
MdePkg: Apply uncrustify changes
[mirror_edk2.git] / MdePkg / Library / UefiLib / Console.c
index 41a9f3db97ee7eea6b4e8b6d4bee879a58499961..c37e3d0f58108fdeee5e4852fdf71d1e7fa11a3f 100644 (file)
@@ -1,37 +1,29 @@
 /** @file\r
   This module provide help function for displaying unicode string.\r
 \r
-  Copyright (c) 2006 - 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
+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-\r
-\r
-\r
 #include "UefiLibInternal.h"\r
 \r
 typedef struct {\r
-  CHAR16  WChar;\r
-  UINT32  Width;\r
+  CHAR16    WChar;\r
+  UINT32    Width;\r
 } UNICODE_WIDTH_ENTRY;\r
 \r
-#define NARROW_CHAR         0xFFF0\r
-#define WIDE_CHAR           0xFFF1\r
+#define NARROW_CHAR  0xFFF0\r
+#define WIDE_CHAR    0xFFF1\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY  mUnicodeWidthTable[] = {\r
   //\r
   // General script area\r
   //\r
-  {(CHAR16)0x1FFF,  1},\r
+  { (CHAR16)0x1FFF, 1 },\r
+\r
   /*\r
-   * Merge the blocks and replace them with the above entry as they fall to \r
+   * Merge the blocks and replace them with the above entry as they fall to\r
    * the same category and they are all narrow glyph. This will reduce search\r
    * time and table size. The merge will omit the reserved code.\r
    *\r
@@ -76,9 +68,10 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //\r
   // Symbol area\r
   //\r
-  {(CHAR16)0x2FFF,  1},\r
+  { (CHAR16)0x2FFF, 1 },\r
+\r
   /*\r
-   * Merge the blocks and replace them with the above entry as they fall to \r
+   * Merge the blocks and replace them with the above entry as they fall to\r
    * the same category and they are all narrow glyph. This will reduce search\r
    * time and table size. The merge will omit the reserved code.\r
    *\r
@@ -108,9 +101,10 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //\r
   // CJK phonetics and symbol area\r
   //\r
-  {(CHAR16)0x33FF,  2},\r
+  { (CHAR16)0x33FF, 2 },\r
+\r
   /*\r
-   * Merge the blocks and replace them with the above entry as they fall to \r
+   * Merge the blocks and replace them with the above entry as they fall to\r
    * the same category and they are all wide glyph. This will reduce search\r
    * time and table size. The merge will omit the reserved code.\r
    *\r
@@ -131,15 +125,16 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //\r
   // CJK ideograph area\r
   //\r
-  {(CHAR16)0x9FFF,  2},\r
+  { (CHAR16)0x9FFF, 2 },\r
+\r
   /*\r
-   * Merge the blocks and replace them with the above entry as they fall to \r
+   * Merge the blocks and replace them with the above entry as they fall to\r
    * the same category and they are all wide glyph. This will reduce search\r
    * time and table size. The merge will omit the reserved code.\r
    *\r
    * Remove the above item if below is un-commented.\r
    *\r
-  {(CHAR16)0x4DFF,  0},       // Reserved. 0x3400-0x4DBF as CJK unified ideographs \r
+  {(CHAR16)0x4DFF,  0},       // Reserved. 0x3400-0x4DBF as CJK unified ideographs\r
                       // extension A in ver3.0. 0x3400-0x4DFF\r
   {(CHAR16)0x9FFF,  2},       // CJK unified ideographs. 0x4E00-0x9FFF\r
   *\r
@@ -148,14 +143,15 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //\r
   // Reserved\r
   //\r
-  {(CHAR16)0xABFF,  0},       // Reserved. 0xA000-0xA490 as Yi syllables. 0xA490-0xA4D0\r
+  { (CHAR16)0xABFF, 0 },       // Reserved. 0xA000-0xA490 as Yi syllables. 0xA490-0xA4D0\r
   // as Yi radicals in ver3.0. 0xA000-0xABFF\r
   //\r
   // Hangul syllables\r
   //\r
-  {(CHAR16)0xD7FF,  2},\r
+  { (CHAR16)0xD7FF, 2 },\r
+\r
   /*\r
-   * Merge the blocks and replace them with the above entry as they fall to \r
+   * Merge the blocks and replace them with the above entry as they fall to\r
    * the same category and they are all wide glyph. This will reduce search\r
    * time and table size. The merge will omit the reserved code.\r
    *\r
@@ -169,26 +165,26 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
   //\r
   // Surrogates area\r
   //\r
-  {(CHAR16)0xDFFF,  0},       // Surrogates, not used now. 0xD800-0xDFFF\r
+  { (CHAR16)0xDFFF, 0 },       // Surrogates, not used now. 0xD800-0xDFFF\r
 \r
   //\r
   // Private use area\r
   //\r
-  {(CHAR16)0xF8FF,  0},       // Private use area. 0xE000-0xF8FF\r
+  { (CHAR16)0xF8FF, 0 },       // Private use area. 0xE000-0xF8FF\r
 \r
   //\r
   // Compatibility area and specials\r
   //\r
-  {(CHAR16)0xFAFF,  2},       // CJK compatibility ideographs. 0xF900-0xFAFF\r
-  {(CHAR16)0xFB4F,  1},       // Alphabetic presentation forms. 0xFB00-0xFB4F\r
-  {(CHAR16)0xFDFF,  1},       // Arabic presentation forms-A. 0xFB50-0xFDFF\r
-  {(CHAR16)0xFE1F,  0},       // Reserved. As variation selectors in ver3.0. 0xFE00-0xFE1F\r
-  {(CHAR16)0xFE2F,  1},       // Combining half marks. 0xFE20-0xFE2F\r
-  {(CHAR16)0xFE4F,  2},       // CJK compatibility forms. 0xFE30-0xFE4F\r
-  {(CHAR16)0xFE6F,  1},       // Small Form Variants. 0xFE50-0xFE6F\r
-  {(CHAR16)0xFEFF,  1},       // Arabic presentation forms-B. 0xFE70-0xFEFF\r
-  {(CHAR16)0xFFEF,  1},       // Half width and full width forms. 0xFF00-0xFFEF\r
-  {(CHAR16)0xFFFF,  0},       // Speicials. 0xFFF0-0xFFFF\r
+  { (CHAR16)0xFAFF, 2 },       // CJK compatibility ideographs. 0xF900-0xFAFF\r
+  { (CHAR16)0xFB4F, 1 },       // Alphabetic presentation forms. 0xFB00-0xFB4F\r
+  { (CHAR16)0xFDFF, 1 },       // Arabic presentation forms-A. 0xFB50-0xFDFF\r
+  { (CHAR16)0xFE1F, 0 },       // Reserved. As variation selectors in ver3.0. 0xFE00-0xFE1F\r
+  { (CHAR16)0xFE2F, 1 },       // Combining half marks. 0xFE20-0xFE2F\r
+  { (CHAR16)0xFE4F, 2 },       // CJK compatibility forms. 0xFE30-0xFE4F\r
+  { (CHAR16)0xFE6F, 1 },       // Small Form Variants. 0xFE50-0xFE6F\r
+  { (CHAR16)0xFEFF, 1 },       // Arabic presentation forms-B. 0xFE70-0xFEFF\r
+  { (CHAR16)0xFFEF, 1 },       // Half width and full width forms. 0xFF00-0xFFEF\r
+  { (CHAR16)0xFFFF, 0 },       // Speicials. 0xFFF0-0xFFFF\r
 };\r
 \r
 /**\r
@@ -210,14 +206,14 @@ GetGlyphWidth (
   IN CHAR16  UnicodeChar\r
   )\r
 {\r
-  UINTN                     Index;\r
-  UINTN                     Low;\r
-  UINTN                     High;\r
-  CONST UNICODE_WIDTH_ENTRY *Item;\r
-\r
-  Item  = NULL;\r
-  Low   = 0;\r
-  High  = (sizeof (mUnicodeWidthTable)) / (sizeof (UNICODE_WIDTH_ENTRY)) - 1;\r
+  UINTN                      Index;\r
+  UINTN                      Low;\r
+  UINTN                      High;\r
+  CONST UNICODE_WIDTH_ENTRY  *Item;\r
+\r
+  Item = NULL;\r
+  Low  = 0;\r
+  High = (sizeof (mUnicodeWidthTable)) / (sizeof (UNICODE_WIDTH_ENTRY)) - 1;\r
   while (Low <= High) {\r
     Index = (Low + High) >> 1;\r
     Item  = &(mUnicodeWidthTable[Index]);\r
@@ -251,18 +247,18 @@ GetGlyphWidth (
 /**\r
   Computes the display length of a Null-terminated Unicode String.\r
 \r
-  This function computes and returns the display length of the Null-terminated \r
-  Unicode string specified by String.  If String is NULL then 0 is returned. If \r
-  any of the widths of the Unicode characters in String can not be determined, \r
-  then 0 is returned. The display width of String can be computed by summing the \r
-  display widths of each Unicode character in String.  Unicode characters that \r
-  are narrow glyphs have a width of 1, and Unicode characters that are width glyphs \r
+  This function computes and returns the display length of the Null-terminated\r
+  Unicode string specified by String.  If String is NULL then 0 is returned. If\r
+  any of the widths of the Unicode characters in String can not be determined,\r
+  then 0 is returned. The display width of String can be computed by summing the\r
+  display widths of each Unicode character in String.  Unicode characters that\r
+  are narrow glyphs have a width of 1, and Unicode characters that are width glyphs\r
   have a width of 2.  If String is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  String      A pointer to a Null-terminated Unicode string.\r
 \r
   @return The display length of the Null-terminated Unicode string specified by String.\r
-  \r
+\r
 **/\r
 UINTN\r
 EFIAPI\r
@@ -270,8 +266,8 @@ UnicodeStringDisplayLength (
   IN CONST CHAR16  *String\r
   )\r
 {\r
-  UINTN      Length;\r
-  UINTN      Width;\r
+  UINTN  Length;\r
+  UINTN  Width;\r
 \r
   if (String == NULL) {\r
     return 0;\r
@@ -292,7 +288,7 @@ UnicodeStringDisplayLength (
 }\r
 \r
 /**\r
-  Count the storage space of a Unicode string. \r
+  Count the storage space of a Unicode string.\r
 \r
   This function handles the Unicode string with NARROW_CHAR\r
   and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
@@ -303,38 +299,39 @@ UnicodeStringDisplayLength (
   @param String          The input string to be counted.\r
   @param LimitLen        Whether need to limit the string length.\r
   @param MaxWidth        The max length this function supported.\r
-  @param Offset          The max index of the string can be show out. \r
+  @param Offset          The max index of the string can be show out.\r
 \r
   @return Storage space for the input string.\r
 \r
 **/\r
 UINTN\r
 UefiLibGetStringWidth (\r
-  IN  CHAR16               *String,\r
-  IN  BOOLEAN              LimitLen,\r
-  IN  UINTN                MaxWidth,\r
-  OUT UINTN                *Offset\r
+  IN  CHAR16   *String,\r
+  IN  BOOLEAN  LimitLen,\r
+  IN  UINTN    MaxWidth,\r
+  OUT UINTN    *Offset\r
   )\r
 {\r
-  UINTN Index;\r
-  UINTN Count;\r
-  UINTN IncrementValue;\r
+  UINTN  Index;\r
+  UINTN  Count;\r
+  UINTN  IncrementValue;\r
 \r
   if (String == NULL) {\r
     return 0;\r
   }\r
 \r
-  Index           = 0;\r
-  Count           = 0;\r
-  IncrementValue  = 1;\r
+  Index          = 0;\r
+  Count          = 0;\r
+  IncrementValue = 1;\r
 \r
   do {\r
     //\r
     // Advance to the null-terminator or to the first width directive\r
     //\r
-    for (;(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
-         Index++, Count = Count + IncrementValue) {\r
-      if (LimitLen && Count > MaxWidth) {\r
+    for ( ; (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0); Index++) {\r
+      Count = Count + IncrementValue;\r
+\r
+      if (LimitLen && (Count > MaxWidth)) {\r
         break;\r
       }\r
     }\r
@@ -346,8 +343,8 @@ UefiLibGetStringWidth (
       break;\r
     }\r
 \r
-    if (LimitLen && Count > MaxWidth) {\r
-      *Offset = Index - 1;\r
+    if (LimitLen && (Count > MaxWidth)) {\r
+      *Offset = Index;\r
       break;\r
     }\r
 \r
@@ -370,42 +367,36 @@ UefiLibGetStringWidth (
     }\r
   } while (String[Index] != 0);\r
 \r
-  //\r
-  // Increment by one to include the null-terminator in the size\r
-  //\r
-  if (!LimitLen) {\r
-    Count++;\r
-  }\r
-\r
   return Count * sizeof (CHAR16);\r
 }\r
 \r
 /**\r
-  Draws a dialog box to the console output device specified by \r
+  Draws a dialog box to the console output device specified by\r
   ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke\r
-  from the console input device specified by ConIn defined in the \r
+  from the console input device specified by ConIn defined in the\r
   EFI_SYSTEM_TABLE.\r
 \r
   If there are no strings in the variable argument list, then ASSERT().\r
   If all the strings in the variable argument list are empty, then ASSERT().\r
 \r
   @param[in]   Attribute  Specifies the foreground and background color of the popup.\r
-  @param[out]  Key        A pointer to the EFI_KEY value of the key that was \r
+  @param[out]  Key        A pointer to the EFI_KEY value of the key that was\r
                           pressed.  This is an optional parameter that may be NULL.\r
                           If it is NULL then no wait for a keypress will be performed.\r
   @param[in]  ...         The variable argument list that contains pointers to Null-\r
-                          terminated Unicode strings to display in the dialog box.  \r
+                          terminated Unicode strings to display in the dialog box.\r
                           The variable argument list is terminated by a NULL.\r
 \r
 **/\r
 VOID\r
 EFIAPI\r
 CreatePopUp (\r
-  IN  UINTN          Attribute,                \r
-  OUT EFI_INPUT_KEY  *Key,      OPTIONAL\r
+  IN  UINTN          Attribute,\r
+  OUT EFI_INPUT_KEY  *Key       OPTIONAL,\r
   ...\r
   )\r
 {\r
+  EFI_STATUS                       Status;\r
   VA_LIST                          Args;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
   EFI_SIMPLE_TEXT_OUTPUT_MODE      SavedConsoleMode;\r
@@ -419,18 +410,20 @@ CreatePopUp (
   UINTN                            Length;\r
   CHAR16                           *Line;\r
   UINTN                            EventIndex;\r
+  CHAR16                           *TmpString;\r
 \r
   //\r
-  // Determine the length of the longest line in the popup and the the total \r
+  // Determine the length of the longest line in the popup and the the total\r
   // number of lines in the popup\r
   //\r
   VA_START (Args, Key);\r
-  MaxLength = 0;\r
+  MaxLength     = 0;\r
   NumberOfLines = 0;\r
   while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {\r
     MaxLength = MAX (MaxLength, UefiLibGetStringWidth (String, FALSE, 0, NULL) / 2);\r
     NumberOfLines++;\r
   }\r
+\r
   VA_END (Args);\r
 \r
   //\r
@@ -447,7 +440,7 @@ CreatePopUp (
   // Cache a pointer to the Simple Text Output Protocol in the EFI System Table\r
   //\r
   ConOut = gST->ConOut;\r
-  \r
+\r
   //\r
   // Save the current console cursor position and attributes\r
   //\r
@@ -487,7 +480,7 @@ CreatePopUp (
   ASSERT (Line != NULL);\r
 \r
   //\r
-  // Draw top of popup box   \r
+  // Draw top of popup box\r
   //\r
   SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
   Line[0]             = BOXDRAW_DOWN_RIGHT;\r
@@ -519,13 +512,19 @@ CreatePopUp (
       // Length > MaxLength\r
       //\r
       UefiLibGetStringWidth (String, TRUE, MaxLength, &Length);\r
-      String[Length] = L'\0';\r
+      TmpString = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
+      ASSERT (TmpString != NULL);\r
+      StrnCpyS (TmpString, Length + 1, String, Length - 3);\r
+      StrCatS (TmpString, Length + 1, L"...");\r
 \r
       ConOut->SetCursorPosition (ConOut, Column + 1, Row++);\r
-      ConOut->OutputString (ConOut, String);\r
+      ConOut->OutputString (ConOut, TmpString);\r
+      FreePool (TmpString);\r
     }\r
+\r
     NumberOfLines--;\r
   }\r
+\r
   VA_END (Args);\r
 \r
   //\r
@@ -546,15 +545,28 @@ CreatePopUp (
   //\r
   // Restore the cursor visibility, position, and attributes\r
   //\r
-  ConOut->EnableCursor      (ConOut, SavedConsoleMode.CursorVisible);\r
+  ConOut->EnableCursor (ConOut, SavedConsoleMode.CursorVisible);\r
   ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);\r
-  ConOut->SetAttribute      (ConOut, SavedConsoleMode.Attribute);\r
+  ConOut->SetAttribute (ConOut, SavedConsoleMode.Attribute);\r
 \r
   //\r
   // Wait for a keystroke\r
   //\r
   if (Key != NULL) {\r
-    gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
-    gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
+    while (TRUE) {\r
+      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
+      if (!EFI_ERROR (Status)) {\r
+        break;\r
+      }\r
+\r
+      //\r
+      // If we encounter error, continue to read another key in.\r
+      //\r
+      if (Status != EFI_NOT_READY) {\r
+        continue;\r
+      }\r
+\r
+      gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
+    }\r
   }\r
 }\r