dracoblue.net

urlencode in Pawn

When creating new REST-ful API for GTAT (based upon my pwncurl and a lua backend) I had to implement the method urlencode in pawn.

So I took a look at the specification in RFC 1738 to get information about what characters need to be encoded.

RFC 1738: Only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.

Since I really want to be sure that all is encoded properly and %xx encoding is

allowed, too - even if not neceassary - my urlencode function encodes every character except A-Z,a-z,0-9,'-','_' and '.'.
/**
 *  Url encodes a specific string
 *  @param string string
 */
stock urlencode(string[]) {
	new ret[MAX_STRING];
	ret[0] = 0;
	new i = 0;
	new p = 0;
	new s = 0;
	while (string[i] != 0) {
		if  (
				(string[i] >= 'A' && string[i] <='Z')
				|| (string[i] >= 'a' && string[i] <='z')
				|| (string[i] >= '0' && string[i] <='9')
				|| (string[i] == '-')
				|| (string[i] == '_')
				|| (string[i] == '.')
			) {
				ret[p] = string[i];
			} else {
				//
				ret[p] = '%';
				p++;
				s = (string[i] % 16); //
				ret[p+1] = (s>9) ? (55+s) : (48+s); // 64 - 9 = 55
				s = floatround((string[i] - s)/16);
				ret[p] = (s>9) ? (55+s) : (48+s); // 64 - 9 = 55
				p++;
			}
		p++;
		i++;
	}
	return ret;
}

This function will also be part of next release of dutils.

In dutils, pawn, pwncurl by
@ 2009-06-20, Comments at Reddit & Hackernews