move some functions from filesel.c to fileseltools.c
This commit is contained in:
		
							parent
							
								
									47e1ee496e
								
							
						
					
					
						commit
						eb0effaf3f
					
				@ -804,7 +804,8 @@ endif
 | 
				
			|||||||
# This is the list of the objects we want to build. Dependancies are built by "make depend" automatically.
 | 
					# This is the list of the objects we want to build. Dependancies are built by "make depend" automatically.
 | 
				
			||||||
OBJS = main.o init.o graph.o $(APIOBJ) misc.o special.o \
 | 
					OBJS = main.o init.o graph.o $(APIOBJ) misc.o special.o \
 | 
				
			||||||
       buttons.o palette.o help.o operatio.o pages.o \
 | 
					       buttons.o palette.o help.o operatio.o pages.o \
 | 
				
			||||||
       readline.o engine.o filesel.o op_c.o readini.o saveini.o \
 | 
					       readline.o engine.o filesel.o fileseltools.o \
 | 
				
			||||||
 | 
					       op_c.o readini.o saveini.o \
 | 
				
			||||||
       shade.o keyboard.o io.o version.o text.o SFont.o setup.o \
 | 
					       shade.o keyboard.o io.o version.o text.o SFont.o setup.o \
 | 
				
			||||||
       pxsimple.o pxtall.o pxwide.o pxdouble.o pxtriple.o \
 | 
					       pxsimple.o pxtall.o pxwide.o pxdouble.o pxtriple.o \
 | 
				
			||||||
       pxtall2.o pxtall3.o pxwide2.o pxquad.o \
 | 
					       pxtall2.o pxtall3.o pxwide2.o pxquad.o \
 | 
				
			||||||
