##
##  mdate -- Pretty-print modification time of a file or dir
##  Copyright (c) 1995-1997 Free Software Foundation, Inc.
##  Originally idea and basis code by Ulrich Drepper
##  Enhanced by Ralf S. Engelschall for shtool
##
##  This file is part of shtool and free software; you can redistribute
##  it and/or modify it under the terms of the GNU General Public
##  License as published by the Free Software Foundation; either version
##  2 of the License, or (at your option) any later version.
##
##  This file is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
##  General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program; if not, write to the Free Software
##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
##

str_tool="mdate"
str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep <str>] [-o|--order <spec>] <path>"
arg_spec="1="
opt_spec="n.z.s.d.f:o:"
opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order"
opt_n=no
opt_z=no
opt_s=no
opt_d=no
opt_f=" "
opt_o="dmy"

. ./sh.common

fod="$1"
case "$opt_o" in
    [dmy][dmy][dmy] )
        ;;
    * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2
        exit 1
        ;;
esac
if [ ! -r "$fod" ]; then
    echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
    exit 1
fi

#   prevent "date" giving response in another language
LANG=C;    export LANG
LC_ALL=C;  export LC_ALL
LC_TIME=C; export LC_TIME

#   get the extended ls output of the file or directory.
if ls -L /dev/null >/dev/null 2>&1; then
    set - x`ls -L -l -d $fod`
else
    set - x`ls -l -d $fod`
fi

#   The month is at least the fourth argument
#   (3 shifts here, the next inside the loop).
shift; shift; shift

#   Find the month. Next argument is day, followed by the year or time.
month=""
while [ ".$month" = . ]; do
    shift
    case $1 in
        Jan) month=January;   nummonth=1  ;;
        Feb) month=February;  nummonth=2  ;;
        Mar) month=March;     nummonth=3  ;;
        Apr) month=April;     nummonth=4  ;;
        May) month=May;       nummonth=5  ;;
        Jun) month=June;      nummonth=6  ;;
        Jul) month=July;      nummonth=7  ;;
        Aug) month=August;    nummonth=8  ;;
        Sep) month=September; nummonth=9  ;;
        Oct) month=October;   nummonth=10 ;;
        Nov) month=November;  nummonth=11 ;;
        Dec) month=December;  nummonth=12 ;;
    esac
done
day="$2"
year="$3"

#   We finally have to deal with the problem that the "ls" output
#   gives either the time of the day or the year.
case $year in
    *:*)
        this_year=`date '+%Y' 2>/dev/null`
        if [ ".$this_year" = . ]; then
            this_year=`date '+%y'`
            case $this_year in
                [5-9][0-9]) this_year="19$this_year" ;;
                [0-4][0-9]) this_year="20$this_year" ;;
            esac
        fi
        #   for the following months of the last year the time notation
        #   is usually also used for files modified in the last year.
        this_month=`date '+%m'`
        if (expr $nummonth \> $this_month) >/dev/null; then
            this_year=`expr $this_year - 1`
        fi
        year="$this_year"
        ;;
esac

#   Optionally fill day and month with leeding zeros
if [ ".$opt_z" = .yes ]; then
    case $day in
        [0-9][0-9] ) ;;
             [0-9] ) day="0$day" ;;
    esac
    case $nummonth in
        [0-9][0-9] ) ;;
             [0-9] ) nummonth="0$nummonth" ;;
    esac
fi

#   Optionally use digits for month
if [ ".$opt_d" = .yes ]; then
    month="$nummonth"
fi

#   Optionally shorten the month name to three characters
if [ ".$opt_s" = .yes ]; then
    month=`echo $month | cut -c1-3`
fi

#   Output the resulting date string
echo dummy | awk '{
    for (i = 0; i < 3; i++) {
        now = substr(order, 1, 1);
        order = substr(order, 2);
        if (now == "d")
            out = day;
        else if (now == "m")
            out = month;
        else if (now == "y")
            out = year;
        if (i < 2)
            printf("%s%s", out, field);
        else
            printf("%s", out);
    }
    if (newline != "yes")
        printf("\n");
}' "day=$day" "month=$month" "year=$year" \
   "field=$opt_f" "order=$opt_o" "newline=$opt_n"

