Today had to work with URL escape function on my application (C written application)…
I tried to look for something simple on the internet, as usual nothing was simple enough so could re-use / easily adapt.
So decided to write something myself… Below is the result for what I could get.
/*
* compilando: gcc -Wall -o urlescape urlescape.c
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define ISXDIGIT(c) ( \
(c >= 48 && c <= 57) || \
((c & ~0x20) >= 65 && (c & ~0x20) <= 70) \
)
typedef struct {
char *data;
unsigned int len;
unsigned int size;
} str_t;
void
url_escape(str_t *str) {
char *p, *ptr;
char hexstr[3];
unsigned int i=0;
unsigned long l = 0;
p = str->data;
for(i=0; i < str->len; i++) {
if((p - str->data) >= str->len)
break;
if(*p == '%' &&
((p - str->data)+2) < str->len &&
ISXDIGIT(*(p+1)) &&
ISXDIGIT(*(p+2))
) {
p++;
hexstr[0] = *p++;
hexstr[1] = *p++;
hexstr[2] = 0;
l = strtoul(hexstr, &ptr, 16);
str->data[i] = (char)(l & 0x7f);
continue;
}
if(*p == '+') {
*p = ' ';
}
str->data[i] = *p++;
}
str->data[i] = 0;
str->len = i;
}
void
usage()
{
fprintf(stderr, "usage: urlescape <string>\n");
exit(1);
}
int
main(int argc, char **argv)
{
str_t str = { NULL, 0 };
str_t *s = &str;
if(argc < 2)
usage();
s->data = strdup(argv[1]);
s->len = strlen(argv[1]);
s->size = s->len;
url_escape(s);
printf("escaped url: %s\n", s->data);
return 0;
}
Advertisement