+ } \r
+ TempCopy = NULL;\r
+ TempCopy = StrnCatGrow(&TempCopy, NULL, StringGuid, 0);\r
+ Walker = TempCopy;\r
+ TempSpot = StrStr(Walker, L"-");\r
+ *TempSpot = CHAR_NULL;\r
+ Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
+ if (EFI_ERROR(Status)) {\r
+ FreePool(TempCopy);\r
+ return (Status);\r
+ }\r
+ Guid->Data1 = (UINT32)TempVal;\r
+ Walker += 9;\r
+ TempSpot = StrStr(Walker, L"-");\r
+ *TempSpot = CHAR_NULL;\r
+ Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
+ if (EFI_ERROR(Status)) {\r
+ FreePool(TempCopy);\r
+ return (Status);\r
+ }\r
+ Guid->Data2 = (UINT16)TempVal;\r
+ Walker += 5;\r
+ TempSpot = StrStr(Walker, L"-");\r
+ *TempSpot = CHAR_NULL;\r
+ Status = ShellConvertStringToUint64(Walker, &TempVal, TRUE, FALSE);\r
+ if (EFI_ERROR(Status)) {\r
+ FreePool(TempCopy);\r
+ return (Status);\r
+ }\r
+ Guid->Data3 = (UINT16)TempVal;\r
+ Walker += 5;\r
+ Guid->Data4[0] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[0] = (UINT8)(Guid->Data4[0]+ (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[1] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[1] = (UINT8)(Guid->Data4[1] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 3;\r
+ Guid->Data4[2] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[2] = (UINT8)(Guid->Data4[2] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[3] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[3] = (UINT8)(Guid->Data4[3] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[4] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[4] = (UINT8)(Guid->Data4[4] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[5] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[5] = (UINT8)(Guid->Data4[5] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[6] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[6] = (UINT8)(Guid->Data4[6] + (UINT8)HexCharToUintn(Walker[1]));\r
+ Walker += 2;\r
+ Guid->Data4[7] = (UINT8)(HexCharToUintn(Walker[0]) * 16);\r
+ Guid->Data4[7] = (UINT8)(Guid->Data4[7] + (UINT8)HexCharToUintn(Walker[1]));\r
+ FreePool(TempCopy);\r
+ return (EFI_SUCCESS);\r
+}\r
+\r
+CHAR16 TempBufferCatSPrint[1000];\r
+/** \r
+ Appends a formatted Unicode string to a Null-terminated Unicode string\r
+ \r
+ This function appends a formatted Unicode string to the Null-terminated \r
+ Unicode string specified by String. String is optional and may be NULL.\r
+ Storage for the formatted Unicode string returned is allocated using \r
+ AllocateZeroPool(). The pointer to the appended string is returned. The caller\r
+ is responsible for freeing the returned string.\r
+ \r
+ If String is not NULL and not aligned on a 16-bit boundary, then ASSERT().\r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+ \r
+ @param String A null-terminated Unicode string.\r
+ @param FormatString A null-terminated Unicode format string.\r
+ @param ... The variable argument list whose contents are accessed based \r
+ on the format string specified by Format.\r
+\r
+ @retval NULL There was not enough available memory.\r
+ @return Null terminated Unicode string is that is the formatted \r
+ string appended to String.\r
+ @sa CatVSPrint\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+CatSPrint (\r
+ IN CONST CHAR16 *String OPTIONAL,\r
+ IN CONST CHAR16 *FormatString,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ UINTN StringLength;\r
+ if (String != NULL) {\r
+ StrCpy(TempBufferCatSPrint, String);\r
+ } else {\r
+ *TempBufferCatSPrint = CHAR_NULL;\r
+ }\r
+ VA_START (Marker, FormatString);\r
+ StringLength = StrLen(TempBufferCatSPrint);\r
+\r
+ UnicodeVSPrint(TempBufferCatSPrint+StrLen(TempBufferCatSPrint), 1000-StringLength, FormatString, Marker);\r
+ return (AllocateCopyPool(StrSize(TempBufferCatSPrint), TempBufferCatSPrint));\r
+}\r
+\r
+/**\r
+ Clear the line at the specified Row.\r
+ \r
+ @param[in] Row The row number to be cleared ( start from 1 )\r
+ @param[in] LastCol The last printable column.\r
+ @param[in] LastRow The last printable row.\r
+**/\r
+VOID\r
+EFIAPI\r
+EditorClearLine (\r
+ IN UINTN Row,\r
+ IN UINTN LastCol,\r
+ IN UINTN LastRow\r
+ )\r
+{\r
+ CHAR16 Line[200];\r
+\r
+ if (Row == 0) {\r
+ Row = 1;\r
+ }\r
+\r
+ //\r
+ // prepare a blank line\r
+ //\r
+ SetMem16(Line, LastCol*sizeof(CHAR16), L' ');\r
+\r
+ if (Row == LastRow) {\r
+ //\r
+ // if CHAR_NULL is still at position 80, it will cause first line error\r
+ //\r
+ Line[LastCol - 1] = CHAR_NULL;\r