#!      /bin/sh
#
#	Calculate days between two dates, or a new
#	date given an offset.  If the first date is
#	not given, assume today.
#
test "$SHDEBUG" && set -x
usage="[y/m/d] [y/m/d | n]"
self=`basename $0`
erra=`expr $# \<= 2`
test $# -lt 2 && set `date +'%Y/%m/%d'` $1 0
errb=`expr "$1" : "[0-9]*/[0-9]*/[0-9]*"`
errc=`expr "$2" : "[+-]*[0-9][0-9]*"`
test `expr $erra \* $errb \* $errc` -eq 0 && {
  echo "Usage $self $usage"
  exit 1
  }
echo "$1" "$2" |\
nawk '
BEGIN {
  datefmt="[0-9]+/[0-9]+/[0-9]"
  offsetfmt="[-+]*[0-9]+"
  }

function gday (y, m, d) {
  m =  ( m + 9 ) % 12                 # mar=0, feb=11
  y = y - int(m/10)           # if Jan/Feb, year--
  return y * 365 + int(y/4) - int(y/100) + int(y/400) + int(0.5 + m * 30.6) + (d - 1)
  }

function dtf(d) { # convert day number to y,m,d format
  yyyy = int((d + 1.4780)/365.2425)       # guess higher year first
  mar1 = gday(yyyy, 3, 1)
  ddd = (d >= mar1) ? d - mar1 : d - gday(--yyyy,3,1)
  mi = int( .017 + ddd / 30.6 )
  mm = ( mi + 2 ) % 12 + 1
  yyyy += int( (mi + 2) / 12 )
  dd= ddd - int( mi * 30.6 + 0.5) + 1
  return sprintf("%d/%02d/%02d", yyyy, mm, dd)
  }

#####   Main
{ split($1,d1,"/")
  gd1 = gday(d1[1],d1[2],d1[3])
  }
$2 ~ datefmt { 
  split($2,d2,"/")
  printf("%d\n", gday(d2[1],d2[2],d2[3]) - gd1)
  continue
  }
$2 ~ offsetfmt {
  printf("%s\n",dtf(gd1 + $2))
  continue
  }
'