Parrot assembler code to parse a CGI query string into a hash of query parameters. Does not support multiple values for parameters. Just enough to get you started if you want to try writing CGI in low-level Parrot.
# use like this: input string, output Hash PMC
$P1 = get_query_params('foo=bar&baz=boo')
$S1 = $P1['foo']
print $S1
.sub hex2decimal prototyped
.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:
.pcc_begin_return
.return result
.pcc_end_return
.end
.sub url_decode prototyped
.param string theURL
.local int position
# + becomes space
p_unesc_url_space:
position = index theURL, '+'
if position == -1 goto p_unesc_url_others
theURL[position] = ' '
goto p_unesc_url_space
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:
.pcc_begin_return
.return theURL
.pcc_end_return
.end
.sub get_query_params prototyped
.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
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:
.pcc_begin_return
.return result
.pcc_end_return
.end