static const char hex[] = "0123456789abcdef";
static int hexdigit(int x)
{
return (x <= '9') ? x - '0' : (x & 7) + 9;
}
int decode_url(char *from, char *to)
{
char c, x1, x2;
while ((c = *from++) != 0) {
if (c == '%') {
x1 = *from++;
if (!isxdigit(x1)) {
errno = EINVAL;
return -1;
}
x2 = *from++;
if (!isxdigit(x2)) {
errno = EINVAL;
return -1;
}
if (x1 == 0 && x2 == 0) {
errno = EINVAL;
return -1;
}
*to++ = (hexdigit(x1) << 4) + hexdigit(x2);
}
else {
*to++ = c;
}
}
*to = 0;
return 0;
}
void encode_url(const char *from, char *to)
{
char c;
while ((c = *from++) != 0) {
switch (c) {
case '%':
case ' ':
case '?':
case '+':
case '&':
*to++ = '%';
*to++ = hex[(c >> 4) & 15];
*to++ = hex[c & 15];
break;
default:
*to++ = c;
break;
}
}
*to = 0;
}