WIN32 versions of io functions
This commit is contained in:
		
							parent
							
								
									d924e0b827
								
							
						
					
					
						commit
						c48e881a54
					
				
							
								
								
									
										92
									
								
								src/io.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								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);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								src/io.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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);
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user