Make d_splitpath const

This commit is contained in:
Kp 2013-06-09 18:10:09 +00:00
parent 6d7b9fbb44
commit 9667abeaa7
6 changed files with 39 additions and 52 deletions

View file

@ -11,6 +11,11 @@ extern void d_strupr( char *s1 );
extern void d_strrev( char *s1 );
extern char *d_strdup(char *str);
struct splitpath_t
{
const char *drive_start, *drive_end, *path_start, *path_end, *base_start, *base_end, *ext_start;
};
// remove extension from filename, doesn't work with paths.
void removeext(const char *filename, char *out);
@ -19,7 +24,7 @@ extern void change_filename_extension( char *dest, const char *src, char *new_ex
// split an MS-DOS path into drive, directory path, filename without the extension (base) and extension.
// if it's just a filename with no directory specified, this function will get 'base' and 'ext'
extern void d_splitpath(char *name, char *drive, char *path, char *base, char *ext);
void d_splitpath(const char *name, struct splitpath_t *path);
// create a growing 2D array with a single growing buffer for the text
// this system is likely to cause less memory fragmentation than having one malloc'd buffer per string

View file

@ -173,55 +173,34 @@ void change_filename_extension( char *dest, const char *src, char *ext )
strcpy(p+1,ext);
}
void d_splitpath(char *name, char *drive, char *path, char *base, char *ext)
void d_splitpath(const char *name, struct splitpath_t *path)
{
char *s, *p;
const char *s, *p;
p = name;
s = strchr(p, ':');
if ( s != NULL ) {
if (drive) {
*s = '\0';
strcpy(drive, p);
*s = ':';
}
path->drive_start = p;
path->drive_end = s;
p = s+1;
if (!p)
return;
} else if (drive)
*drive = '\0';
} else
path->drive_start = path->drive_end = NULL;
s = strrchr(p, '\\');
if ( s != NULL) {
if (path) {
char c;
c = *(s+1);
*(s+1) = '\0';
strcpy(path, p);
*(s+1) = c;
}
path->path_start = p;
path->path_end = s + 1;
p = s+1;
if (!p)
return;
} else if (path)
*path = '\0';
} else
path->path_start = path->path_end = NULL;
s = strchr(p, '.');
if ( s != NULL) {
if (base) {
*s = '\0';
strcpy(base, p);
*s = '.';
}
path->base_start = p;
path->base_end = s;
p = s+1;
if (!p)
return;
} else if (base)
*base = '\0';
if (ext)
strcpy(ext, p);
} else
path->base_start = path->base_end = NULL;
path->ext_start = p;
}
// create a growing 2D array with a single growing buffer for the text

View file

@ -188,7 +188,11 @@ bitmap_index bm_load_sub(int skip, char * filename )
return bitmap_num;
}
d_splitpath( filename, NULL, NULL, fname, NULL );
struct splitpath_t path;
d_splitpath( filename, &path);
if (path.base_end - path.base_start >= sizeof(fname))
Error("File <%s> - bitmap error, filename too long", filename);
memcpy(fname,path.base_start,path.base_end - path.base_start);
bitmap_num=piggy_find_bitmap( fname );
if (bitmap_num.index) {
@ -224,7 +228,6 @@ void ab_load(int skip, char * filename, bitmap_index bmp[], int *nframes )
int i;
int iff_error; //reference parm to avoid warning message
ubyte newpal[768];
char fname[20];
char tempname[20];
if (skip) {
@ -235,10 +238,11 @@ void ab_load(int skip, char * filename, bitmap_index bmp[], int *nframes )
}
d_splitpath( filename, NULL, NULL, fname, NULL );
struct splitpath_t path;
d_splitpath( filename, &path);
for (i=0; i<MAX_BITMAPS_PER_BRUSH; i++ ) {
sprintf( tempname, "%s#%d", fname, i );
snprintf( tempname, sizeof(tempname), "%.*s#%d", (int)(path.base_end - path.base_start), path.base_start, i );
bi = piggy_find_bitmap( tempname );
if ( !bi.index )
break;
@ -261,7 +265,7 @@ void ab_load(int skip, char * filename, bitmap_index bmp[], int *nframes )
for (i=0;i< *nframes; i++) {
bitmap_index new_bmp;
sprintf( tempname, "%s#%d", fname, i );
snprintf( tempname, sizeof(tempname), "%.*s#%d", (int)(path.base_end - path.base_start), path.base_start, i );
if ( iff_has_transparency )
gr_remap_bitmap_good( bm[i], newpal, iff_transparent_color, SuperX );
else

View file

@ -62,8 +62,9 @@ int load_palette(char *name,int used_for_level,int no_change_screen)
if (used_for_level && d_stricmp(last_palette_loaded_pig,name) != 0) {
d_splitpath(name,NULL,NULL,pigname,NULL);
strcat(pigname,".pig");
struct splitpath_t path;
d_splitpath(name,&path);
snprintf(pigname, sizeof(pigname), "%.*s.pig", (int)(path.base_end - path.base_start), path.base_start);
//if not editor, load pig first so small install message can come
//up in old palette. If editor version, we must load the pig after
//the palette is loaded so we can remap new textures.

View file

@ -283,10 +283,10 @@ bitmap_index piggy_find_bitmap( char * name )
if (alias_list[i].alias_name[namelen] == 0 && d_strnicmp(name,alias_list[i].alias_name,namelen)==0) {
if (t) { //extra stuff for ABMs
static char temp[FILENAME_LEN];
d_splitpath(alias_list[i].file_name, NULL, NULL, temp, NULL );
struct splitpath_t path;
d_splitpath(alias_list[i].file_name, &path);
snprintf(temp, sizeof(temp), "%.*s%s\n", (int)(path.base_end - path.base_start), path.base_start, t);
name = temp;
strcat(name,"#");
strcat(name,t+1);
}
else
name=alias_list[i].file_name;

View file

@ -185,7 +185,6 @@ int med_load_situation(char * filename)
int med_save_situation(char * filename)
{
PHYSFS_file * SaveFile;
char mine_name[MAX_NAME_LENGTH];
SaveFile = PHYSFSX_openWriteBuffered( filename );
if (!SaveFile) {
@ -197,10 +196,9 @@ int med_save_situation(char * filename)
}
// Write mine name.
// strcpy(mine_name, filename);
d_splitpath(filename, NULL, NULL, mine_name, NULL);
set_extension(mine_name, "min");
PHYSFSX_printf(SaveFile, "%s\n", mine_name);
struct splitpath_t path;
d_splitpath(filename, &path);
PHYSFSX_printf(SaveFile, "%.*s.min\n", (int)(path.base_end - path.base_start), path.base_start);
// Write player position.
PHYSFSX_printf(SaveFile, "%x %x %x\n",(unsigned int) ConsoleObject->pos.x,(unsigned int) ConsoleObject->pos.y,(unsigned int) ConsoleObject->pos.z);