@ -827,7 +828,7 @@ TESTSOBJS = $(patsubst %.c,%.o,$(wildcard tests/*.c)) \
 | 
				
			|||||||
            pngformat.o motoformats.o stformats.o c64formats.o cpcformats.o \
 | 
					            pngformat.o motoformats.o stformats.o c64formats.o cpcformats.o \
 | 
				
			||||||
            ifformat.o msxformats.o giformat.o \
 | 
					            ifformat.o msxformats.o giformat.o \
 | 
				
			||||||
            op_c.o colorred.o \
 | 
					            op_c.o colorred.o \
 | 
				
			||||||
            unicode.o \
 | 
					            unicode.o fileseltools.o \
 | 
				
			||||||
            io.o realpath.o version.o pversion.o \
 | 
					            io.o realpath.o version.o pversion.o \
 | 
				
			||||||
            gfx2surface.o \
 | 
					            gfx2surface.o \
 | 
				
			||||||
            gfx2log.o gfx2mem.o
 | 
					            gfx2log.o gfx2mem.o
 | 
				
			||||||
 | 
				
			|||||||
@ -55,6 +55,7 @@
 | 
				
			|||||||
#include "engine.h"
 | 
					#include "engine.h"
 | 
				
			||||||
#include "readline.h"
 | 
					#include "readline.h"
 | 
				
			||||||
#include "filesel.h"
 | 
					#include "filesel.h"
 | 
				
			||||||
 | 
					#include "fileseltools.h"
 | 
				
			||||||
#include "loadsave.h"
 | 
					#include "loadsave.h"
 | 
				
			||||||
#include "init.h"
 | 
					#include "init.h"
 | 
				
			||||||
#include "buttons.h"
 | 
					#include "buttons.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,7 @@
 | 
				
			|||||||
#include "engine.h"
 | 
					#include "engine.h"
 | 
				
			||||||
#include "errors.h"
 | 
					#include "errors.h"
 | 
				
			||||||
#include "filesel.h" // Get_item_by_index
 | 
					#include "filesel.h" // Get_item_by_index
 | 
				
			||||||
 | 
					#include "fileseltools.h"
 | 
				
			||||||
#include "global.h"
 | 
					#include "global.h"
 | 
				
			||||||
#include "graph.h"
 | 
					#include "graph.h"
 | 
				
			||||||
#include "io.h"     // find_last_separator
 | 
					#include "io.h"     // find_last_separator
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										197
									
								
								src/filesel.c
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								src/filesel.c
									
									
									
									
									
								
							@ -70,6 +70,7 @@
 | 
				
			|||||||
#include "help.h"
 | 
					#include "help.h"
 | 
				
			||||||
#include "unicode.h"
 | 
					#include "unicode.h"
 | 
				
			||||||
#include "filesel.h"
 | 
					#include "filesel.h"
 | 
				
			||||||
 | 
					#include "fileseltools.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NORMAL_FILE_COLOR    MC_Light // color du texte pour une ligne de
 | 
					#define NORMAL_FILE_COLOR    MC_Light // color du texte pour une ligne de
 | 
				
			||||||
  // fichier non sélectionné
 | 
					  // fichier non sélectionné
 | 
				
			||||||
@ -223,202 +224,6 @@ void Free_fileselector_list(T_Fileselector *list)
 | 
				
			|||||||
  Recount_files(list);
 | 
					  Recount_files(list);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
word * Format_filename_unicode(const word * fname, word max_length, int type)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  static word result[40];
 | 
					 | 
				
			||||||
  int         c;
 | 
					 | 
				
			||||||
  int         other_cursor;
 | 
					 | 
				
			||||||
  int         pos_last_dot;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 // safety
 | 
					 | 
				
			||||||
  if (max_length>40)
 | 
					 | 
				
			||||||
    max_length=40;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Unicode_char_strcmp(fname,PARENT_DIR)==0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Unicode_char_strlcpy(result, "\x11 PARENT DIRECTORY", 40);
 | 
					 | 
				
			||||||
    // Append spaces
 | 
					 | 
				
			||||||
    for (c=18; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else if (fname[0]=='.' || type==1 || type==2)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Files ".something" or drives or directories: Aligned left on (max_length-1) chars max
 | 
					 | 
				
			||||||
    // Initialize as all spaces
 | 
					 | 
				
			||||||
    for (c=0; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (c=0;fname[c]!='\0' && c < max_length-1;c++)
 | 
					 | 
				
			||||||
      result[c]=fname[c];
 | 
					 | 
				
			||||||
    // A special character indicates the filename is truncated
 | 
					 | 
				
			||||||
    if (c >= max_length-1)
 | 
					 | 
				
			||||||
      result[max_length-2]=(byte)ELLIPSIS_CHARACTER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Initialize as all spaces
 | 
					 | 
				
			||||||
    for (c = 0; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    result[max_length-5]='.';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Look for the last dot in filename
 | 
					 | 
				
			||||||
    pos_last_dot = Position_last_dot_unicode(fname);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Copy the part before the dot
 | 
					 | 
				
			||||||
    for (c=0; c!=pos_last_dot && fname[c]!='\0'; c++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      if (c > max_length-6)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        result[max_length-6]=(byte)ELLIPSIS_CHARACTER;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      result[c]=fname[c];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Ensuite on recopie la partie qui suit le point (si nécessaire):
 | 
					 | 
				
			||||||
    if (pos_last_dot != -1)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
 | 
					 | 
				
			||||||
        result[other_cursor]=fname[c];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char * Format_filename(const char * fname, word max_length, int type)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  static char result[40];
 | 
					 | 
				
			||||||
  int         c;
 | 
					 | 
				
			||||||
  int         other_cursor;
 | 
					 | 
				
			||||||
  int         pos_last_dot;
 | 
					 | 
				
			||||||
#ifdef ENABLE_FILENAMES_ICONV
 | 
					 | 
				
			||||||
  /* convert file name from UTF8 to ANSI */
 | 
					 | 
				
			||||||
  char        * converted_fname = NULL;
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    char * input = (char *)fname;
 | 
					 | 
				
			||||||
    size_t inbytesleft = strlen(fname);
 | 
					 | 
				
			||||||
    char * output = converted_fname;
 | 
					 | 
				
			||||||
    size_t outbytesleft = inbytesleft;
 | 
					 | 
				
			||||||
    converted_fname = malloc(outbytesleft + 1);
 | 
					 | 
				
			||||||
    output = converted_fname;
 | 
					 | 
				
			||||||
    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      *output = '\0';
 | 
					 | 
				
			||||||
      fname = converted_fname;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif /* ENABLE_FILENAMES_ICONV */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // safety
 | 
					 | 
				
			||||||
  if (max_length>40)
 | 
					 | 
				
			||||||
    max_length=40;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  if (strcmp(fname,PARENT_DIR)==0)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    strcpy(result,"\x11 PARENT DIRECTORY");
 | 
					 | 
				
			||||||
    // Append spaces
 | 
					 | 
				
			||||||
    for (c=18; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else if (fname[0]=='.' || type==1 || type==2)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Files ".something" or drives or directories: Aligned left on (max_length-1) chars max
 | 
					 | 
				
			||||||
    // Initialize as all spaces
 | 
					 | 
				
			||||||
    for (c=0; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    for (c=0;fname[c]!='\0' && c < max_length-1;c++)
 | 
					 | 
				
			||||||
      result[c]=fname[c];
 | 
					 | 
				
			||||||
    // A special character indicates the filename is truncated
 | 
					 | 
				
			||||||
    if (c >= max_length-1)
 | 
					 | 
				
			||||||
      result[max_length-2]=ELLIPSIS_CHARACTER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Initialize as all spaces
 | 
					 | 
				
			||||||
    for (c = 0; c<max_length-1; c++)
 | 
					 | 
				
			||||||
      result[c]=' ';
 | 
					 | 
				
			||||||
    result[c]='\0';
 | 
					 | 
				
			||||||
       
 | 
					 | 
				
			||||||
    result[max_length-5]='.';
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    // Look for the last dot in filename
 | 
					 | 
				
			||||||
    pos_last_dot = Position_last_dot(fname);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Copy the part before the dot
 | 
					 | 
				
			||||||
    for (c=0; c!=pos_last_dot && fname[c]!='\0'; c++)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      if (c > max_length-6)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        result[max_length-6]=ELLIPSIS_CHARACTER;
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      result[c]=fname[c];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Ensuite on recopie la partie qui suit le point (si nécessaire):
 | 
					 | 
				
			||||||
    if (pos_last_dot != -1)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
 | 
					 | 
				
			||||||
        result[other_cursor]=fname[c];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#ifdef ENABLE_FILENAMES_ICONV
 | 
					 | 
				
			||||||
  free(converted_fname);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Add an item to the file selector linked list
 | 
					 | 
				
			||||||
 * @param list the linked list
 | 
					 | 
				
			||||||
 * @param full_name the file name
 | 
					 | 
				
			||||||
 * @param short_name the file name truncated to display in the file selector
 | 
					 | 
				
			||||||
 * @param type the type of the item : 0 = File, 1 = Directory, 2 = Drive
 | 
					 | 
				
			||||||
 * @param icon the icon for the item
 | 
					 | 
				
			||||||
 * @return a pointer to the newly added item
 | 
					 | 
				
			||||||
 * @return NULL in case of error
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, enum FSOBJECT_TYPE type, enum ICON_TYPES icon)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  // Working element
 | 
					 | 
				
			||||||
  T_Fileselector_item * temp_item;
 | 
					 | 
				
			||||||
  size_t full_name_len, short_name_len;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  full_name_len = strlen(full_name) + 1;
 | 
					 | 
				
			||||||
  short_name_len = strlen(short_name) + 1;
 | 
					 | 
				
			||||||
  // Allocate enough room for one struct + the visible label
 | 
					 | 
				
			||||||
  temp_item=(T_Fileselector_item *)malloc(sizeof(T_Fileselector_item)+full_name_len);
 | 
					 | 
				
			||||||
  if (temp_item == NULL)  // memory allocation error
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
  memset(temp_item, 0, sizeof(T_Fileselector_item));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (short_name_len > sizeof(temp_item->Short_name))
 | 
					 | 
				
			||||||
    short_name_len = sizeof(temp_item->Short_name) - 1; // without terminating 0
 | 
					 | 
				
			||||||
  // Initialize element
 | 
					 | 
				
			||||||
  memcpy(temp_item->Short_name,short_name,short_name_len);
 | 
					 | 
				
			||||||
  memcpy(temp_item->Full_name,full_name,full_name_len);
 | 
					 | 
				
			||||||
  temp_item->Type = type;
 | 
					 | 
				
			||||||
  temp_item->Icon = icon;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Doubly-linked
 | 
					 | 
				
			||||||
  temp_item->Next    =list->First;
 | 
					 | 
				
			||||||
  temp_item->Previous=NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (list->First!=NULL)
 | 
					 | 
				
			||||||
    list->First->Previous=temp_item;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  // Put new element at the beginning
 | 
					 | 
				
			||||||
  list->First=temp_item;
 | 
					 | 
				
			||||||
  return temp_item;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// Checks if a file has the requested file extension.
 | 
					/// Checks if a file has the requested file extension.
 | 
				
			||||||
 | 
				
			|||||||
@ -38,26 +38,6 @@
 | 
				
			|||||||
/// @return 1 if the user want to load/save a file
 | 
					/// @return 1 if the user want to load/save a file
 | 
				
			||||||
byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context *context);
 | 
					byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context *context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, enum FSOBJECT_TYPE type, enum ICON_TYPES icon);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Formats a display name for a file, directory, or similar name (drive, volume).
 | 
					 | 
				
			||||||
/// @param fname full file name from the file system
 | 
					 | 
				
			||||||
/// @param max_length numbers of characters to display
 | 
					 | 
				
			||||||
/// @param type 0 for file, 1 for directory, 2 for drive
 | 
					 | 
				
			||||||
/// @return a pointer to a single static buffer of maximum 40 characters
 | 
					 | 
				
			||||||
///         including the '\\0'.
 | 
					 | 
				
			||||||
char * Format_filename(const char * fname, word max_length, int type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Formats a display name for a file, directory, or similar name (drive, volume).
 | 
					 | 
				
			||||||
/// @param fname full file name from the file system
 | 
					 | 
				
			||||||
/// @param max_length numbers of characters to display
 | 
					 | 
				
			||||||
/// @param type 0 for file, 1 for directory, 2 for drive
 | 
					 | 
				
			||||||
/// @return a pointer to a single static buffer of maximum 40 wide characters
 | 
					 | 
				
			||||||
///         including the '\\0'.
 | 
					 | 
				
			||||||
word * Format_filename_unicode(const word * fname, word max_length, int type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Free_fileselector_list(T_Fileselector *list);
 | 
					void Free_fileselector_list(T_Fileselector *list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Sort_list_of_files(T_Fileselector *list);
 | 
					void Sort_list_of_files(T_Fileselector *list);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										232
									
								
								src/fileseltools.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								src/fileseltools.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,232 @@
 | 
				
			|||||||
 | 
					/* vim:expandtab:ts=2 sw=2:
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Copyright 2018-2020 Thomas Bernard
 | 
				
			||||||
 | 
					    Copyright 2014 Sergii Pylypenko
 | 
				
			||||||
 | 
					    Copyright 2011 Pawel Góralski
 | 
				
			||||||
 | 
					    Copyright 2009 Franck Charlet
 | 
				
			||||||
 | 
					    Copyright 2008 Peter Gordon
 | 
				
			||||||
 | 
					    Copyright 2008 Yves Rizoud
 | 
				
			||||||
 | 
					    Copyright 2007 Adrien Destugues
 | 
				
			||||||
 | 
					    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Grafx2 is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					    modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					    as published by the Free Software Foundation; version 2
 | 
				
			||||||
 | 
					    of the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Grafx2 is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with Grafx2; if not, see <http://www.gnu.org/licenses/>
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include "struct.h"
 | 
				
			||||||
 | 
					#include "global.h"
 | 
				
			||||||
 | 
					#include "unicode.h"
 | 
				
			||||||
 | 
					#include "io.h"
 | 
				
			||||||
 | 
					#include "fileseltools.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Add an item to the file selector linked list
 | 
				
			||||||
 | 
					 * @param list the linked list
 | 
				
			||||||
 | 
					 * @param full_name the file name
 | 
				
			||||||
 | 
					 * @param short_name the file name truncated to display in the file selector
 | 
				
			||||||
 | 
					 * @param type the type of the item : 0 = File, 1 = Directory, 2 = Drive
 | 
				
			||||||
 | 
					 * @param icon the icon for the item
 | 
				
			||||||
 | 
					 * @return a pointer to the newly added item
 | 
				
			||||||
 | 
					 * @return NULL in case of error
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, enum FSOBJECT_TYPE type, enum ICON_TYPES icon)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Working element
 | 
				
			||||||
 | 
					  T_Fileselector_item * temp_item;
 | 
				
			||||||
 | 
					  size_t full_name_len, short_name_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  full_name_len = strlen(full_name) + 1;
 | 
				
			||||||
 | 
					  short_name_len = strlen(short_name) + 1;
 | 
				
			||||||
 | 
					  // Allocate enough room for one struct + the visible label
 | 
				
			||||||
 | 
					  temp_item=(T_Fileselector_item *)malloc(sizeof(T_Fileselector_item)+full_name_len);
 | 
				
			||||||
 | 
					  if (temp_item == NULL)  // memory allocation error
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  memset(temp_item, 0, sizeof(T_Fileselector_item));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (short_name_len > sizeof(temp_item->Short_name))
 | 
				
			||||||
 | 
					    short_name_len = sizeof(temp_item->Short_name) - 1; // without terminating 0
 | 
				
			||||||
 | 
					  // Initialize element
 | 
				
			||||||
 | 
					  memcpy(temp_item->Short_name,short_name,short_name_len);
 | 
				
			||||||
 | 
					  memcpy(temp_item->Full_name,full_name,full_name_len);
 | 
				
			||||||
 | 
					  temp_item->Type = type;
 | 
				
			||||||
 | 
					  temp_item->Icon = icon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Doubly-linked
 | 
				
			||||||
 | 
					  temp_item->Next    =list->First;
 | 
				
			||||||
 | 
					  temp_item->Previous=NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (list->First!=NULL)
 | 
				
			||||||
 | 
					    list->First->Previous=temp_item;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  // Put new element at the beginning
 | 
				
			||||||
 | 
					  list->First=temp_item;
 | 
				
			||||||
 | 
					  return temp_item;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					word * Format_filename_unicode(const word * fname, word max_length, int type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  static word result[40];
 | 
				
			||||||
 | 
					  int         c;
 | 
				
			||||||
 | 
					  int         other_cursor;
 | 
				
			||||||
 | 
					  int         pos_last_dot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 // safety
 | 
				
			||||||
 | 
					  if (max_length>40)
 | 
				
			||||||
 | 
					    max_length=40;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Unicode_char_strcmp(fname,PARENT_DIR)==0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Unicode_char_strlcpy(result, "\x11 PARENT DIRECTORY", 40);
 | 
				
			||||||
 | 
					    // Append spaces
 | 
				
			||||||
 | 
					    for (c=18; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (fname[0]=='.' || type==1 || type==2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Files ".something" or drives or directories: Aligned left on (max_length-1) chars max
 | 
				
			||||||
 | 
					    // Initialize as all spaces
 | 
				
			||||||
 | 
					    for (c=0; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (c=0;fname[c]!='\0' && c < max_length-1;c++)
 | 
				
			||||||
 | 
					      result[c]=fname[c];
 | 
				
			||||||
 | 
					    // A special character indicates the filename is truncated
 | 
				
			||||||
 | 
					    if (c >= max_length-1)
 | 
				
			||||||
 | 
					      result[max_length-2]=(byte)ELLIPSIS_CHARACTER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Initialize as all spaces
 | 
				
			||||||
 | 
					    for (c = 0; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    result[max_length-5]='.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Look for the last dot in filename
 | 
				
			||||||
 | 
					    pos_last_dot = Position_last_dot_unicode(fname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Copy the part before the dot
 | 
				
			||||||
 | 
					    for (c=0; c!=pos_last_dot && fname[c]!='\0'; c++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (c > max_length-6)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        result[max_length-6]=(byte)ELLIPSIS_CHARACTER;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      result[c]=fname[c];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Ensuite on recopie la partie qui suit le point (si nécessaire):
 | 
				
			||||||
 | 
					    if (pos_last_dot != -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
 | 
				
			||||||
 | 
					        result[other_cursor]=fname[c];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char * Format_filename(const char * fname, word max_length, int type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  static char result[40];
 | 
				
			||||||
 | 
					  int         c;
 | 
				
			||||||
 | 
					  int         other_cursor;
 | 
				
			||||||
 | 
					  int         pos_last_dot;
 | 
				
			||||||
 | 
					#ifdef ENABLE_FILENAMES_ICONV
 | 
				
			||||||
 | 
					  /* convert file name from UTF8 to ANSI */
 | 
				
			||||||
 | 
					  char        * converted_fname = NULL;
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char * input = (char *)fname;
 | 
				
			||||||
 | 
					    size_t inbytesleft = strlen(fname);
 | 
				
			||||||
 | 
					    char * output = converted_fname;
 | 
				
			||||||
 | 
					    size_t outbytesleft = inbytesleft;
 | 
				
			||||||
 | 
					    converted_fname = malloc(outbytesleft + 1);
 | 
				
			||||||
 | 
					    output = converted_fname;
 | 
				
			||||||
 | 
					    if(cd != (iconv_t)-1 && (ssize_t)iconv(cd, &input, &inbytesleft, &output, &outbytesleft) >= 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      *output = '\0';
 | 
				
			||||||
 | 
					      fname = converted_fname;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif /* ENABLE_FILENAMES_ICONV */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // safety
 | 
				
			||||||
 | 
					  if (max_length>40)
 | 
				
			||||||
 | 
					    max_length=40;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  if (strcmp(fname,PARENT_DIR)==0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    strcpy(result,"\x11 PARENT DIRECTORY");
 | 
				
			||||||
 | 
					    // Append spaces
 | 
				
			||||||
 | 
					    for (c=18; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (fname[0]=='.' || type==1 || type==2)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Files ".something" or drives or directories: Aligned left on (max_length-1) chars max
 | 
				
			||||||
 | 
					    // Initialize as all spaces
 | 
				
			||||||
 | 
					    for (c=0; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (c=0;fname[c]!='\0' && c < max_length-1;c++)
 | 
				
			||||||
 | 
					      result[c]=fname[c];
 | 
				
			||||||
 | 
					    // A special character indicates the filename is truncated
 | 
				
			||||||
 | 
					    if (c >= max_length-1)
 | 
				
			||||||
 | 
					      result[max_length-2]=ELLIPSIS_CHARACTER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Initialize as all spaces
 | 
				
			||||||
 | 
					    for (c = 0; c<max_length-1; c++)
 | 
				
			||||||
 | 
					      result[c]=' ';
 | 
				
			||||||
 | 
					    result[c]='\0';
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					    result[max_length-5]='.';
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Look for the last dot in filename
 | 
				
			||||||
 | 
					    pos_last_dot = Position_last_dot(fname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Copy the part before the dot
 | 
				
			||||||
 | 
					    for (c=0; c!=pos_last_dot && fname[c]!='\0'; c++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (c > max_length-6)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        result[max_length-6]=ELLIPSIS_CHARACTER;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      result[c]=fname[c];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Ensuite on recopie la partie qui suit le point (si nécessaire):
 | 
				
			||||||
 | 
					    if (pos_last_dot != -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
 | 
				
			||||||
 | 
					        result[other_cursor]=fname[c];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#ifdef ENABLE_FILENAMES_ICONV
 | 
				
			||||||
 | 
					  free(converted_fname);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										50
									
								
								src/fileseltools.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/fileseltools.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					/* vim:expandtab:ts=2 sw=2:
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Copyright 2018-2020 Thomas Bernard
 | 
				
			||||||
 | 
					    Copyright 2007 Adrien Destugues
 | 
				
			||||||
 | 
					    Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Grafx2 is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					    modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					    as published by the Free Software Foundation; version 2
 | 
				
			||||||
 | 
					    of the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Grafx2 is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with Grafx2; if not, see <http://www.gnu.org/licenses/>
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					///@file fileseltools.h
 | 
				
			||||||
 | 
					/// Utility functions for the Fileselector window
 | 
				
			||||||
 | 
					//////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					#ifndef FILESELTOOLS_H_INCLUDED
 | 
				
			||||||
 | 
					#define FILESELTOOLS_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, enum FSOBJECT_TYPE type, enum ICON_TYPES icon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Formats a display name for a file, directory, or similar name (drive, volume).
 | 
				
			||||||
 | 
					/// @param fname full file name from the file system
 | 
				
			||||||
 | 
					/// @param max_length numbers of characters to display
 | 
				
			||||||
 | 
					/// @param type 0 for file, 1 for directory, 2 for drive
 | 
				
			||||||
 | 
					/// @return a pointer to a single static buffer of maximum 40 characters
 | 
				
			||||||
 | 
					///         including the '\\0'.
 | 
				
			||||||
 | 
					char * Format_filename(const char * fname, word max_length, int type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Formats a display name for a file, directory, or similar name (drive, volume).
 | 
				
			||||||
 | 
					/// @param fname full file name from the file system
 | 
				
			||||||
 | 
					/// @param max_length numbers of characters to display
 | 
				
			||||||
 | 
					/// @param type 0 for file, 1 for directory, 2 for drive
 | 
				
			||||||
 | 
					/// @return a pointer to a single static buffer of maximum 40 wide characters
 | 
				
			||||||
 | 
					///         including the '\\0'.
 | 
				
			||||||
 | 
					word * Format_filename_unicode(const word * fname, word max_length, int type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										2
									
								
								src/io.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								src/io.c
									
									
									
									
									
								
							@ -71,7 +71,7 @@
 | 
				
			|||||||
#include "gfx2log.h"
 | 
					#include "gfx2log.h"
 | 
				
			||||||
#include "gfx2mem.h"
 | 
					#include "gfx2mem.h"
 | 
				
			||||||
// for the network browse
 | 
					// for the network browse
 | 
				
			||||||
#include "filesel.h"
 | 
					#include "fileseltools.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Lit un octet
 | 
					// Lit un octet
 | 
				
			||||||
// Renvoie -1 si OK, 0 en cas d'erreur
 | 
					// Renvoie -1 si OK, 0 en cas d'erreur
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user