X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fconf.c;h=81c280a405fcd85c7ac0062cc2923015887a9ae9;hb=6305a540396ba2936673c1ddd0d2fbfeac3dcb9e;hp=1f1f0bc39f0754b3cd847b2f327ffc6b04ab85db;hpb=fb6ffa422091277d7116fb059b23424ad9376777;p=ncmpc.git diff --git a/src/conf.c b/src/conf.c index 1f1f0bc..81c280a 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2010 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -84,6 +84,28 @@ #define CONF_CHAT_PREFIX "chat-prefix" #define CONF_SECOND_COLUMN "second-column" +gcc_const +static bool +is_space_not_null(char ch) +{ + unsigned char uch = (unsigned char)ch; + return uch <= 0x20 && uch > 0; +} + +/** + * Returns the first non-space character (or a pointer to the null + * terminator). Similar to g_strchug(), but just moves the pointer + * forward without modifying the string contents. + */ +gcc_pure +static char * +skip_spaces(char *p) +{ + while (is_space_not_null(*p)) + ++p; + return p; +} + static bool str2bool(char *str) { @@ -99,6 +121,29 @@ print_error(const char *msg, const char *input) _("Error"), msg, input); } +gcc_const +static bool +is_word_char(char ch) +{ + return g_ascii_isalnum(ch) || ch == '-' || ch == '_'; +} + +static char * +after_unquoted_word(char *p) +{ + if (!is_word_char(*p)) { + print_error(_("Word expected"), p); + return NULL; + } + + ++p; + + while (is_word_char(*p)) + ++p; + + return p; +} + static int parse_key_value(char *str, char **end) { @@ -206,15 +251,15 @@ separate_value(char *p) *value++ = 0; g_strchomp(p); - return g_strchug(value); + return skip_spaces(value); } -static int +static bool parse_color(char *str) { char *value = separate_value(str); if (value == NULL) - return -1; + return false; return colors_assign(str, value); } @@ -231,7 +276,7 @@ after_comma(char *p) if (comma != NULL) { *comma++ = 0; - comma = g_strchug(comma); + comma = skip_spaces(comma); } else comma = p + strlen(p); @@ -239,19 +284,19 @@ after_comma(char *p) return comma; } -static int +static bool parse_color_definition(char *str) { char *value = separate_value(str); if (value == NULL) - return -1; + return false; /* get the command name */ short color = colors_str2color(str); if (color < 0) { char buf[MAX_LINE_LENGTH]; print_error(_("Bad color name"), buf); - return -1; + return false; } /* parse r,g,b values */ @@ -261,13 +306,13 @@ parse_color_definition(char *str) char *next = after_comma(value), *endptr; if (*value == 0) { print_error(_("Incomplete color definition"), str); - return -1; + return false; } rgb[i] = strtol(value, &endptr, 0); if (endptr == value || *endptr != 0) { print_error(_("Invalid number"), value); - return -1; + return false; } value = next; @@ -275,7 +320,7 @@ parse_color_definition(char *str) if (*value != 0) { print_error(_("Malformed color definition"), str); - return -1; + return false; } return colors_define(str, rgb[0], rgb[1], rgb[2]); @@ -368,25 +413,25 @@ get_search_mode(char *value) static bool parse_line(char *line) { - size_t len = strlen(line), i = 0, j = 0; - /* get the name part */ - char name[MAX_LINE_LENGTH]; - while (i < len && line[i] != '=' && !g_ascii_isspace(line[i])) - name[j++] = line[i++]; + char *const name = line; + char *const name_end = after_unquoted_word(line); + if (name_end == NULL) + return false; - name[j] = '\0'; + line = skip_spaces(name_end); + if (*line == '=') { + ++line; + line = skip_spaces(line); + } else if (line == name_end) { + print_error(_("Missing '='"), name_end); + return false; + } - /* skip '=' and whitespace */ - while (i < len && (line[i] == '=' || g_ascii_isspace(line[i]))) - i++; + *name_end = 0; /* get the value part */ - char value[MAX_LINE_LENGTH]; - j = 0; - while (i < len) - value[j++] = line[i++]; - value[j] = '\0'; + char *const value = line; /* key definition */ if (!strcasecmp(CONF_KEY_DEFINITION, name)) @@ -501,11 +546,8 @@ parse_line(char *line) g_free(options.scroll_sep); options.scroll_sep = get_format(value); } else if (!strcasecmp(CONF_DISPLAY_TIME, name)) -#ifdef NCMPC_MINI + /* obsolete, ignore */ {} -#else - options.display_time = str2bool(value); -#endif else if (!strcasecmp(CONF_JUMP_PREFIX_ONLY, name)) #ifdef NCMPC_MINI {} @@ -572,7 +614,7 @@ read_rc_file(char *filename) char line[MAX_LINE_LENGTH]; while (fgets(line, sizeof(line), file) != NULL) { - char *p = g_strchug(line); + char *p = skip_spaces(line); if (*p != 0 && *p != COMMENT_TOKEN) parse_line(g_strchomp(p)); @@ -582,19 +624,19 @@ read_rc_file(char *filename) return 0; } -int +bool check_user_conf_dir(void) { char *directory = g_build_filename(g_get_home_dir(), "." PACKAGE, NULL); if (g_file_test(directory, G_FILE_TEST_IS_DIR)) { g_free(directory); - return 0; + return true; } - int retval = g_mkdir(directory, 0755); + bool success = g_mkdir(directory, 0755) == 0; g_free(directory); - return retval; + return success; } char *