diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index e551a3f358..d5bbce379d 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -276,6 +276,7 @@ typedef USHORT ERRCODE; extern HB_SYMB hb_symEval; /* Extend API */ +extern char HB_EXPORT * hb_filecase ( char * ); /* Convert string to environment case */ extern char HB_EXPORT * hb_parc( int iParam, ... ); /* retrieve a string parameter */ extern ULONG HB_EXPORT hb_parclen( int iParam, ... ); /* retrieve a string parameter length */ extern ULONG HB_EXPORT hb_parcsiz( int iParam, ... ); /* retrieve a by-reference string parameter length, including terminator */ diff --git a/harbour/include/hbset.h b/harbour/include/hbset.h index caa42636b0..d04d6df380 100644 --- a/harbour/include/hbset.h +++ b/harbour/include/hbset.h @@ -124,7 +124,10 @@ typedef enum /* Harbour SET extensions start at 100 */ HB_SET_LANGUAGE = 100, - HB_SET_IDLEREPEAT = 101 + HB_SET_IDLEREPEAT = 101, + HB_SET_FILECASE = 102, + HB_SET_DIRCASE = 103, + HB_SET_DIRSEPARATOR = 104 } HB_set_enum; @@ -182,6 +185,9 @@ typedef struct BOOL HB_SET_STRICTREAD; int HB_SET_TYPEAHEAD; BOOL HB_SET_UNIQUE; + char * HB_SET_FILECASE; + char * HB_SET_DIRCASE; + char * HB_SET_DIRSEPARATOR; int HB_SET_VIDEOMODE; BOOL HB_SET_WRAP; } HB_SET_STRUCT; diff --git a/harbour/include/set.ch b/harbour/include/set.ch index 9eacf3811a..06608f2458 100644 --- a/harbour/include/set.ch +++ b/harbour/include/set.ch @@ -116,6 +116,9 @@ #define _SET_LANGUAGE 100 /* Harbour extension */ #define _SET_IDLEREPEAT 101 /* Harbour extension */ +#define _SET_FILECASE 102 /* Harbour extension */ +#define _SET_DIRCASE 103 /* Harbour extension */ +#define _SET_DIRSEPARATOR 104 /* Harbour extension */ #define HB_SET_BASE 100 #define HB_SET_COUNT 2 diff --git a/harbour/source/pp/pptable.c b/harbour/source/pp/pptable.c index 9ceb3c0487..cec9a9338b 100644 --- a/harbour/source/pp/pptable.c +++ b/harbour/source/pp/pptable.c @@ -121,6 +121,9 @@ void hb_pp_Table( void ) static DEFINES sD___50 = {"_SET_AUTOSHARE",NULL,-1,"47", &sD___49 }; static DEFINES sD___51 = {"_SET_LANGUAGE",NULL,-1,"100", &sD___50 }; static DEFINES sD___52 = {"_SET_IDLEREPEAT",NULL,-1,"101", &sD___51 }; + static DEFINES sD___53 = {"_SET_FILECASE",NULL,-1,"102", &sD___52 }; + static DEFINES sD___54 = {"_SET_DIRCASE",NULL,-1,"103", &sD___53 }; + static DEFINES sD___55 = {"_SET_DIRSEPARATOR",NULL,-1,"104", &sD___54 }; static COMMANDS sC___1 = {0,"NOTE","\1A30",NULL,NULL }; static COMMANDS sC___2 = {0,"DO","WHILE \1A00","while \1A00",&sC___1 }; @@ -423,8 +426,14 @@ void hb_pp_Table( void ) static COMMANDS sC___242 = {0,"SET","OPTIMIZE (\1A00)","Set( _SET_OPTIMIZE, \1A00 )",&sC___241 }; static COMMANDS sC___243 = {0,"SET","AUTOPEN \1A20 ON,OFF,&>","Set(_SET_AUTOPEN,\1A30 )",&sC___242 }; static COMMANDS sC___244 = {0,"SET","AUTOPEN (\1A00)","Set(_SET_AUTOPEN,\1A00 )",&sC___243 }; + static COMMANDS sC___245 = {0,"SET","FILECASE \1A30","Set(_SET_FILECASE, \1A10 )",&sC___244 }; + static COMMANDS sC___246 = {0,"SET","FILECASE ( \1A00 )","Set(_SET_FILECASE, \1A00 )",&sC___245 }; + static COMMANDS sC___247 = {0,"SET","DIRCASE \1A30","Set(_SET_DIRCASE, \1A10 )",&sC___246 }; + static COMMANDS sC___248 = {0,"SET","DIRCASE ( \1A00 )","Set(_SET_DIRCASE, \1A00 )",&sC___247 }; + static COMMANDS sC___249 = {0,"SET","DIRSEPARATOR \1A30","Set(_SET_DIRSEPARATOR, \1A10 )",&sC___248 }; + static COMMANDS sC___250 = {0,"SET","DIRSEPARATOR ( \1A00 )","Set(_SET_DIRSEPARATOR, \1A00 )",&sC___249 }; - hb_pp_topDefine = &sD___52; - hb_pp_topCommand = &sC___244; + hb_pp_topDefine = &sD___55; + hb_pp_topCommand = &sC___250; hb_pp_topTranslate = NULL; } diff --git a/harbour/source/rtl/file.c b/harbour/source/rtl/file.c index 0ec80e3863..1a8407574a 100644 --- a/harbour/source/rtl/file.c +++ b/harbour/source/rtl/file.c @@ -58,13 +58,17 @@ BOOL hb_fsFile( BYTE * pFilename ) PHB_FFIND ffind; HB_TRACE(HB_TR_DEBUG, ("hb_fsFile(%s)", (char*) pFilename)); + + pFilename = hb_filecase(strdup(pFilename)); if( ( ffind = hb_fsFindFirst( ( char * ) pFilename, HB_FA_ALL ) ) != NULL ) { hb_fsFindClose( ffind ); + free(pFilename); return TRUE; } else + free(pFilename); return FALSE; } diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index a7c41338f8..7cbc7d30ff 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -96,6 +96,7 @@ #include "hbapi.h" #include "hbapifs.h" +#include "hbset.h" #include "hb_io.h" #if defined(OS_UNIX_COMPATIBLE) @@ -389,6 +390,38 @@ static void convert_create_flags_ex( USHORT uiAttr, USHORT uiFlags, int * result #endif +char *hb_filecase(char *str) { + // Convert file and dir case. The allowed SET options are: + // LOWER - Convert all caracters of file to lower + // UPPER - Convert all caracters of file to upper + // MIXED - Leave as is + + // The allowed environment options are: + // FILECASE - define the case of file + // DIRCASE - define the case of path + // DIRSEPARATOR - define separator of path (Ex. "/") + + int a; + char *filename; + char *dirname=str; + int dirlen; + + // Look for filename (Last "\" or DIRSEPARATOR) + if( hb_set.HB_SET_DIRSEPARATOR[0]!='\\') { + for(a=0;a 1 ) hb_set.HB_SET_IDLEREPEAT = set_logical( pArg2 ); break; + case HB_SET_FILECASE : + if( hb_set.HB_SET_FILECASE ) hb_retc( hb_set.HB_SET_FILECASE ); + else hb_retc( NULL ); + if( args > 1 ) hb_set.HB_SET_FILECASE = set_string( pArg2, hb_set.HB_SET_FILECASE ); + break; + case HB_SET_DIRCASE : + if( hb_set.HB_SET_DIRCASE ) hb_retc( hb_set.HB_SET_DIRCASE ); + else hb_retc( NULL ); + if( args > 1 ) hb_set.HB_SET_DIRCASE = set_string( pArg2, hb_set.HB_SET_DIRCASE ); + break; + case HB_SET_DIRSEPARATOR : + if( hb_set.HB_SET_DIRSEPARATOR ) hb_retc( hb_set.HB_SET_DIRSEPARATOR ); + else hb_retc( NULL ); + if( args > 1 ) hb_set.HB_SET_DIRSEPARATOR = set_string( pArg2, hb_set.HB_SET_DIRSEPARATOR ); + break; default : /* Return NIL if called with invalid SET specifier */ break; @@ -843,6 +858,12 @@ void hb_setInitialize( void ) hb_set.HB_SET_STRICTREAD = FALSE; hb_set.HB_SET_TYPEAHEAD = 50; hb_inkeyReset( TRUE ); /* Allocate keyboard typeahead buffer */ hb_set.HB_SET_UNIQUE = FALSE; + hb_set.HB_SET_FILECASE = ( char * ) hb_xgrab( 6 ); + memcpy( hb_set.HB_SET_FILECASE, "MIXED", 6 ); + hb_set.HB_SET_DIRCASE = ( char * ) hb_xgrab( 6 ); + memcpy( hb_set.HB_SET_DIRCASE, "MIXED", 6 ); + hb_set.HB_SET_DIRSEPARATOR = ( char * ) hb_xgrab( 2 ); + memcpy( hb_set.HB_SET_DIRSEPARATOR, "\\", 2 ); hb_set.HB_SET_VIDEOMODE = 0; hb_set.HB_SET_WRAP = FALSE; @@ -880,6 +901,9 @@ void hb_setRelease( void ) if( hb_set.HB_SET_MFILEEXT ) hb_xfree( hb_set.HB_SET_MFILEEXT ); if( hb_set.HB_SET_PATH ) hb_xfree( hb_set.HB_SET_PATH ); if( hb_set.HB_SET_PRINTFILE ) hb_xfree( hb_set.HB_SET_PRINTFILE ); + if( hb_set.HB_SET_FILECASE ) hb_xfree( hb_set.HB_SET_FILECASE ); + if( hb_set.HB_SET_DIRCASE ) hb_xfree( hb_set.HB_SET_FILECASE ); + if( hb_set.HB_SET_DIRSEPARATOR ) hb_xfree( hb_set.HB_SET_FILECASE ); hb_set.HB_SET_TYPEAHEAD = -1; hb_inkeyReset( TRUE ); /* Free keyboard typeahead buffer */