X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Ffilesystem%2Ffilename.cpp;h=1ab0c0d496dabf4c1503e3414b9fc5ebb871bda6;hb=537c01c4d0075f150f4bb6e479e476b0c57a8a2b;hp=ef148ea8152d72d85004b02435b19487ca1d9e26;hpb=3ea085ec301ed1399dfa1e9f3a240312dc95410b;p=feisty_meow.git diff --git a/nucleus/library/filesystem/filename.cpp b/nucleus/library/filesystem/filename.cpp index ef148ea8..1ab0c0d4 100644 --- a/nucleus/library/filesystem/filename.cpp +++ b/nucleus/library/filesystem/filename.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -30,6 +31,9 @@ #include #endif +#undef LOG +#define LOG(to_print) printf("%s::%s: %s\n", static_class_name(), func, astring(to_print).s()) + using namespace basis; using namespace structures; @@ -146,6 +150,7 @@ void filename::push(const astring &to_push) void filename::canonicalize() { + FUNCDEF("canonicalize"); // turn all the non-default separators into the default. bool found_sep = false; for (int j = 0; j < length(); j++) { @@ -176,6 +181,40 @@ void filename::canonicalize() } else saw_sep = false; } +#ifdef __WIN32__ + // on windows, we want to translate away from any cygwin or msys format into a more palatable + // version that the rest of windows understands. + // first, cygwin... + const astring CYGDRIVE_PATH = astring(astring(DEFAULT_SEPARATOR, 1) + "cygdrive" + + astring(DEFAULT_SEPARATOR, 1)); + // must be at least as long as the string we're looking for, plus a drive letter afterwards. + if ( (length() > CYGDRIVE_PATH.length() + 1) && begins(CYGDRIVE_PATH) ) { + zap(0, CYGDRIVE_PATH.length() - 1); // whack the cygdrive portion plus two slashes. + insert(1, ":"); // add a colon after the imputed drive letter. +LOG(astring("turned cygdrive string into: ") + *this); + } + // now we convert msys... + if ( (length() >= 2) && (get(0) == DEFAULT_SEPARATOR) + && textual::parser_bits::is_alpha(get(1)) ) { + // we seem reasonably sure now that this is a windows path hiding in msys format, but + // the next character needs to be a slash (if there is a next character) for it to be + // the windows drive form. otherwise it could be /tmp, which would obviously not be + // intended as a windows path. + if ( (length() == 2) || (get(2) == DEFAULT_SEPARATOR) ) { + // cool, this should be interpretable as an msys path, except for those wacky types + // of folks that might use a top-level single character directory name. we cannot + // help them, because we have made a design decision to support msys-style paths. + // note that this would only affect someone if they were referring to their directory on + // the current windows partition (c:, d:, etc.) without providing the drive letter, + // if they had that single character directory name (e.g., c:\x, d:\q, etc.) and even + // then only on the near defunct windows platform. + zap(0, 0); // take off initial slash. + insert(1, ":"); // add the obligatory colon. +LOG(astring("turned msys string into: ") + *this); + } + } +#endif + // we don't crop the last separator if the name's too small. for msdos // names, that would be chopping a slash off the c:\ style name. if (length() > 3) {