/************************************************************************ URLデコードプログラム copyright 2004, TKEN ************************************************************************/ #include static int urldecode_internal( char *, char * ); int main( int argc, char **argv ) { static unsigned char tmpbuf[4096]; static unsigned char result[4096]; tmpbuf[4095] = '\0'; while( fgets( tmpbuf, 4096, stdin ) != NULL ) { if ( tmpbuf[4095] != '\0' ) { fprintf( stderr, "Too long line\n" ); exit(1); } urldecode_internal( tmpbuf, result ); printf( result ); } return 0; } static int urldecode_internal( char *src, char *result ) { int i; int len; int j; i = 0; j = 0; if ( src[0] == '\0' ) { result[0] = '\0'; return 1; } len = strlen( src ); while ( src[i] != '\0' ) { if ( src[i] == '+' ) { result[j] = ' '; i++; j++; continue; } if ( src[i] == '%' ) { if ( i >= len - 2 ) { return 0; } switch ( src[i+1] ) { case '0': result[j] = 0; break; case '1': result[j] = 16; break; case '2': result[j] = 32; break; case '3': result[j] = 48; break; case '4': result[j] = 64; break; case '5': result[j] = 80; break; case '6': result[j] = 96; break; case '7': result[j] = 112; break; case '8': result[j] = 128; break; case '9': result[j] = 144; break; case 'a': result[j] = 160; break; case 'A': result[j] = 160; break; case 'b': result[j] = 176; break; case 'B': result[j] = 176; break; case 'c': result[j] = 192; break; case 'C': result[j] = 192; break; case 'd': result[j] = 208; break; case 'D': result[j] = 208; break; case 'e': result[j] = 224; break; case 'E': result[j] = 224; break; case 'f': result[j] = 240; break; case 'F': result[j] = 240; break; default: return 0; } switch ( src[i+2] ) { case '0': result[j] += 0; break; case '1': result[j] += 1; break; case '2': result[j] += 2; break; case '3': result[j] += 3; break; case '4': result[j] += 4; break; case '5': result[j] += 5; break; case '6': result[j] += 6; break; case '7': result[j] += 7; break; case '8': result[j] += 8; break; case '9': result[j] += 9; break; case 'a': result[j] += 10; break; case 'A': result[j] += 10; break; case 'b': result[j] += 11; break; case 'B': result[j] += 11; break; case 'c': result[j] += 12; break; case 'C': result[j] += 12; break; case 'd': result[j] += 13; break; case 'D': result[j] += 13; break; case 'e': result[j] += 14; break; case 'E': result[j] += 14; break; case 'f': result[j] += 15; break; case 'F': result[j] += 15; break; default: return 0; } i = i + 3; j++; continue; } result[j] = src[i]; i++; j++; } result[j] = '\0'; return 1; }