EmbeddedPkg/SimpleTextInOutSerial: Update the cursor position
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 09:11:55 +0000 (09:11 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 09:11:55 +0000 (09:11 +0000)
It is a UEFI requirement to update the cursor position infomation for each
string displayed using calls to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL->OutputString().

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11728 6f19259b-4bc3-4df7-8a09-765794883524

EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOut.c

index 583721b..85bb08d 100644 (file)
@@ -517,14 +517,72 @@ OutputString (
   IN CHAR16                           *String\r
   )\r
 {\r
-  UINTN Size          = StrLen(String) + 1;\r
-  CHAR8 *OutputString = AllocatePool(Size);\r
+  UINTN                       Size;\r
+  CHAR8*                      OutputString;\r
+  EFI_STATUS                  Status;\r
+  EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
+  UINTN                       MaxColumn;\r
+  UINTN                       MaxRow;\r
   \r
+  Size = StrLen(String) + 1;\r
+  OutputString = AllocatePool(Size);\r
+\r
   //If there is any non-ascii characters in String buffer then replace it with '?'\r
   //Eventually, UnicodeStrToAsciiStr API should be fixed.\r
   SafeUnicodeStrToAsciiStr(String, OutputString);  \r
   SerialPortWrite ((UINT8 *)OutputString, Size - 1);\r
 \r
+  //\r
+  // Parse each character of the string to output\r
+  // to update the cursor position information\r
+  //\r
+  Mode = This->Mode;\r
+\r
+  Status = This->QueryMode (\r
+                   This,\r
+                   Mode->Mode,\r
+                   &MaxColumn,\r
+                   &MaxRow\r
+                   );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  for (; *String != CHAR_NULL; String++) {\r
+\r
+    switch (*String) {\r
+    case CHAR_BACKSPACE:\r
+      if (Mode->CursorColumn > 0) {\r
+        Mode->CursorColumn--;\r
+      }\r
+      break;\r
+\r
+    case CHAR_LINEFEED:\r
+      if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
+        Mode->CursorRow++;\r
+      }\r
+      break;\r
+\r
+    case CHAR_CARRIAGE_RETURN:\r
+      Mode->CursorColumn = 0;\r
+      break;\r
+\r
+    default:\r
+      if (Mode->CursorColumn >= (INT32) (MaxColumn - 1)) {\r
+        // Move the cursor as if we print CHAR_CARRIAGE_RETURN & CHAR_LINE_FEED\r
+        // CHAR_LINEFEED\r
+        if (Mode->CursorRow < (INT32) (MaxRow - 1)) {\r
+          Mode->CursorRow++;\r
+        }\r
+        // CHAR_CARIAGE_RETURN\r
+        Mode->CursorColumn = 0;\r
+      } else {\r
+        Mode->CursorColumn++;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+\r
   FreePool(OutputString);\r
 \r
   return EFI_SUCCESS;\r