diff options
| -rw-r--r-- | nncmpp.c | 58 | 
1 files changed, 25 insertions, 33 deletions
| @@ -2732,56 +2732,48 @@ mpd_update_playback_state (void)  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  static void -mpd_init_response_map (struct str_map *map) +mpd_process_info (const struct str_vector *data)  { -	str_map_init (map); -	map->key_xfrm = tolower_ascii_strxfrm; -	map->free = free; -} +	struct str_map map; +	str_map_init (&map); +	map.key_xfrm = tolower_ascii_strxfrm; +	map.free = free; -static void -mpd_process_info_chunk (struct str_map *map, char *file) -{ +	// First there's the status, followed by playlist items chunked by "file". +	// Unfortunately we need a field from the front before we process the rest +	// but otherwise it's much better to process the list from the back. +	// +	// TODO: one thing that could help is command_list_ok_begin, +	//   which can add NULL strings to the vector in place of list_OK  	unsigned long n; -	if (!file) +	for (size_t i = 0; i < data->len; i++)  	{ -		if (xstrtoul_map (map, "playlistlength", &n)) +		static const char needle[] = "playlistlength: "; +		if (!strncasecmp_ascii (data->vector[i], needle, sizeof needle - 1) +		 && xstrtoul (&n, data->vector[i] + sizeof needle - 1, 10)) +		{  			item_list_resize (&g_ctx.playlist, n); -		g_ctx.playback_info = *map; -	} -	else -	{ -		if (xstrtoul_map (map, "pos", &n)) -			item_list_set (&g_ctx.playlist, n, map); -		str_map_free (map); +			break; +		}  	} -	mpd_init_response_map (map); -} - -static void -mpd_process_info (const struct str_vector *data) -{ -	struct str_map map; -	mpd_init_response_map (&map); -	// First there's the status, followed by playlist items chunked by "file" -	char *key, *value, *file = NULL; -	for (size_t i = 0; i < data->len; i++) +	char *key, *value; +	for (size_t i = data->len; i--; )  	{  		if (!(key = mpd_client_parse_kv (data->vector[i], &value)))  		{  			print_debug ("%s: %s", "erroneous MPD output", data->vector[i]);  			continue;  		} +		str_map_set (&map, key, xstrdup (value));  		if (!strcasecmp_ascii (key, "file"))  		{ -			mpd_process_info_chunk (&map, file); -			file = value; +			if (xstrtoul_map (&map, "pos", &n)) +				item_list_set (&g_ctx.playlist, n, &map); +			str_map_clear (&map);  		} -		str_map_set (&map, key, xstrdup (value));  	} -	mpd_process_info_chunk (&map, file); -	str_map_free (&map); +	g_ctx.playback_info = map;  }  static void | 
