9 /* Read binary or text assets in full from file */
10 static void *cxr_asset_read_s( const char *path
, i64
*size
);
11 static void *cxr_asset_read( const char *path
);
12 static char *cxr_textasset_read_s( const char *path
, i64
*size
);
13 static char *cxr_textasset_read( const char *name
);
15 static i64
cxr_file_size( FILE *fileptr
);
18 /* Returns pointer to the extension in path */
19 static char *cxr_findext( char *path
, char const delim
);
20 static char *cxr_findsep( char *path
);
22 static char *cxr_stripext( char *path
);
23 static int cxr_path_is_abs( char const *path
);
24 static char *cxr_filename( char *path
);
26 /* Remove one level (nop if can't) eg: /home/harry/test.file -> /home/harry/ */
27 static void cxr_downlvl( char *path
);
30 #define CXR_FOLDER_CHAR '\\'
32 #define CXR_FOLDER_CHAR '/'
35 static i64
cxr_file_size( FILE *fileptr
)
37 fseek( fileptr
, 0, SEEK_END
);
38 i64 fsize
= ftell( fileptr
);
39 fseek( fileptr
, 0, SEEK_SET
);
44 static int cxr_file_exists( const char *path
)
47 if( (fp
=fopen( path
, "rb" )) )
56 static void *fs_disk_open_read( const char *path
, int reserve_end
, i64
*size
)
58 FILE *f
= fopen( path
, "rb" );
61 printf( "fs_open_read (%s)\n", path
);
63 i64 fsize
= cxr_file_size( f
);
64 void *buf
= malloc( fsize
+ reserve_end
);
68 if( fread( buf
, 1, fsize
, f
) != fsize
)
86 static char *fs_disk_load_text( const char *path
, i64
*size
)
91 if( (buf
= fs_disk_open_read( path
, 1, &fsize
)) )
102 static void *cxr_asset_read_s( const char *path
, i64
*size
)
104 return fs_disk_open_read( path
, 0, size
);
107 static void *cxr_asset_read( const char *path
)
110 return fs_disk_open_read( path
, 0, &size
);
113 static char *cxr_textasset_read_s( const char *path
, i64
*size
)
115 return fs_disk_load_text( path
, size
);
118 static char *cxr_textasset_read( const char *name
)
121 return fs_disk_load_text( name
, &size
);
124 static char *cxr_findext( char *path
, char const delim
)
144 static char *cxr_findsep( char *path
)
153 if( *c
== '/' || *c
== '\\' )
164 static char *cxr_stripext( char *path
)
166 char *point
, *start
, *ret
= NULL
;
168 /* Skip any folders */
169 if( !(start
= cxr_findsep( path
)) )
174 if( (point
= cxr_findext( start
, '.' )) )
186 static void cxr_downlvl( char *path
)
188 char *start_name
, *c
;
196 path
[ len
-1 ] = 0x00;
198 if( (start_name
= cxr_findsep( path
) ))
204 static char *cxr_filename( char *path
)
207 if( (base_name
= cxr_findsep( path
) ))
213 static int cxr_path_is_abs( char const *path
)
216 if( strlen( path
) < 2 ) return 0;
217 return path
[1] == ':';
219 if( strlen( path
) < 1 ) return 0;
220 return path
[0] == '/';
224 static void cxr_lowercase( char *str
)
230 if( val
>= (int)'A' && val
<= (int)'Z' )
232 val
= (int)'a' + (val
- (int)'A');
240 static void cxr_unixpath( char *path
)
252 static char *cxr_str_clone( char const *str
, int extra
)
257 char *newstr
= malloc(strlen(str
)+1+extra
);
258 strcpy( newstr
, str
);
263 #endif /* CXR_IO_H */