diff options
author | stanley lieber <stanley.lieber@gmail.com> | 2012-10-04 14:08:32 -0500 |
---|---|---|
committer | stanley lieber <stanley.lieber@gmail.com> | 2012-10-04 14:08:32 -0500 |
commit | 0c93da13aeda2337f1e7a81f8793bca52887c741 (patch) | |
tree | c53495225e385a294685dea3cabd4573f640f682 /rc/bin | |
parent | 56df14a6a319b1617d004b46f36710e2c27fe380 (diff) |
add /rc/bin/urlencode
Diffstat (limited to 'rc/bin')
-rwxr-xr-x | rc/bin/urlencode | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/rc/bin/urlencode b/rc/bin/urlencode new file mode 100755 index 000000000..a23359328 --- /dev/null +++ b/rc/bin/urlencode @@ -0,0 +1,36 @@ +#!/bin/awk -f +BEGIN { +# We assume an awk implementation that is just plain dumb. +# We will convert an character to its ASCII value with the +# table ord[], and produce two-digit hexadecimal output +# without the printf("%02X") feature. + +EOL = "%0A" # "end of line" string (encoded) +split ("1 2 3 4 5 6 7 8 9 A B C D E F", hextab, " ") +hextab [0] = 0 +for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0 +} +{ +encoded = "" +for ( i=1; i<=length ($0); ++i ) { + c = substr ($0, i, 1) + if ( c ~ /[a-zA-Z0-9.-]/ ) { + encoded = encoded c # safe character + } else if ( c == " " ) { + encoded = encoded "+" # special handling + } else { + # unsafe character, encode it as a two-digit hex-number + lo = ord [c] % 16 + hi = int (ord [c] / 16); + encoded = encoded "%" hextab [hi] hextab [lo] + } +} +if ( EncodeEOL ) { + printf ("%s", encoded EOL) +} else { + print encoded +} +} +END { + #if ( EncodeEOL ) print "" +} |