Skip navigation

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.