#
# Copyright (c) 2012 LAAS/CNRS
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software for any purpose
# with or without   fee is hereby granted, provided   that the above  copyright
# notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS  SOFTWARE INCLUDING ALL  IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR  BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR  ANY DAMAGES WHATSOEVER RESULTING  FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION,   ARISING OUT OF OR IN    CONNECTION WITH THE USE   OR
# PERFORMANCE OF THIS SOFTWARE.
#
#                                            Anthony Mallet on Tue Apr  3 2012
#

namespace eval genomix::uri {
  variable specials {
    % " " ; ? : @ & = + $ , < > # \" \{ \} | \\ ^ \[ \] `
  }

  variable specialsx {}
  foreach c $specials {
    lappend specialsx [format "%%%02x" [scan $c %c]]
  }

  variable encmap {}
  foreach s $specials c $specialsx {
    lappend encmap $s $c
  }


  # --- encode -------------------------------------------------------------
  #
  proc encode { uri } {
    variable encmap
    return [string map $encmap $uri]
  }
  namespace export encode


  # --- decode -------------------------------------------------------------
  #
  proc decode { uri } {
    while {[regexp -indices {%[0-9A-Fa-f][0-9A-Fa-f]} $uri i]} {
      set c [format {%c} 0x[string range $uri [lindex $i 0]+1 [lindex $i 1]]]
      set uri [string replace $uri [lindex $i 0] [lindex $i 1] $c]
    }
    return [string map {+ { }} $uri]
  }
  namespace export decode

  # create 'uri' command
  namespace ensemble create
}
