WIN32 versions of io functions
This commit is contained in:
parent
d924e0b827
commit
c48e881a54
90
src/io.c
90
src/io.c
@ -57,6 +57,7 @@
|
|||||||
#include "struct.h"
|
#include "struct.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "realpath.h"
|
#include "realpath.h"
|
||||||
|
#include "unicode.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
// Lit un octet
|
// Lit un octet
|
||||||
@ -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
|
// Détermine si un file passé en paramètre existe ou non dans le
|
||||||
// répertoire courant.
|
// répertoire courant.
|
||||||
{
|
{
|
||||||
|
#if defined(WIN32)
|
||||||
|
return (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(fname)) ? 0 : 1;
|
||||||
|
#else
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@ -297,14 +301,18 @@ int File_exists(char * fname)
|
|||||||
return(errno!=ENOENT);
|
return(errno!=ENOENT);
|
||||||
else
|
else
|
||||||
return 1;
|
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
|
// Détermine si un répertoire passé en paramètre existe ou non dans le
|
||||||
// répertoire courant.
|
// répertoire courant.
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER // TODO
|
#if defined(WIN32)
|
||||||
return 1;
|
DWORD attr = GetFileAttributesA(directory);
|
||||||
|
if (attr == INVALID_FILE_ATTRIBUTES)
|
||||||
|
return 0;
|
||||||
|
return (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
|
||||||
#else
|
#else
|
||||||
DIR* entry; // Structure de lecture des éléments
|
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 *))
|
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
|
#else
|
||||||
// Pour scan de répertoire
|
// Pour scan de répertoire
|
||||||
DIR* current_directory; //Répertoire courant
|
DIR* current_directory; //Répertoire courant
|
||||||
struct dirent* entry; // Structure de lecture des éléments
|
struct dirent* entry; // Structure de lecture des éléments
|
||||||
char full_filename[MAX_PATH_CHARACTERS];
|
|
||||||
int filename_position;
|
int filename_position;
|
||||||
strcpy(full_filename, directory_name);
|
strcpy(full_filename, directory_name);
|
||||||
current_directory=opendir(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,
|
/// 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)
|
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
|
#else
|
||||||
DIR* current_directory; // current directory
|
DIR* current_directory; // current directory
|
||||||
struct dirent* entry; // directory entry struct
|
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)
|
if (buf_unicode != NULL)
|
||||||
buf_unicode[0] = 0; // no unicode support
|
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;
|
return buf;
|
||||||
#else
|
#else
|
||||||
char * ret = getcwd(buf, size);
|
char * ret = getcwd(buf, size);
|
||||||
|
|||||||
4
src/io.h
4
src/io.h
@ -88,10 +88,10 @@ int File_length(const char *fname);
|
|||||||
int File_length_file(FILE * file);
|
int File_length_file(FILE * file);
|
||||||
|
|
||||||
/// Returns true if a file passed as a parameter exists in the current directory.
|
/// 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.
|
/// 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.
|
/// 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);
|
int File_is_hidden(const char *fname, const char *full_name);
|
||||||
|
|||||||
@ -131,6 +131,10 @@ void Display_syntax(void)
|
|||||||
void Warning_function(const char *message, const char *filename, int line_number, const char *function_name)
|
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);
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user