@@ -84,13 +84,14 @@ __CLOVE_EXTERN_C double __clove_math_decimald(unsigned char precision);
84
84
#define __CLOVE_PATH_SEPARATOR_STR "/"
85
85
#endif //_WIN32
86
86
87
- __CLOVE_EXTERN_C char * __clove_path_concat (const char separator , const char * path1 , const char * path2 );
87
+ __CLOVE_EXTERN_C char * __clove_path_concat (const char * path1 , const char * path2 , const char separator );
88
88
__CLOVE_EXTERN_C const char * __clove_path_relative (const char * abs_path , const char * base_path );
89
89
__CLOVE_EXTERN_C char * __clove_path_rel_to_abs_exec_path (const char * rel_path );
90
90
__CLOVE_EXTERN_C bool __clove_path_is_relative (const char * path );
91
91
__CLOVE_EXTERN_C bool __clove_path_is_absolute (const char * path );
92
92
__CLOVE_EXTERN_C void __clove_path_to_os (char * path );
93
93
__CLOVE_EXTERN_C char * __clove_path_basepath (const char * path );
94
+ __CLOVE_EXTERN_C bool __clove_path_exists (const char * path );
94
95
__CLOVE_EXTERN_C char * __clove_path_to_absolute (const char * path );
95
96
#pragma endregion // Path Decl
96
97
@@ -904,7 +905,13 @@ double __clove_math_decimald(unsigned char precision) {
904
905
#include <limits.h>
905
906
#include <sys/stat.h>
906
907
907
- char * __clove_path_concat (const char separator , const char * path1 , const char * path2 ) {
908
+ #ifdef _WIN32
909
+ #define __CLOVE_PATH_MAX_LEN _MAX_PATH
910
+ #else
911
+ #define __CLOVE_PATH_MAX_LEN PATH_MAX
912
+ #endif //_WIN32
913
+
914
+ char * __clove_path_concat (const char * path1 , const char * path2 , const char separator ) {
908
915
size_t count = __clove_string_length (path1 ) + 1 + __clove_string_length (path2 ) + 1 ;
909
916
char * path = __CLOVE_MEMORY_CALLOC_TYPE_N (char , count );
910
917
@@ -931,7 +938,7 @@ const char* __clove_path_relative(const char* abs_path, const char* base_path) {
931
938
932
939
char * __clove_path_rel_to_abs_exec_path (const char * rel_path ) {
933
940
const char * base_path = __clove_utils_get_exec_abs_basepath ();
934
- char * abs_path = __clove_path_concat (__CLOVE_PATH_SEPARATOR , base_path , rel_path );
941
+ char * abs_path = __clove_path_concat (base_path , rel_path , __CLOVE_PATH_SEPARATOR );
935
942
return abs_path ;
936
943
}
937
944
@@ -951,50 +958,41 @@ void __clove_path_to_os(char* path) {
951
958
__clove_string_replace_char (path , '\\' , __CLOVE_PATH_SEPARATOR );
952
959
}
953
960
954
- char * __clove_path_basepath (const char * a_path ) {
955
- bool last_char_is_win = __clove_string_endswith (a_path , "\\" );
956
- bool last_char_is_uni = __clove_string_endswith (a_path , "/" );
957
-
958
- //__CLOVE_UNUSED_VAR(last_char_is_win);
959
- //__CLOVE_UNUSED_VAR(last_char_is_uni);
960
-
961
-
962
- size_t source_len = __clove_string_length (a_path );
963
- size_t tmp_len = source_len + 1 ;
964
- char * tmp_path = __CLOVE_MEMORY_CALLOC_TYPE_N (char , tmp_len ); //take account for '\0'
965
-
966
- if (last_char_is_win || last_char_is_uni )
967
- {
968
- source_len -- ;
969
- }
961
+ char * __clove_path_basepath (const char * path ) {
962
+ char temp_path [__CLOVE_PATH_MAX_LEN ];
963
+ __clove_string_strcpy (temp_path , sizeof (temp_path ), path );
970
964
971
- __clove_string_strncpy (tmp_path , tmp_len , a_path , source_len );
965
+ //Remove last path separator character if any
966
+ bool last_char_is_win = __clove_string_endswith (path , "\\" );
967
+ bool last_char_is_uni = __clove_string_endswith (path , "/" );
968
+ if (last_char_is_win || last_char_is_uni ) {
969
+ size_t last_index = __clove_string_length (temp_path ) - 1 ;
970
+ temp_path [last_index ] = '\0' ;
971
+ }
972
972
973
-
974
973
// Find the last path separator character in the input path.
975
- int last_char_win = __clove_string_last_indexof (tmp_path , '\\' );
976
- int last_char_uni = __clove_string_last_indexof (tmp_path , '/' ); //or unix or win eventually
974
+ int last_char_win = __clove_string_last_indexof (temp_path , '\\' );
975
+ int last_char_uni = __clove_string_last_indexof (temp_path , '/' ); //or unix or win eventually
977
976
int last_char_index = last_char_win > last_char_uni ? last_char_win : last_char_uni ;
978
977
979
978
// If there are no separators in the path, return the current directory path.
980
979
char * result = NULL ;
981
- if (last_char_index <= 0 ) {
980
+ if (last_char_index < 0 ) {
982
981
static char dot_path [3 ] = { '.' , __CLOVE_PATH_SEPARATOR , '\0' };
983
982
result = __clove_string_strdup (dot_path );
984
983
} else {
985
984
// Calculate base path length based on the position of the last path separator.
986
985
size_t base_length = (size_t )(last_char_index + 1 );
987
- char * base_path = __CLOVE_MEMORY_CALLOC_TYPE_N (char , base_length );
988
- __clove_string_strncpy (base_path , base_length , tmp_path , base_length - 1 );
986
+ char * base_path = __CLOVE_MEMORY_MALLOC_TYPE_N (char , base_length );
987
+ __clove_string_strncpy (base_path , base_length , temp_path , base_length - 1 );
989
988
__clove_path_to_os (base_path );
990
989
result = base_path ;
991
990
}
992
991
993
- __clove_memory_free (tmp_path );
994
992
return result ;
995
993
}
996
994
997
- static bool __clove_path_exists (const char * path ) {
995
+ bool __clove_path_exists (const char * path ) {
998
996
struct stat buffer ;
999
997
return stat (path , & buffer ) == 0 ;
1000
998
}
0 commit comments