Habitat-lora-gateway/urlencode.c

72 wiersze
1.6 KiB
C

#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;
}