int fsof_url_decode()

in agent/src/c/common/fsof_url.c [57:95]


int fsof_url_decode(char *str, int len)
{
    char *dest = str;
    char *data = str;
    int value;
    int c;

    while (len--) {
        if (*data == '+') {
            *dest = ' ';
        }
        else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
                                 && isxdigit((int) *(data + 2))) {
            c = ((unsigned char *)(data+1))[0];
            if (isupper(c)) {
                c = tolower(c);
            }

            value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
            c = ((unsigned char *)(data+1))[1];
            if (isupper(c)) {
                c = tolower(c);
            }

            value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
            *dest = (char)value ;
            data += 2;
            len -= 2;
        } else {
            *dest = *data;
        }
        data++;
        dest++;
    }

    *dest = '\0';
    return dest - str;

}