-
Notifications
You must be signed in to change notification settings - Fork 69
/
urlencode.c
71 lines (66 loc) · 1.59 KB
/
urlencode.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* Converts a hex character to its integer value */
char
from_hex( char ch )
{
return isdigit( ch ) ? ch - '0' : tolower( ch ) - 'a' + 10;
}
/* Converts an integer value to its hex character*/
char
to_hex( char code )
{
static char hex[] = "0123456789abcdef";
return hex[code & 15];
}
/* Returns a url-encoded version of str */
/* IMPORTANT: be sure to free() the returned string after use */
char *
url_encode( char *str )
{
char *pstr = str, *buf = malloc( strlen( str ) * 3 + 1 ), *pbuf = buf;
while ( *pstr )
{
if ( isalnum( *pstr ) || *pstr == '-' || *pstr == '_' || *pstr == '.'
|| *pstr == '~' )
*pbuf++ = *pstr;
else if ( *pstr == ' ' )
*pbuf++ = '+';
else
*pbuf++ = '%', *pbuf++ = to_hex( *pstr >> 4 ), *pbuf++ =
to_hex( *pstr & 15 );
pstr++;
}
*pbuf = '\0';
return buf;
}
/* Returns a url-decoded version of str */
/* IMPORTANT: be sure to free() the returned string after use */
char *
url_decode( char *str )
{
char *pstr = str, *buf = malloc( strlen( str ) + 1 ), *pbuf = buf;
while ( *pstr )
{
if ( *pstr == '%' )
{
if ( pstr[1] && pstr[2] )
{
*pbuf++ = from_hex( pstr[1] ) << 4 | from_hex( pstr[2] );
pstr += 2;
}
}
else if ( *pstr == '+' )
{
*pbuf++ = ' ';
}
else
{
*pbuf++ = *pstr;
}
pstr++;
}
*pbuf = '\0';
return buf;
}