Mercurial > geeqie.yaz
changeset 729:9a6a7e95467a
Make stricter match for option's names consisting of a prefix and a number.
It allows to have names like "prefix_12" and "prefix_something" in the same file.
Using strtol() was wrong since it allowed names like "prefix_-0xa", leading
to unpredictable results. It was wrong too with "prefix_something", which
was equivalent to "prefix_0", instead of being an option of its own.
author | zas_ |
---|---|
date | Wed, 21 May 2008 19:37:18 +0000 |
parents | 5042236af960 |
children | 2d8a8e892b5e |
files | src/rcfile.c |
diffstat | 1 files changed, 25 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/rcfile.c Wed May 21 11:46:19 2008 +0000 +++ b/src/rcfile.c Wed May 21 19:37:18 2008 +0000 @@ -595,6 +595,23 @@ *----------------------------------------------------------------------------- */ +static gboolean is_numbered_option(const gchar *option, const gchar *prefix, gint *number) +{ + gsize n; + gsize option_len = strlen(option); + gsize prefix_len = strlen(prefix); + + if (option_len <= prefix_len) return FALSE; + if (g_ascii_strncasecmp(option, prefix, prefix_len) != 0) return FALSE; + + n = prefix_len; + while (g_ascii_isdigit(option[n])) n++; + if (n < option_len) return FALSE; + + if (number) *number = atoi(option + prefix_len); + return TRUE; +} + void load_options(void) { FILE *f; @@ -839,20 +856,21 @@ READ_BOOL(color_profile.use_image); READ_INT(color_profile.input_type); - if (g_ascii_strncasecmp(option, "color_profile.input_file_", 25) == 0) + if (is_numbered_option(option, "color_profile.input_file_", &i)) { - i = strtol(option + 25, NULL, 0) - 1; - if (i >= 0 && i < COLOR_PROFILE_INPUTS) + if (i > 0 && i <= COLOR_PROFILE_INPUTS) { + i--; read_char_option(f, option, option, value, &options->color_profile.input_file[i]); } continue; } - if (g_ascii_strncasecmp(option, "color_profile.input_name_", 25) == 0) + + if (is_numbered_option(option, "color_profile.input_name_", &i)) { - i = strtol(option + 25, NULL, 0) - 1; - if (i >= 0 && i < COLOR_PROFILE_INPUTS) + if (i > 0 && i <= COLOR_PROFILE_INPUTS) { + i--; read_char_option(f, option, option, value, &options->color_profile.input_name[i]); } continue; @@ -863,9 +881,8 @@ /* External Programs */ - if (g_ascii_strncasecmp(option, "external_", 9) == 0) + if (is_numbered_option(option, "external_", &i)) { - i = strtol(option + 9, NULL, 0); if (i > 0 && i <= GQ_EDITOR_SLOTS) { const gchar *ptr;