--- mplayer-checkout-2007-08-18/gui/interface.c 2007-08-18 04:15:05.000000000 +0000 +++ mplayer-checkout-modified/gui/interface.c 2007-08-19 20:47:31.000000000 +0000 @@ -158,48 +158,76 @@ (*list)[i + 1] = NULL; } -#ifdef USE_ICONV char * gconvert_uri_to_filename( char * str ) { - iconv_t d; - char * out = strdup( str ); - char * tmp = NULL; - char * ize; - size_t inb,outb; - char * charset = "ISO8859-1"; - char * cs; + iconv_t d; + char * out; + char * tmp = NULL; + char * retstr; + char * inbuf; + char * outbuf; + size_t inbytesleft, outbytesleft; + char * charset = "ISO8859-1"; + char * cs; + + out = strdup(str); - if ( !strchr( str,'%' ) ) return str; + if (!strchr(str, '%')) + { + //free strdup mem + free(out); + return str; + } - { - char * t = calloc( 1,strlen( out ) ); - int i,c = 0; - for ( i=0;i < (int)strlen( out );i++ ) - if ( out[i] != '%' ) t[c++]=out[i]; - else - { - char tmp[5] = "0xXX"; -// if ( out[++i] == '%' ) { t[c++]='%'; continue; }; - tmp[2]=out[++i]; tmp[3]=out[++i]; - t[c++]=(char)strtol( tmp,(char **)NULL,0 ); - } - free( out ); - out=t; - } + + //first convert percent-escaped hex codes (%XX) to chars + char * t = calloc(1, strlen(out)); + int i, c = 0; + for (i = 0; i < (int)strlen(out); i++) + { + if (out[i] != '%') + { + t[c++] = out[i]; + } + else + { + char tmp[5] = "0xXX"; + tmp[2] = out[++i]; + tmp[3] = out[++i]; + t[c++] = (char)strtol(tmp, (char **)NULL, 0); + } + } - if ( (cs=getenv( "CHARSET" )) && *cs ) charset=cs; + //free strdup mem + free(out); + //keep 1st calloc mem + retstr = inbuf = t; - inb=outb=strlen( out ); - tmp=calloc( 1,outb + 1 ); - ize=tmp; - d=iconv_open( charset,"UTF-8" ); - if ( (iconv_t)(-1) == d ) return str; - iconv( d,&out,&inb,&tmp,&outb ); - iconv_close( d ); - free( out ); - return ize; -} + +#ifdef USE_ICONV + //if iconv() available, convert to local charset + if ((cs = getenv("CHARSET")) && *cs) + charset = cs; + + + d = iconv_open( charset,"UTF-8" ); + //if we can't get conversion descriptor, return ISO8859-1 string + if (d == (iconv_t)(-1)) + return t; + + //our conv desc is ok, carry on.. + inbytesleft = outbytesleft = strlen(inbuf); + outbuf = calloc(1, outbytesleft + 1); + retstr = outbuf; + + iconv(d, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + iconv_close(d); + //free 1st calloc mem, 2nd is returned + free(t); #endif + + return retstr; +} void guiInit( void ) {