sh_path.erl 774 B

123456789101112131415161718192021222324252627
  1. -module(sh_path).
  2. -export([escape/1, unescape/1]).
  3. escape(Path) -> R = reserved(), lists:append([char_encode(Char, R) || Char <- Path]).
  4. unescape(Str) -> decode(Str).
  5. reserved() -> sets:from_list([$/, $\\, $:, $%]).
  6. char_encode(Char, Reserved) ->
  7. case sets:is_element(Char, Reserved) of
  8. true -> [$% | http_util:integer_to_hexlist(Char)];
  9. false -> [Char] end.
  10. %% from http_uri:decode/1
  11. decode(String) ->
  12. do_decode(String).
  13. do_decode([$%,Hex1,Hex2|Rest]) ->
  14. [hex2dec(Hex1)*16+hex2dec(Hex2)|do_decode(Rest)];
  15. do_decode([First|Rest]) ->
  16. [First|do_decode(Rest)];
  17. do_decode([]) ->
  18. [].
  19. hex2dec(X) when (X>=$0) andalso (X=<$9) -> X-$0;
  20. hex2dec(X) when (X>=$A) andalso (X=<$F) -> X-$A+10;
  21. hex2dec(X) when (X>=$a) andalso (X=<$f) -> X-$a+10.