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