#!/bin/bash

function mark()
{
  local MARKS_FILE=${HOME}/.marks
  local param="$1"
  local mark_name=""
  local mark_value=""
  if [[ ! -f ${MARKS_FILE} ]]; then
    touch ${MARKS_FILE}
  fi
  case "$param" in
  -g|-s|-d)
    mark_name="$2"
    mark_value=$(grep -i "^$mark_name:" ${MARKS_FILE} | sed -e 's/[^:]*://')
    if [[ "$mark_value" == "" ]]; then
      echo "\`$mark_name' is NOT in mark list!"
      return
    fi
    ;;
  esac
  case "$param" in
  -g)
    cd "$mark_value"
    ;;
  -s)
    echo "$mark_value"
    ;;
  -h|--help)
    echo "mark <name> [<dir>]: mark <dir> (default \$PWD) as <name>"
    echo "mark -g <name>     : goto mark <name>"
    echo "mark -s <name>     : show mark <name>"
    echo "mark -d <name>     : delete mark <name>"
    echo "mark -l            : list all marks"
    ;;
  -l)
    cat ${MARKS_FILE}
    ;;
  -d)
    grep -v "^$mark_name:" ${MARKS_FILE} > ${MARKS_FILE}.tmp
    mv ${MARKS_FILE}.tmp ${MARKS_FILE}
    ;;
  -*)
    echo "Unrecognized option"
    ;;
  *)
    local mark_name="$1"
    local mark_value="$2"
    if [[ "$mark_value" == "" ]]; then
      mark_value=`pwd`
    fi
    grep -v "^$mark_name:" ${MARKS_FILE} > ${MARKS_FILE}.tmp
    mv ${MARKS_FILE}.tmp ${MARKS_FILE}
    echo "$mark_name:$mark_value" >> ${MARKS_FILE}
    ;;
  esac
}
