--- mplayer-checkout-2007-08-18/gui/interface.c 2007-08-18 04:15:05.000000000 +0000 +++ mplayer-checkout-modified/gui/interface.c 2007-08-20 10:51:39.000000000 +0000 @@ -158,48 +158,71 @@ (*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; - - if ( !strchr( str,'%' ) ) 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]; + iconv_t d; + char * instr; + char * tmp = NULL; + char * retstr; + char * inbuf; + char * outbuf; + size_t inbytesleft, outbytesleft; + char * charset = "ISO8859-1"; + char * cs; + + //allow str to be freed + instr = strdup(str); + + if (!strchr(instr, '%')) + return instr; + + //first convert percent-escaped hex codes (%XX) to chars + char * t = calloc(1, strlen(instr)); + int i, c = 0; + for (i = 0; i < (int)strlen(instr); i++) + { + if (instr[i] != '%') + { + t[c++] = instr[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; - } + tmp[2] = instr[++i]; + tmp[3] = instr[++i]; + t[c++] = (char)strtol(tmp, (char **)NULL, 0); + } + } - if ( (cs=getenv( "CHARSET" )) && *cs ) charset=cs; + //free strdup mem + free(instr); + //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 retstr; + + //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 ) {