]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxePrintLibPrint2Protocol/PrintLib.c
MdePkg/BasePrintLib: Fix incomplete print output
[mirror_edk2.git] / MdeModulePkg / Library / DxePrintLibPrint2Protocol / PrintLib.c
index 9f702c4fefcea5ba83f7cfd34460c4a68c18a590..0e6178fc9c8fe23623e4634cc635b37b3798b01d 100644 (file)
@@ -130,7 +130,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
   //\r
   // Get the first character from the format string\r
   //\r
-  FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+  FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
   while (FormatCharacter != 0) {\r
     if (FormatCharacter == '%') {\r
@@ -148,7 +148,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
         //\r
         // Get the next character from the format string\r
         //\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
         switch (FormatCharacter) {\r
         case '.': \r
@@ -239,7 +239,7 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
     //\r
     // Get the next character from the format string\r
     //\r
-    FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+    FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
   }\r
   return TRUE;\r
 }\r
@@ -1596,7 +1596,7 @@ InternalPrintLibSPrintMarker (
   //\r
   // Get the first character from the format string\r
   //\r
-  FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+  FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
   //\r
   // Loop until the end of the format string is reached or the output buffer is full\r
@@ -1628,7 +1628,7 @@ InternalPrintLibSPrintMarker (
       //\r
       for (Done = FALSE; !Done; ) {\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         switch (FormatCharacter) {\r
         case '.': \r
           Flags |= PRECISION; \r
@@ -1681,7 +1681,7 @@ InternalPrintLibSPrintMarker (
           for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){\r
             Count = (Count * 10) + FormatCharacter - '0';\r
             Format += BytesPerFormatCharacter;\r
-            FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+            FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
           }\r
           Format -= BytesPerFormatCharacter;\r
           if ((Flags & PRECISION) == 0) {\r
@@ -1960,7 +1960,7 @@ InternalPrintLibSPrintMarker (
 \r
       case '\r':\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter == '\n') {\r
           //\r
           // Translate '\r\n' to '\r\n'\r
@@ -1981,7 +1981,7 @@ InternalPrintLibSPrintMarker (
         //\r
         ArgumentString = "\r\n";\r
         Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter != '\r') {\r
           Format   -= BytesPerFormatCharacter;\r
         }\r
@@ -2000,7 +2000,7 @@ InternalPrintLibSPrintMarker (
  \r
     case '\r':\r
       Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+      FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
       if (FormatCharacter == '\n') {\r
         //\r
         // Translate '\r\n' to '\r\n'\r
@@ -2021,7 +2021,7 @@ InternalPrintLibSPrintMarker (
       //\r
       ArgumentString = "\r\n";\r
       Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+      FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
       if (FormatCharacter != '\r') {\r
         Format   -= BytesPerFormatCharacter;\r
       }\r
@@ -2050,7 +2050,10 @@ InternalPrintLibSPrintMarker (
       // Compute the number of characters in ArgumentString and store it in Count\r
       // ArgumentString is either null-terminated, or it contains Precision characters\r
       //\r
-      for (Count = 0; Count < Precision || ((Flags & PRECISION) == 0); Count++) {\r
+      for (Count = 0;\r
+            ArgumentString[Count * BytesPerArgumentCharacter] != '\0' &&\r
+            (Count < Precision || ((Flags & PRECISION) == 0));\r
+            Count++) {\r
         ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;\r
         if (ArgumentCharacter == 0) {\r
           break;\r
@@ -2107,8 +2110,8 @@ InternalPrintLibSPrintMarker (
     //\r
     // Copy the string into the output buffer performing the required type conversions\r
     //\r
-    while (Index < Count) {\r
-      ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;\r
+    while (Index < Count && (*ArgumentString) != '\0') {\r
+      ArgumentCharacter = ((*ArgumentString & 0xff) | (((UINT8)*(ArgumentString + 1)) << 8)) & ArgumentMask;\r
 \r
       LengthToReturn += (1 * BytesPerOutputCharacter);\r
       if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
@@ -2149,7 +2152,7 @@ InternalPrintLibSPrintMarker (
     //\r
     // Get the next character from the format string\r
     //\r
-    FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+    FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
   }\r
 \r
   if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r