" don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo
set cpo&vim

function! go#uri#Encode(value) abort
    return s:encode(a:value, '[^A-Za-z0-9_.~-]')
endfunction

function! go#uri#EncodePath(value) abort
    let l:separator = '/'
    if go#util#IsWin()
      let l:separator = '\\'
    endif
    return s:encode(a:value, '[^' . l:separator . 'A-Za-z0-9_.~-]')
endfunction

function! s:encode(value, unreserved)
    return substitute(
    \   a:value,
    \   a:unreserved,
    \   '\=s:encodechar(submatch(0))',
    \   'g'
    \)
endfunction

function! go#uri#Decode(value) abort
    return substitute(
    \   a:value,
    \   '%\(\x\x\)',
    \   '\=s:decodehex(submatch(1))',
    \   'g'
    \)
endfunction

function! s:encodechar(value)
  let l:idx = 0
  let l:encoded = ''
  while l:idx < strlen(a:value)
    let l:byte = strpart(a:value, l:idx, 1)
    let l:encoded = printf('%s%%%02X', l:encoded, char2nr(l:byte))
    let l:idx += 1
  endwhile

  return l:encoded
endfunction

function! s:decodehex(value)
  return eval(printf('"\x%s"', a:value))
endfunction

" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save

" vim: sw=2 ts=2 et