#
# Documentation in marks(1) man page.
#
function set_mark 
{
   if [ -n "${MARKS_VALIDATE}" ]; then
      if [ -d $2 ]; then
         alias $1="cd $2; echo $2";
      fi
   else
      alias $1="cd $2; echo $2";
   fi

   export $1=$2;
}

function unset_mark 
{
   unalias $1 2> /dev/null;
   unset $1;
}

function mark
{
   typeset name="${1}"
   typeset dir

   case "${name}" in
      [A-Za-z_]* )
         ;;
      * )
         echo "usage: mark mark_name [directory]"
         return 1;;
   esac

   if [ "${#}" -gt 1 ]; then
      dir="${2}"
   else
      dir=$(\pwd)
   fi

   set_mark "${name}" "${dir}"

   if [ -r ${HOME}/.marks ]; then
      if [ -n "${MARKS_BACKUPS}" ]; then
         /bin/cp ${HOME}/.marks ${HOME}/.marks.bak
      fi
      /bin/sed "/^${name}=/d" < ${HOME}/.marks >| ${HOME}/.marks.tmp
      /bin/cp ${HOME}/.marks.tmp ${HOME}/.marks
      /bin/rm ${HOME}/.marks.tmp
   else
      > ${HOME}/.marks
   fi

   if [ -r ${HOME}/.unmarks ]; then
      if [ -n "${MARKS_BACKUPS}" ]; then
         /bin/cp ${HOME}/.unmarks ${HOME}/.unmarks.bak
      fi
      /bin/sed "/^${name}=/d" < ${HOME}/.unmarks >| ${HOME}/.unmarks.tmp
      /bin/cp ${HOME}/.unmarks.tmp ${HOME}/.unmarks
      /bin/rm ${HOME}/.unmarks.tmp
   else
      > ${HOME}/.unmarks
   fi

   echo "${name}=${dir}" >> ${HOME}/.marks
}

function unmark
{
   typeset name=""
   typeset dir=""

   if [ "${#}" = 0 ]; then
      echo "usage: unmark mark_name ..."
      return 1
   fi

   for name in "${@}"; do
      case "${name}" in
         [A-Za-z_]* )
            ;;
         * )
            echo "usage: unmark mark_name ..."
            return 1;;
      esac
   done

   for name in "${@}"; do
      unset_mark "${name}"

      if [ -r ${HOME}/.marks ]; then
         if [ -n "${MARKS_BACKUPS}" ]; then
            /bin/cp ${HOME}/.marks ${HOME}/.marks.bak
         fi
         /bin/sed "/^${name}=/d" < ${HOME}/.marks >| ${HOME}/.marks.tmp
         /bin/cp ${HOME}/.marks.tmp ${HOME}/.marks
         /bin/rm ${HOME}/.marks.tmp
      else
         > ${HOME}/.marks
      fi

      if [ -r ${HOME}/.unmarks ]; then
         if [ -n "${MARKS_BACKUPS}" ]; then
            /bin/cp ${HOME}/.unmarks ${HOME}/.unmarks.bak
         fi
         /bin/sed "/^${name}=/d" < ${HOME}/.unmarks >| ${HOME}/.unmarks.tmp
         /bin/cp ${HOME}/.unmarks.tmp ${HOME}/.unmarks
         /bin/rm ${HOME}/.unmarks.tmp
      else
         > ${HOME}/.unmarks
      fi

      echo "${name}=${dir}" >> ${HOME}/.unmarks
   done
}

function marks
{
   if [ -r ${HOME}/.marks ]; then
      /bin/sort < ${HOME}/.marks
   fi
}

function set_marks_from
{
   if [ -r "${1}" ]; then
      while read line; do
         set_mark "${line%%=*}" "${line##*=}"
      done < "${1}"
   fi
}

function unset_marks_from
{
   if [ -r "${1}" ]; then
      while read line; do
         unset_mark "${line%%=*}" "${line##*=}"
      done < "${1}"
   fi
}

function initmarks
{
   set_marks_from ${HOME}/.marks
}

function hey
{
   unset_marks_from ${HOME}/.unmarks
   set_marks_from   ${HOME}/.marks
}

function dismark
{
   unset_marks_from ${HOME}/.unmarks
   unset_marks_from ${HOME}/.marks
}

function checkmarks
{
   if [ -r ${HOME}/.marks ]; then
      while read line; do
         if [ ! -r "${line##*=}" ]; then
            echo "${line%%=*}"
         fi
      done < ${HOME}/.marks
   fi
}

function importmarks
{
   typeset marks=$(eval echo ~${1}/.marks)

   if [ ! -r "${marks}" ]; then
      echo "${1} has no marks"
      return 1
   fi

   set_marks_from "${marks}"
}

function deportmarks
{
   typeset marks=$(eval echo ~${1}/.marks)
   typeset unmarks=$(eval echo ~${1}/.unmarks)

   unset_marks_from "${marks}"
   unset_marks_from "${unmarks}"

   hey
}

function tidymarks
{
   >| ${HOME}/.unmarks
}
