Rewrite set_file() to be smaller and better readable, and a comment describing what it does.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27567 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thomas Martitz 2010-07-25 22:45:57 +00:00
parent 6325ef978b
commit a3e6a865df
2 changed files with 19 additions and 16 deletions

View file

@ -1188,33 +1188,36 @@ bool set_option(const char* string, const void* variable, enum optiontype type,
return true; return true;
} }
/*
void set_file(const char* filename, char* setting, int maxlen) * Takes filename, removes the directory (assumed to be ROCKBOX_DIR) its in
* and the extension, and then copies the basename into setting
**/
void set_file(const char* filename, char* setting, const int maxlen)
{ {
const char* fptr = strrchr(filename,'/'); const char* fptr = strrchr(filename,'/');
const char* extptr;
int len; int len;
int extlen = 0; int extlen = 0;
const char* ptr;
if (!fptr) if (!fptr)
return; return;
fptr++; fptr++;
len = strlen(fptr); extptr = strrchr(fptr, '.');
ptr = fptr + len;
while ((*ptr != '.') && (ptr != fptr)) {
extlen++;
ptr--;
}
if(ptr == fptr) extlen = 0;
if (strncasecmp(ROCKBOX_DIR, filename, strlen(ROCKBOX_DIR)) || if (!extptr || extptr < fptr)
(len-extlen > maxlen)) extlen = 0;
else
extlen = strlen(extptr);
len = strlen(fptr) - extlen;
/* error if filename isn't in ROCKBOX_DIR */
if (strncasecmp(ROCKBOX_DIR, filename, ROCKBOX_DIR_LEN) || (len > maxlen))
return; return;
strlcpy(setting, fptr, len-extlen+1); strlcpy(setting, fptr, len+1);
settings_save(); settings_save();
} }

View file

@ -55,7 +55,7 @@ struct opt_items {
#ifndef ROCKBOX_DIR #ifndef ROCKBOX_DIR
#error ROCKBOX_DIR not defined (should be in autoconf.h) #error ROCKBOX_DIR not defined (should be in autoconf.h)
#endif #endif
#define ROCKBOX_DIR_LEN sizeof(ROCKBOX_DIR) #define ROCKBOX_DIR_LEN (sizeof(ROCKBOX_DIR)-1)
#endif /* def __PCTOOL__ */ #endif /* def __PCTOOL__ */
@ -288,7 +288,7 @@ bool set_int_ex(const unsigned char* string, const char* unit, int voice_unit,
const char* (*formatter)(char*, size_t, int, const char*), const char* (*formatter)(char*, size_t, int, const char*),
int32_t (*get_talk_id)(int, int)); int32_t (*get_talk_id)(int, int));
void set_file(const char* filename, char* setting, int maxlen); void set_file(const char* filename, char* setting, const int maxlen);
bool set_option(const char* string, const void* variable, enum optiontype type, bool set_option(const char* string, const void* variable, enum optiontype type,
const struct opt_items* options, int numoptions, void (*function)(int)); const struct opt_items* options, int numoptions, void (*function)(int));