- UINTN LoopCount;\r
- CHAR16 Char1;\r
- CHAR16 Char2;\r
-\r
- ASSERT(Source != NULL);\r
- ASSERT(Target != NULL);\r
-\r
- for (LoopCount = 0 ; LoopCount < Count ; LoopCount++) {\r
- Char1 = InternalCharToUpper(Source[LoopCount]);\r
- Char2 = InternalCharToUpper(Target[LoopCount]);\r
- if (Char1 != Char2) {\r
- return (&Source[LoopCount]);\r
- }\r
+ CHAR16 *SourceCopy;\r
+ CHAR16 *TargetCopy;\r
+ UINTN SourceLength;\r
+ UINTN TargetLength;\r
+ INTN Result;\r
+\r
+ if (Count == 0) {\r
+ return 0;\r
+ }\r
+\r
+ SourceLength = StrLen (Source);\r
+ TargetLength = StrLen (Target);\r
+ SourceLength = MIN (SourceLength, Count);\r
+ TargetLength = MIN (TargetLength, Count);\r
+ SourceCopy = AllocateCopyPool ((SourceLength + 1) * sizeof (CHAR16), Source);\r
+ if (SourceCopy == NULL) {\r
+ return -1;\r
+ }\r
+ TargetCopy = AllocateCopyPool ((TargetLength + 1) * sizeof (CHAR16), Target);\r
+ if (TargetCopy == NULL) {\r
+ FreePool (SourceCopy);\r
+ return -1;\r