note
Thilosophy
The original snippet does not work anymore,
because of the deprecated 'prototyped' keyword.
Below is an updated version, that can also be found <a href='http://cvs.sourceforge.net/viewcvs.py/budgie/Budgie/lib/CGICodec.imc?view=markup'>online</a>.
<code>
.sub hex2decimal
.param string hex
.local int result
.local int position
.local string digits
.local int len
result = 0
position = 0
digits = '0123456789ABCDEF'
upcase hex
len = length hex
p_hex_loop:
if position == len goto p_hex_over
result *= 16
$S1 = hex[position]
$I1 = index digits, $S1
result += $I1
inc position
goto p_hex_loop
p_hex_over:
.return(result)
.end
.sub url_decode
.param string theURL
.local int position
# + becomes space
p_unesc_url_space:
position = index theURL, '+'
if position == -1 goto p_unesc_url_others_0
theURL[position] = ' '
goto p_unesc_url_space
p_unesc_url_others_0:
position = 0
p_unesc_url_others:
position = index theURL, '%', position
if position == -1 goto p_unesc_url_over
$I1 = position + 1
$S1 = substr theURL, $I1, 2
$I1 = hex2decimal($S1)
$S1 = chr $I1
theURL = substr position, 3, $S1
inc position
goto p_unesc_url_others
p_unesc_url_over:
.return(theURL)
.end
.sub get_query_params
.param string query
.local pmc result
result = new .Hash
.local int start
.local int end
.local int len
.local string key
.local string value
start = 0
parse:
index end, query, '=', start
if end == -1 goto ret
len = end - start
substr key, query, start, len
key = url_decode(key)
start = end + 1
index end, query, '&', start
if end > -1 goto more_data
substr value, query, start
value = url_decode(value)
result[key] = value
goto ret
more_data:
len = end - start
substr value, query, start, len
value = url_decode(value)
result[key] = value
start = end + 1
goto parse
ret:
.return(result)
.end
</code>
441152
441152