From 9667abeaa70f4a73ed78a7de9c1b3b95ee431222 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 9 Jun 2013 18:10:09 +0000 Subject: [PATCH] Make d_splitpath const --- common/include/strutil.h | 7 +++++- common/misc/strutil.c | 51 +++++++++++--------------------------- d2x-rebirth/main/bmread.c | 14 +++++++---- d2x-rebirth/main/gamepal.c | 5 ++-- d2x-rebirth/main/piggy.c | 6 ++--- similar/editor/kmine.c | 8 +++--- 6 files changed, 39 insertions(+), 52 deletions(-) diff --git a/common/include/strutil.h b/common/include/strutil.h index db2a35a84..5cab18abe 100644 --- a/common/include/strutil.h +++ b/common/include/strutil.h @@ -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 diff --git a/common/misc/strutil.c b/common/misc/strutil.c index 328983703..507e94a09 100644 --- a/common/misc/strutil.c +++ b/common/misc/strutil.c @@ -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 diff --git a/d2x-rebirth/main/bmread.c b/d2x-rebirth/main/bmread.c index 626f5dfa4..7440ce711 100644 --- a/d2x-rebirth/main/bmread.c +++ b/d2x-rebirth/main/bmread.c @@ -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; ipos.x,(unsigned int) ConsoleObject->pos.y,(unsigned int) ConsoleObject->pos.z);