displaydom_k93
#!/usr/bin/ksh93
################################################################
function usagemsg_displaydom_k93 {
print "
Program: displaydom_k93
This script examines a calendar for a specified month and year and
outputs a day of the month or a list of days of the month on which a
specified day of the week occurs. For example, this script will output
the dates for all of the Sundays in February 2006, or it can output the
date of the second Sunday in February 2006.
Usage: ${1##*/} [-?] [-v] [-V] [-d WeekdayNumber] [-m Month -y Year]
[-o Occurance] [-D Delimiter] [-F]
Where:
'-d' = Weekday number, i.e., 0=Sun, 1=Mon, 2=Tue,
3=Wed, 4=Thu, 5=Fri, 6=Sat
Default value is 0 representing Sunday.
'-m' = Two digit month number from 1 - 12,
1=January, 2=February, 3=March, etc.
Default value is current month.
'-y' = Four digit year number. If the year is specified
on the command line, the month must also be specified.
Default value is current year.
'-o' = Single digit number specifying occurance
of the weekday during the month, i.e., 1=first,
2=second, 3=third, 4=fourth, 5=fifth.
Default value is all occurances.
'-D' = Single character to use as field delimiter between
dates in output stream.
Default value is colon (:)
'-F' = Full date output in format YYYYMMDD.
Default format is DD.
'-v' = Verbose mode
'-V' = Very Verbose Mode
Example: displaydom_k93 -d 0 -m 2 -y 2006
Author: Dana French (dfrench@mtxia.com)
Copyright 2006 by Dana French
\"AutoContent\" enabled"
return 0
}
################################################################
function displaydom_k93
{
typeset TRUE="0"
typeset FALSE="1"
typeset VERBOSE="${FALSE}"
typeset VERYVERB="${FALSE}"
typeset DOW="0"
typeset MON=""
typeset YEAR=""
typeset ICNT="0"
typeset OCCUR=""
typeset FULL="${FALSE}"
typeset VERSION="1.0"
typeset DELIM=" "
typeset TMP=""
typeset Y=""
typeset M=""
DAYPOS=( 0 3 6 9 12 15 18 )
while getopts ":d#m#y#o#D:FvV" OPTION
do
case "${OPTION}" in
'd') DOW="${OPTARG}";;
'm') MON="${OPTARG}";;
'y') YEAR="${OPTARG}";;
'o') OCCUR="${OPTARG}";;
'F') M=$( date +"%m" )
Y=$( date +"%Y" )
FULL="${TRUE}";;
'D') DELIM="${OPTARG}";;
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
'?') usagemsg_displaydom_k93 "${0}" && return 1;;
':') usagemsg_displaydom_k93 "${0}" && return 1;;
'#') usagemsg_displaydom_k93 "${0}" && return 1;;
esac
done
shift $(( ${OPTIND} - 1 ))
(( VERBOSE == TRUE )) && print -u 2 -- "# displaydom Version.......: ${VERSION}"
trap "usagemsg_displaydom_k93 ${0}" EXIT
if [[ "_${DOW}" != "_" ]] && (( DOW < 0 )) || (( DOW > 6 ))
then
print -u 2 "# ERROR: Invalid day of the week specified, (valid values 0-6)"
return 2
fi
if [[ "_${MON}" != "_" ]] && (( MON < 1 )) || (( MON > 12 ))
then
print -u 2 "# ERROR: Invalid month number specified, (valid values 1-12)"
return 3
fi
if [[ "_${YEAR}" != "_" ]] && (( YEAR < 0 ))
then
print -u 2 "# ERROR: Invalid year number specified"
return 4
fi
if [[ "_${OCCUR}" != "_" ]] && (( OCCUR < 1 )) || (( OCCUR > 5 ))
then
print -u 2 "# ERROR: Invalid occurance number specified, (valid values 1-5)"
return 5
fi
if [[ "_${YEAR}" != "_" ]] && [[ "_${MON}" == "_" ]]
then
print -u 2 "# ERROR: Month must also be specified when specifying year."
return 6
fi
if [[ "_${MON}" != "_" ]] && [[ "_${YEAR}" == "_" ]]
then
print -u 2 "# ERROR: Year must also be specified when specifying month."
return 7
fi
trap "-" EXIT
(( VERYVERB == TRUE )) && set -x
################################################################
(( FULL == TRUE )) &&
typeset -Z2 M="${MON:-$( date +'%m' )}" &&
typeset -Z4 Y="${YEAR:-$( date +'%Y')}"
cal ${MON} ${YEAR} | while IFS='' read -r -- LINE
do
[[ "_${LINE}" == _*+([a-zA-Z])* ]] && continue
if [[ "_${OCCUR}" != "_" ]]
then
[[ "_${LINE:${DAYPOS[DOW]}:2}" == _+([ ]) ]] && continue
(( OCCUR != ++ICNT )) && continue
fi
typeset -Z2 VAL="${LINE:${DAYPOS[DOW]}:2}"
(( VERBOSE == TRUE )) && [[ "_${VAL# }" == _+([0-9]) ]] &&
print -u 2 -- "# Adding ${Y}${M}${VAL# } to list of dates"
[[ "_${VAL# }" == _+([0-9]) ]] && TMP="${TMP} ${Y}${M}${VAL# }"
done
set -- ${TMP}
IFS="${DELIM:0:1}"
[[ "_${*}" != "_" ]] && print "${*}"
return 0
}
################################################################
displaydom_k93 "${@}"