Quick announcement: if you have a relative file path, and want to resolve it against another (absolute) path, GLib can do that now.
An example in C:
g_autofree gchar *path = NULL; g_autofree gchar *another_path = NULL; path = g_canonicalize_filename ("../../usr/bin", "/etc/foo"); another_path = g_canonicalize_filename ("../../usr/bin", NULL); g_print ("%s \n", path); /* Result: "/usr/bin" */ g_print ("%s \n", another_path); /* Passing NULL uses the current working dir */
No I/O is involved. It handles double and triple slashes nicely too.
This is bug 111848. The bug was fixed exactly 15 years and 1 day after initially reported.
We wish you farewell, bug 111848.
(Thanks Philip Withnall for reviewing, and Endless for sponsoring this work. This bug was fixed entirely in my work time.)