Listing One
DeWeb: PROCEDURE; PARSE ARG Input, Opts
/* *******************************************
DeWeb converts hex encoded (e.g. %20=space)
characters in the Input string to the equivalent
ASCII characters and returns the decoded string.
If the 2 characters following a % sign do not
represent a hexadecimal 2 digit number, then
the % and following 2 characters are returned
unchanged. If the string terminates with a % then
the % sign is returned unchanged. If the final
two characters in the string are a % sign
followed by a single hexadecimal digit then
they are returned unchanged.
The optional Options argument contains a set of
characters which allows you to tell DeWeb to:
'+' convert plus signs (+) to psaces
in the input before the hex decoding is done.
'*' convert asterisks (*) to percent signs (%)
after the decoding. This option
is often used with Oracle.
Examples:
SAY DeWeb('%3Cpre%3e%20%%25Loss %Util%')
results in: '
%%Loss %Util%'
SAY DeWeb('%3cpre%3eName++Address%','*+')
results in '
Name Address*'
******************************************* */
IF POS('+',Opts)/=0 THEN Input=TRANSLATE(Input,' ','+')
Start=1; Decoded=''
DO WHILE POS('%',SUBSTR(Input,Start))/=0
String=SUBSTR(Input,Start)
PARSE VAR String Pre'%'+1 Ch +2 Input
IF DATATYPE(Ch,'X') & LENGTH(Ch)=2 THEN
Ch=X2C(Ch)
ELSE DO; Input=Ch||Input; Ch='%'; END
Start=LENGTH(Decoded||Pre||Ch)+1
Input=Decoded||Pre||Ch||Input
Decoded=Decoded||Pre||Ch
END
IF POS('*',Opts)/=0 THEN Input=TRANSLATE(Input,'%','*')
RETURN Input
( back )