kopia lustrzana https://github.com/PiInTheSky/lora-gateway
72 wiersze
1.6 KiB
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;
|
|
}
|