fixed instance loading forget to append basepath.. other path fixes (windows)
[csRadar.git] / csrIO.h
diff --git a/csrIO.h b/csrIO.h
index 76bed7e228fd138f0cc5652fad8ff3f4a30042c9..437a462fc5d580b463e03f194e0514dba8882786 100644 (file)
--- a/csrIO.h
+++ b/csrIO.h
@@ -14,21 +14,30 @@ i64 fs_file_size( FILE *fileptr );
 // Path handling
 // -------------
 
-// Find file path extension, returns NULL if no ext (0x00)
+// Find file path extension, returns NULL if no ext (0x00) example: /test/file.jpg returns pointer to: jpg
 char *csr_findext( char *path, char const delim );
+char *csr_findsep( char *path ); // Same as above but operates on \ and /
 
 // gets rid of extension on string only left with (folder)+filename
 void csr_stripext( char *path );
 
 int csr_path_is_abs( char const *path );
 
-// Convert windows paths to unix.. sortof ( \something\\blahblah .. ) -> /something/blahblah/
-// Does not handle drive letters, idea is to increase windows compatibility will the other functions above
-void csr_path_winunix( char *path );
+// Remove one level (nop if can't) eg: /home/harry/test.file -> /home/harry/
+void csr_downlvl( char *path );
+
+// Get only the file name example: /test/file.jpg returns file.jpg
+char *csr_filename( char *path );
 
 // Implementation
 //=======================================================================================================================
 
+#ifdef _WIN32
+ #define CSR_FOLDER_CHAR '\\'
+#else
+ #define CSR_FOLDER_CHAR '/'
+#endif
+
 #ifdef CSR_EXECUTABLE
 
 i64 fs_file_size( FILE *fileptr )
@@ -127,12 +136,33 @@ char *csr_findext( char *path, char const delim )
        return ptr;
 }
 
+// Find 'seperator'.. because folders can be / or \ on windows..
+char *csr_findsep( char *path )
+{
+       char *c, *ptr;
+
+       c = path;
+       ptr = NULL;
+       
+       while( *c )
+       {
+               if( *c == '/' || *c == '\\' )
+               {
+                       ptr = c + 1;
+               }
+       
+               c ++;
+       }
+
+       return ptr;
+}
+
 void csr_stripext( char *path )
 {
        char *point, *start;
        
        // Skip folders
-       if( !(start = csr_findext( path, '/' )) )
+       if( !(start = csr_findsep( path )) )
        {
                start = path;
        }
@@ -146,29 +176,31 @@ void csr_stripext( char *path )
        }
 }
 
-void csr_path_winunix( char *path )
+void csr_downlvl( char *path )
 {
-       char *idx, *wr;
-       wr = idx = path;
+       char *start_name, *c;
+
+       c = path;
+       while( *c )
+               c ++;
+       int len = c - path;
        
-       while( *idx )
-       {
-               if( *idx == '\\' )
-               {
-                       *idx = '/';
-               }
-               
-               if( idx > path )
-               {
-                       if( *(idx -1) == '/' && *idx == '/') idx ++;
-               }
-               
-               *( wr ++ ) = *idx;
-               
-               idx ++;
-       }
+       if( len )
+               path[ len -1 ] = 0x00;
        
-       *wr = 0x00;
+       if( (start_name = csr_findsep( path ) ))
+               *start_name = 0x00;
+       else
+               path[0] = 0x00;
+}
+
+char *csr_filename( char *path )
+{
+       char *base_name;
+       if( (base_name = csr_findsep( path ) ))
+               return base_name;
+               
+       return path;
 }
 
 int csr_path_is_abs( char const *path )