internal static string CleanPath (string s)
{
int l = s.Length;
int sub = 0;
int start = 0;
// Host prefix?
char s0 = s [0];
if (l > 2 && s0 == '\\' && s [1] == '\\'){
start = 2;
}
// We are only left with root
if (l == 1 && (s0 == DirectorySeparatorChar || s0 == AltDirectorySeparatorChar))
return s;
// Cleanup
for (int i = start; i < l; i++){
char c = s [i];
if (c != DirectorySeparatorChar && c != AltDirectorySeparatorChar)
continue;
if (i+1 == l)
sub++;
else {
c = s [i + 1];
if (c == DirectorySeparatorChar || c == AltDirectorySeparatorChar)
sub++;
}
}
if (sub == 0)
return s;
char [] copy = new char [l-sub];
if (start != 0){
copy [0] = '\\';
copy [1] = '\\';
}
for (int i = start, j = start; i < l && j < copy.Length; i++){
char c = s [i];
if (c != DirectorySeparatorChar && c != AltDirectorySeparatorChar){
copy [j++] = c;
continue;
}
// For non-trailing cases.
if (j+1 != copy.Length){
copy [j++] = DirectorySeparatorChar;
for (;i < l-1; i++){
c = s [i+1];
if (c != DirectorySeparatorChar && c != AltDirectorySeparatorChar)
break;
}
}
}
return new String (copy);
}