/*
 * urldecode
 * based on http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code_C_urlencode
 *
 * usage: deurl "a%20string"
 * outputs: a string
 *
 * brian@aljex.com
 *
 * todo:
 * - combine encode & decode into one binary that looks at argv(0) to determine
 * which mode to operate in.
 * - make it work like cat so that it can be used as a filepro user command.
 *
 * 2005-04-27 bkw - upped the input buffer from 256 bytes to 4k
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>

/* void urldecode(unsigned char *source, unsigned char *dest); */

void urldecode(unsigned char *source, unsigned char *dest)
{
    int num=0, i, index=0;
    int retval=0;
    while(*source)
    {
        if (*source == '%')
        {
            num = 0;
            retval = 0;
            for (i = 0; i < 2; i++)
            {
                *source++;
                if (*(source) < ':')
                {
                    num = *(source) - 48;
                }
                else if (*(source) > '@' && *(source) < '[')
                {
                    num = (*(source) - 'A')+10;
                }
                else
                {
                    num = (*(source) - 'a')+10;
                }

                if ((16*(1-i))) 
                    num = (num*16);
                retval += num;
            }
            dest[index] = retval;
            index++;
        }
        else
        {
            dest[index] = *source;
            index++;
        }
        *source++;
    }
    /* return index; */
}

int main(int argc,char *argv[])
{
	unsigned char out[4096] = {0x00,};
	urldecode(argv[1], out);
	printf("%s\n",out);
	return 0;
}
