760 {
761 if (relativeTo == null)
762 {
763 throw new ArgumentNullException("relativeTo");
764 }
765 if (PathInternal.IsEffectivelyEmpty(relativeTo.AsSpan()))
766 {
768 }
769 if (path == null)
770 {
771 throw new ArgumentNullException("path");
772 }
773 if (PathInternal.IsEffectivelyEmpty(path.AsSpan()))
774 {
776 }
779 if (!PathInternal.AreRootsEqual(relativeTo, path,
comparisonType))
780 {
781 return path;
782 }
784 if (num == 0)
785 {
786 return path;
787 }
788 int num2 = relativeTo.Length;
790 {
791 num2--;
792 }
794 int num3 = path.Length;
795 if (flag)
796 {
797 num3--;
798 }
799 if (num2 == num3 && num >= num2)
800 {
801 return ".";
802 }
803 Span<char> initialBuffer = stackalloc char[260];
805 valueStringBuilder.
EnsureCapacity(Math.Max(relativeTo.Length, path.Length));
806 if (num < num2)
807 {
808 valueStringBuilder.
Append(
"..");
809 for (
int i = num + 1;
i < num2;
i++)
810 {
811 if (PathInternal.IsDirectorySeparator(relativeTo[i]))
812 {
814 valueStringBuilder.
Append(
"..");
815 }
816 }
817 }
818 else if (PathInternal.IsDirectorySeparator(path[num]))
819 {
820 num++;
821 }
822 int num4 = num3 - num;
823 if (flag)
824 {
825 num4++;
826 }
827 if (num4 > 0)
828 {
829 if (valueStringBuilder.
Length > 0)
830 {
832 }
833 valueStringBuilder.
Append(path.AsSpan(num, num4));
834 }
835 return valueStringBuilder.
ToString();
836 }
static string GetFullPath(string path)
static readonly char DirectorySeparatorChar
static bool EndsInDirectorySeparator(ReadOnlySpan< char > path)
void EnsureCapacity(int capacity)
override string ToString()