Re: [PATCH] - improved decoding of URL special characters
Dustin Kirkland <[email protected]> Thu, 20 Oct 2005 11:44:16 -0500
| Newsgroups | gmane.comp.multimedia.xmms.devel |
|---|---|
| Message-ID | <[email protected]> |
On 10/20/05, Andrew Sveikauskas <[email protected]> wrote: > Sure. Go for it. The following is an updated patch utilizing Andrew's more efficient algorithm. Can this be considered for inclusion? :-Dustin diff -urpN xmms-1.2.10/xmms/playlist.c xmms-1.2.10-urldecodestr/xmms/playlist.c --- xmms-1.2.10/xmms/playlist.c 2004-02-23 14:31:43.000000000 -0600 +++ xmms-1.2.10-urldecodestr/xmms/playlist.c 2005-10-20 11:37:46.000000000 -0500 @@ -983,16 +983,7 @@ char *playlist_get_info_text(void) while ((tmp = strchr(text, '_')) != NULL) *tmp = ' '; if (cfg.convert_twenty) - while ((tmp = strstr(text, "%20")) != NULL) - { - char *tmp2; - tmp2 = tmp + 3; - *(tmp++) = ' '; - while (*tmp2) - *(tmp++) = *(tmp2++); - *tmp = '\0'; - } - + urldecodestr(text); return text; } diff -urpN xmms-1.2.10/xmms/playlist_list.c xmms-1.2.10-urldecodestr/xmms/playlist_list.c --- xmms-1.2.10/xmms/playlist_list.c 2003-06-11 13:44:17.000000000 -0500 +++ xmms-1.2.10-urldecodestr/xmms/playlist_list.c 2005-10-20 11:37:46.000000000 -0500 @@ -314,18 +314,7 @@ void playlist_list_draw_string_wc(PlayLi } if (cfg.convert_twenty && len > 2) - { - GdkWChar *wtmp; - while ((wtmp = find_in_wstr(wtext, "%20")) != NULL) - { - GdkWChar *wtmp2 = wtmp + 3; - *(wtmp++) = L' '; - while (*wtmp2) - *(wtmp++) = *(wtmp2++); - *wtmp = L'\0'; - len -= 2; - } - } + urldecodestr(wtext); newlen = len + 2; @@ -366,14 +355,8 @@ void playlist_list_draw_string(PlayList_ while ((tmp = strchr(text, '_')) != NULL) *tmp = ' '; if (cfg.convert_twenty) - while ((tmp = strstr(text, "%20")) != NULL) - { - char *tmp2 = tmp + 3; - *(tmp++) = ' '; - while (*tmp2) - *(tmp++) = *(tmp2++); - *tmp = '\0'; - } + urldecodestr(text); + len = strlen(text); while (gdk_text_width(font, text, len) > width && len > 4) { diff -urpN xmms-1.2.10/xmms/urldecode.c xmms-1.2.10-urldecodestr/xmms/urldecode.c --- xmms-1.2.10/xmms/urldecode.c 2003-05-19 16:22:08.000000000 -0500 +++ xmms-1.2.10-urldecodestr/xmms/urldecode.c 2005-10-20 11:37:49.000000000 -0500 @@ -61,3 +61,31 @@ char *xmms_urldecode_path(char *encoded_ return encoded_path; } + + +int urldecodestr( char *buf ) +{ + const char *r = buf; + while( *r ) { + switch( *r ) { + case '%': + /* Is this followed by a 2-digit hex string? */ + if( isxdigit(r[1]) && isxdigit(r[2]) ) + { + char hexstr[2]; + int i; + hexstr[0] = *++r; + hexstr[1] = *++r; + ++r; + sscanf( hexstr, "%x", &i ); + *buf++ = i; + break; + } + /* No, examine next char. */ + default: + *buf++ = *r++; + } + } + *buf = 0; + return 0; +} diff -urpN xmms-1.2.10/xmms/urldecode.h xmms-1.2.10-urldecodestr/xmms/urldecode.h --- xmms-1.2.10/xmms/urldecode.h 2000-05-31 21:56:20.000000000 -0500 +++ xmms-1.2.10-urldecodestr/xmms/urldecode.h 2005-10-20 11:37:58.000000000 -0500 @@ -17,3 +17,4 @@ */ char *xmms_urldecode_path(char *); +int urldecodestr(char *buf);