#!/bin/sh
#
# dow   shell script to calculate the day of the week.
#       Input data is passed either as command line arguments
#       or via standard input.
#       In both cases the moment of time can be given as
#       a Julian Day number or as day/month/year.
#       The option switch [-n] will suppress the newline 
#       character which is normally output after the name 
#       of the day.
#
# Usage:    dow <day> <month> <year> [ -n]
#           dow <Julian_Day_number> [-n]
#           dow [-n] -    (use standard input)
#
declare -i DAY
declare -i MONTH
declare -i YEAR
declare -i JD
declare -i DOW

if [ $# -eq 0 -o "$1" = "-help" -o "$1" = "-h" ] ; then
   echo 'Usage: dow <dd> <mm> <yyyy> [-n]' 1>&2
   echo '       dow <Julian_Day_number> [-n]' 1>&2
   echo '       dow [-n] -    (use standard input)' 1>&2
   exit 1
fi

# first case: day month & year given on the command line
if [ $# -ge 3 ] ; then
   DAY=$[$1]
   MONTH=$[$2]
   YEAR=$[$3]
   if [ "$4" = "-n" ] ; then
      NEWLINE="-n"
   else
      NEWLINE=
   fi
   if [ $DAY -lt 1 -o $DAY -gt 31 ] ; then
      echo "dow: parameter #1 for day out of range" 1>&2
      exit 1
   fi
   if [ $MONTH -lt 1 -o $MONTH -gt 12 ] ; then
      echo "dow: parameter #2 for month out of range" 1>&2
      exit 1
   fi
   JD=`jd $DAY $MONTH $YEAR | cut -d . -f 1 -`
   #echo $JD
fi

# second case: Julian Day number given on command line
if [ $# -le 2 -a "$1" != "-" -a "$2" != "-" ] ; then
   JD=`echo $1 | cut -d . -f 1 -`
   if [ $JD -eq 0 ] ; then
      echo "dow: Warning: Julian Day number 0 as input" 1>&2
   fi
   if [ "$2" = "-n" ] ; then
      NEWLINE="-n"
   else
      NEWLINE=
   fi
fi

# third case: use standard input
if [ "$1" = "-" -o "$2" = "-" ] ; then
   STDINP="`cat -`"
   NEWLINE=`echo "$STDINP" | sed -e '/-n/!d' \
                                 -e 's/\(^[^-]*\)\(-n\)\(.*$\)/\2/g'`
   if [ "$1" = "-n" -o "$2" = "-n" ] ; then
      NEWLINE="-n"
   fi
   INSTRG=`echo "$STDINP" | sed -e 's/  */:/g' -e 's/^.*$/&:::/'`
   ARGA=`echo "$INSTRG" | cut -d : -f 1 -`
   ARGB=`echo "$INSTRG" | cut -d : -f 2 -`
   ARGC=`echo "$INSTRG" | cut -d : -f 3 -`
   if [ -z $ARGC ] ; then
      # Julian Day number input
      JD=`echo $ARGA | cut -d . -f 1 -`
      if [ $JD -eq 0 ] ; then
         echo "dow: Warning: Julian Day number 0 as input" 1>&2
      fi
   else
      # day/month/year
      if [ $ARGA -lt 1 -o $ARGA -gt 31 ] ; then
         echo "dow: parameter #1 for day out of range" 1>&2
         exit 1
      fi
      if [ $ARGB -lt 1 -o $ARGB -gt 12 ] ; then
         echo "dow: parameter #2 for month out of range" 1>&2
         exit 1
      fi
      JD=`jd $ARGA $ARGB $ARGC | cut -d . -f 1 -`
   fi
fi

# echo "JD = $JD"

let JD+=2
let DOW=$[ $JD % 7 ]

case $DOW in
   0) echo $NEWLINE "Sunday" ;;
   1) echo $NEWLINE "Monday" ;;
   2) echo $NEWLINE "Tuesday" ;;
   3) echo $NEWLINE "Wednesday" ;;
   4) echo $NEWLINE "Thursday" ;;
   5) echo $NEWLINE "Friday" ;;
   6) echo $NEWLINE "Saturday" ;;
esac
exit 0
