1%%% Copyright (C) 2009 Enrique Marcote, Miguel Rodriguez
2%%% All rights reserved.
3%%%
4%%% Redistribution and use in source and binary forms, with or without
5%%% modification, are permitted provided that the following conditions are met:
6%%%
7%%% o Redistributions of source code must retain the above copyright notice,
8%%%   this list of conditions and the following disclaimer.
9%%%
10%%% o Redistributions in binary form must reproduce the above copyright notice,
11%%%   this list of conditions and the following disclaimer in the documentation
12%%%   and/or other materials provided with the distribution.
13%%%
14%%% o Neither the name of ERLANG TRAINING AND CONSULTING nor the names of its
15%%%   contributors may be used to endorse or promote products derived from this
16%%%   software without specific prior written permission.
17%%%
18%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19%%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20%%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21%%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22%%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23%%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24%%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25%%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26%%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27%%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28%%% POSSIBILITY OF SUCH DAMAGE.
29-module(cl_url).
30
31%%% EXTERNAL EXPORTS
32-export([decode/1, encode/1]).
33
34%%%-----------------------------------------------------------------------------
35%%% EXTERNAL EXPORTS
36%%%-----------------------------------------------------------------------------
37decode([$%, X, Y | T]) ->
38    [erlang:list_to_integer([X, Y], 16) | decode(T)];
39decode([$+ | T]) ->
40    [32 | decode(T)];
41decode([H | T]) ->
42    [H | decode(T)];
43decode([]) ->
44    [].
45
46
47encode([H | T]) when H >= $a, H =< $z ->
48    [H | encode(T)];
49encode([H | T]) when H >= $A, H =< $Z ->
50    [H | encode(T)];
51encode([H | T]) when H >= $0, H =< $9 ->
52    [H | encode(T)];
53encode([H | T]) when H == $_; H == $.; H == $- ->
54    [H | encode(T)];
55encode([32 | T]) ->
56    [$+ | encode(T)];
57encode([H | T]) ->
58    case erlang:integer_to_list(H, 16) of
59        [X, Y] ->
60            [$%, X, Y | encode(T)];
61        [X] ->
62            [$%, $0, X | encode(T)]
63    end;
64encode([]) ->
65    [].
66