-module(sh_path). -export([escape/1, unescape/1]). escape(Path) -> R = reserved(), lists:append([char_encode(Char, R) || Char <- Path]). unescape(Str) -> decode(Str). reserved() -> sets:from_list([$/, $\\, $:, $%]). char_encode(Char, Reserved) -> case sets:is_element(Char, Reserved) of true -> [$% | http_util:integer_to_hexlist(Char)]; false -> [Char] end. %% from http_uri:decode/1 decode(String) -> do_decode(String). do_decode([$%,Hex1,Hex2|Rest]) -> [hex2dec(Hex1)*16+hex2dec(Hex2)|do_decode(Rest)]; do_decode([First|Rest]) -> [First|do_decode(Rest)]; do_decode([]) -> []. hex2dec(X) when (X>=$0) andalso (X=<$9) -> X-$0; hex2dec(X) when (X>=$A) andalso (X=<$F) -> X-$A+10; hex2dec(X) when (X>=$a) andalso (X=<$f) -> X-$a+10.