diff --git a/filename.c b/filename.c index c4a054c..4faf1bf 100644 --- a/filename.c +++ b/filename.c @@ -31,6 +31,8 @@ #include "error.h" #include "build-post.h" +#ifndef WIN32 + /* * Canonicalize `path_name' (UNIX version). * Convert a path name to an absolute path. @@ -74,6 +76,104 @@ eb_canonicalize_path_name(char *path_name) return EB_SUCCESS; } +#else /* WIN32 */ + +/* + * Canonicalize `path_name' (DOS version). + * Convert a path name to an absolute path with drive letter unless + * that is an UNC path. + * + * Original version by KSK Jan/30/1998. + * Current version by Motoyuki Kasahara. + */ +EB_Error_Code +eb_canonicalize_path_name(char *path_name) +{ + char cwd[EB_MAX_PATH_LENGTH + 1]; + char temporary_path_name[EB_MAX_PATH_LENGTH + 1]; + char *slash; + char *last_backslash; + + /* + * Replace `/' with `\\'. + */ + slash = path_name; + for (;;) { + slash = strchr(slash, '/'); + if (slash == NULL) + break; + *slash++ = '\\'; + } + + if (*path_name == '\\' && *(path_name + 1) == '\\') { + /* + * `path_name' is UNC path. Nothing to be done. + */ + } else if (ASCII_ISALPHA(*path_name) && *(path_name + 1) == ':') { + /* + * `path_name' has a drive letter. + * Nothing to be done if it is an absolute path. + */ + if (*(path_name + 2) != '\\') { + /* + * `path_name' is a relative path. + * Covert the path name to an absolute path. + */ + if (getdcwd(ASCII_TOUPPER(*path_name) - 'A' + 1, cwd, + EB_MAX_PATH_LENGTH + 1) == NULL) { + return EB_ERR_FAIL_GETCWD; + } + if (EB_MAX_PATH_LENGTH < strlen(cwd) + 1 + strlen(path_name + 2)) + return EB_ERR_TOO_LONG_FILE_NAME; + sprintf(temporary_path_name, "%s\\%s", cwd, path_name + 2); + strcpy(path_name, temporary_path_name); + } + } else if (*path_name == '\\') { + /* + * `path_name' has no drive letter and is an absolute path. + * Add a drive letter to the path name. + */ + if (getcwd(cwd, EB_MAX_PATH_LENGTH + 1) == NULL) + return EB_ERR_FAIL_GETCWD; + cwd[1] = '\0'; + if (EB_MAX_PATH_LENGTH < strlen(cwd) + 1 + strlen(path_name)) + return EB_ERR_TOO_LONG_FILE_NAME; + sprintf(temporary_path_name, "%s:%s", cwd, path_name); + strcpy(path_name, temporary_path_name); + + } else { + /* + * `path_name' has no drive letter and is a relative path. + * Add a drive letter and convert it to an absolute path. + */ + if (getcwd(cwd, EB_MAX_PATH_LENGTH + 1) == NULL) + return EB_ERR_FAIL_GETCWD; + + if (EB_MAX_PATH_LENGTH < strlen(cwd) + 1 + strlen(path_name)) + return EB_ERR_TOO_LONG_FILE_NAME; + sprintf(temporary_path_name, "%s\\%s", cwd, path_name); + strcpy(path_name, temporary_path_name); + } + + + /* + * Now `path_name' is `X:\...' or `\\...'. + * Unless it is "X:\", eliminate `\' in the tail of the path name. + */ + last_backslash = strrchr(path_name, '\\'); + if (ASCII_ISALPHA(*path_name)) { + if (last_backslash != path_name + 2 && *(last_backslash + 1) == '\0') + *last_backslash = '\0'; + } else { + if (last_backslash != path_name + 1 && *(last_backslash + 1) == '\0') + *last_backslash = '\0'; + } + + return EB_SUCCESS; +} + +#endif /* WIN32 */ + /* * Canonicalize file name. @@ -175,7 +275,14 @@ eb_fix_path_name_suffix(char *path_name, const char *suffix) char *dot; char *semicolon; +#ifndef WIN32 base_name = strrchr(path_name, '/'); +#else + if (is_ebnet_url(path_name)) + base_name = strrchr(path_name, '/'); + else + base_name = strrchr(path_name, '\\'); +#endif if (base_name == NULL) base_name = path_name; else @@ -378,10 +485,19 @@ void eb_compose_path_name(const char *path_name, const char *file_name, char *composed_path_name) { +#ifndef WIN32 if (strcmp(path_name, "/") == 0) sprintf(composed_path_name, "%s%s", path_name, file_name); else sprintf(composed_path_name, "%s/%s", path_name, file_name); +#else + if (is_ebnet_url(path_name)) + sprintf(composed_path_name, "%s/%s", path_name, file_name); + else if (ASCII_ISALPHA(*path_name) && strcmp(path_name + 1, ":\\") == 0) + sprintf(composed_path_name, "%s%s", path_name, file_name); + else + sprintf(composed_path_name, "%s\\%s", path_name, file_name); +#endif } @@ -394,6 +510,7 @@ void eb_compose_path_name2(const char *path_name, const char *sub_directory_name, const char *file_name, char *composed_path_name) { +#ifndef WIN32 if (strcmp(path_name, "/") == 0) { sprintf(composed_path_name, "%s%s/%s", path_name, sub_directory_name, file_name); @@ -401,6 +518,19 @@ eb_compose_path_name2(const char *path_name, const char *sub_directory_name, sprintf(composed_path_name, "%s/%s/%s", path_name, sub_directory_name, file_name); } +#else + if (is_ebnet_url(path_name)) { + sprintf(composed_path_name, "%s/%s/%s", + path_name, sub_directory_name, file_name); + } else if (ASCII_ISALPHA(*path_name) + && strcmp(path_name + 1, ":\\") == 0) { + sprintf(composed_path_name, "%s%s\\%s", + path_name, sub_directory_name, file_name); + } else { + sprintf(composed_path_name, "%s\\%s\\%s", + path_name, sub_directory_name, file_name); + } +#endif } @@ -414,6 +544,7 @@ eb_compose_path_name3(const char *path_name, const char *sub_directory_name, const char *sub2_directory_name, const char *file_name, char *composed_path_name) { +#ifndef WIN32 if (strcmp(path_name, "/") == 0) { sprintf(composed_path_name, "%s%s/%s/%s", path_name, sub_directory_name, sub2_directory_name, file_name); @@ -421,6 +552,19 @@ eb_compose_path_name3(const char *path_name, const char *sub_directory_name, sprintf(composed_path_name, "%s/%s/%s/%s", path_name, sub_directory_name, sub2_directory_name, file_name); } +#else + if (is_ebnet_url(path_name)) { + sprintf(composed_path_name, "%s/%s/%s/%s", + path_name, sub_directory_name, sub2_directory_name, file_name); + } else if (ASCII_ISALPHA(*path_name) + && strcmp(path_name + 1, ":\\") == 0) { + sprintf(composed_path_name, "%s%s\\%s\\%s", + path_name, sub_directory_name, sub2_directory_name, file_name); + } else { + sprintf(composed_path_name, "%s\\%s\\%s\\%s", + path_name, sub_directory_name, sub2_directory_name, file_name); + } +#endif } @@ -590,7 +734,14 @@ eb_path_name_zio_code(const char *path_name, Zio_Code default_zio_code, const char *base_name; const char *dot; +#ifndef WIN32 base_name = strrchr(path_name, '/'); +#else + if (is_ebnet_url(path_name)) + base_name = strrchr(path_name, '/'); + else + base_name = strrchr(path_name, '\\'); +#endif if (base_name != NULL) base_name++; else