diff --git a/src/io.c b/src/io.c index 6d0cf2e6..5d637a13 100644 --- a/src/io.c +++ b/src/io.c @@ -57,6 +57,7 @@ #include "struct.h" #include "io.h" #include "realpath.h" +#include "unicode.h" #include "global.h" // Lit un octet @@ -225,7 +226,7 @@ void Append_path(char *path, const char *filename, char *reverse_path) long len; char * separator_pos; - // Remove trailing slash + // Remove trailing slash len=strlen(path); if (len && (!strcmp(path+len-1,PATH_SEPARATOR) #ifdef __WIN32__ @@ -285,10 +286,13 @@ void Append_path(char *path, const char *filename, char *reverse_path) } } -int File_exists(char * fname) +int File_exists(const char * fname) // Détermine si un file passé en paramètre existe ou non dans le // répertoire courant. { +#if defined(WIN32) + return (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(fname)) ? 0 : 1; +#else struct stat buf; int result; @@ -297,14 +301,18 @@ int File_exists(char * fname) return(errno!=ENOENT); else return 1; - +#endif } -int Directory_exists(char * directory) + +int Directory_exists(const char * directory) // Détermine si un répertoire passé en paramètre existe ou non dans le // répertoire courant. { -#ifdef _MSC_VER // TODO - return 1; +#if defined(WIN32) + DWORD attr = GetFileAttributesA(directory); + if (attr == INVALID_FILE_ATTRIBUTES) + return 0; + return (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; #else DIR* entry; // Structure de lecture des éléments @@ -370,12 +378,30 @@ int File_length_file(FILE * file) void For_each_file(const char * directory_name, void Callback(const char *, const char *)) { -#ifdef _MSC_VER + char full_filename[MAX_PATH_CHARACTERS]; +#if defined(WIN32) + WIN32_FIND_DATAA fd; + char search_string[MAX_PATH_CHARACTERS]; + HANDLE h; + + _snprintf(search_string, sizeof(search_string), "%s\\*", directory_name); + h = FindFirstFileA(search_string, &fd); + if (h != INVALID_HANDLE_VALUE) + { + do + { + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + _snprintf(full_filename, sizeof(full_filename), "%s\\%s", directory_name, fd.cFileName); + Callback(full_filename, fd.cFileName); + } + while (FindNextFileA(h, &fd)); + FindClose(h); + } #else // Pour scan de répertoire DIR* current_directory; //Répertoire courant struct dirent* entry; // Structure de lecture des éléments - char full_filename[MAX_PATH_CHARACTERS]; int filename_position; strcpy(full_filename, directory_name); current_directory=opendir(directory_name); @@ -407,7 +433,40 @@ void For_each_file(const char * directory_name, void Callback(const char *, cons /// Scans a directory, calls Callback for each file or directory in it, void For_each_directory_entry(const char * directory_name, void * pdata, T_File_dir_cb Callback) { -#ifdef _MSC_VER // TODO ! +#if defined(WIN32) + WIN32_FIND_DATAW fd; + word search_string[MAX_PATH_CHARACTERS]; + HANDLE h; + + Unicode_char_strlcpy(search_string, directory_name, MAX_PATH_CHARACTERS); + Unicode_char_strlcat(search_string, "\\*", MAX_PATH_CHARACTERS); + h = FindFirstFileW((WCHAR *)search_string, &fd); + if (h != INVALID_HANDLE_VALUE) + { + do + { + int i; + char short_filename[16]; + if (fd.cAlternateFileName[0] != 0) + for (i = 0; fd.cAlternateFileName[i] != 0 && i < sizeof(short_filename) - 1; i++) + short_filename[i] = (char)fd.cAlternateFileName[i]; + else // normal name is short ! + for (i = 0; fd.cFileName[i] != 0 && i < sizeof(short_filename) - 1; i++) + short_filename[i] = (char)fd.cFileName[i]; + short_filename[i] = '\0'; + Callback( + pdata, + short_filename, + (const word *)fd.cFileName, + (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 0 : 1, + (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0, + (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? 1 : 0 + ); + } + while (FindNextFileW(h, &fd)); + + FindClose(h); + } #else DIR* current_directory; // current directory struct dirent* entry; // directory entry struct @@ -573,6 +632,21 @@ const char * Get_current_directory(char * buf, word * buf_unicode, size_t size) if (buf_unicode != NULL) buf_unicode[0] = 0; // no unicode support + return buf; +#elif defined(WIN32) + if (GetCurrentDirectoryA(size, buf) == 0) + return NULL; + if (buf_unicode != NULL) + { + int i; + WCHAR temp[MAX_PATH_CHARACTERS]; + for (i = 0; i < MAX_PATH_CHARACTERS - 1 && buf[i] != '\0'; i++) + temp[i] = buf[i]; + temp[i] = 0; + buf_unicode[0] = 0; + GetLongPathNameW(temp, (WCHAR *)buf_unicode, size); + //GetCurrentDirectoryW(size, (WCHAR *)buf_unicode); + } return buf; #else char * ret = getcwd(buf, size); diff --git a/src/io.h b/src/io.h index d0780d5b..e9acd431 100644 --- a/src/io.h +++ b/src/io.h @@ -88,10 +88,10 @@ int File_length(const char *fname); int File_length_file(FILE * file); /// Returns true if a file passed as a parameter exists in the current directory. -int File_exists(char * fname); +int File_exists(const char * fname); /// Returns true if a directory passed as a parameter exists in the current directory. -int Directory_exists(char * directory); +int Directory_exists(const char * directory); /// Check if a file or directory is hidden. Full name (with directories) is optional. int File_is_hidden(const char *fname, const char *full_name); diff --git a/src/main.c b/src/main.c index f1c28d1e..3ebdc773 100644 --- a/src/main.c +++ b/src/main.c @@ -131,6 +131,10 @@ void Display_syntax(void) void Warning_function(const char *message, const char *filename, int line_number, const char *function_name) { printf("Warning in file %s, line %d, function %s : %s\n", filename, line_number, function_name, message); +#if defined(_MSC_VER) && defined(DEBUG) + OutputDebugStringA(message); + OutputDebugStringA("\n"); +#endif }