--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+public class Program
+{
+ static bool failure;
+
+ [DllImport ("__Internal")]
+ static extern string mono_path_canonicalize (string input);
+
+ static void CanonicalizeAssert (string input, string expected)
+ {
+ string actual = mono_path_canonicalize (input);
+ if (expected != actual) {
+ failure = true;
+ Console.WriteLine ("ERROR: Expected canonicalization of '{0}' to be '{1}', but it was '{2}'.", input, expected, actual);
+ } else {
+ Console.WriteLine ("SUCCESS: Canonicalization of '{0}' => '{1}'", input, actual);
+ }
+ }
+
+ static void CanonicalizeTest ()
+ {
+ bool isWindows = !(((int)Environment.OSVersion.Platform == 4) || ((int)Environment.OSVersion.Platform == 128));
+
+ if (!isWindows) {
+ CanonicalizeAssert ("", Environment.CurrentDirectory);
+ CanonicalizeAssert ("/", "/");
+ CanonicalizeAssert ("/..", "/");
+ CanonicalizeAssert ("/foo", "/foo");
+ CanonicalizeAssert ("/foo/././", "/foo");
+ CanonicalizeAssert ("/../../foo", "/foo");
+ CanonicalizeAssert ("/foo/", "/foo");
+ CanonicalizeAssert ("/foo/../../../", "/");
+ CanonicalizeAssert ("/foo/../../..", "/");
+ }
+ }
+
+ public static int Main()
+ {
+ CanonicalizeTest ();
+ return failure ? 1 : 0;
+ }
+}
\ No newline at end of file
/* For Native Client, the above is not true. Since there is no getcwd we fill */
/* in the file being passed in relative to '.' and don't resolve it */
+
+/* There are a couple of tests for this method in mono/test/mono-path.cs */
gchar *
mono_path_canonicalize (const char *path)
{
#endif
if (dest != lastpos) strcpy (dest, lastpos);
- return g_strreverse (abspath);
+
+ g_strreverse (abspath);
+
+ /* We strip away all trailing dir separators. This is not correct for the root directory,
+ * since we'll return an empty string, so re-append a dir separator if there is none in the
+ * result */
+ if (strchr (abspath, G_DIR_SEPARATOR) == NULL) {
+ int len = strlen (abspath);
+ abspath = g_realloc (abspath, len + 2);
+ abspath [len] = G_DIR_SEPARATOR;
+ abspath [len+1] = 0;
+ }
+
+ return abspath;
}
/*