10 ! ----- MONDAYS_DATE_AS_MMDDYY.FUN ----- ! ! ----- Returns the nearest Monday's date as a 6-character MMDDYY ----- ! ----- string, where the week is divided at 1:00PM on Wednesday ----- ! ----- (Returns Blank string if any Error occurs) ----- ! ! ----- Algorithm Used: If current Day of Week is on or after ----- ! ----- Wednesday 13:00:00 and is on or before Monday 23:59:59, ----- ! ----- Return the Next/Current Monday's date, otherwise, return ----- ! ----- the Previous Monday's date ----- ! ! ----- Last Change 05/01/89 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA 02111 ----- ! ----- (617) 482-2706, x3259 ----- ! ! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or ----- ! ----- explicitly implies this program is usable in any way. ----- ! ----- This program is released to the public domain in an ----- ! ----- "AS-IS" condition. ----- ! ! ----- Restrictions: ----- ! ----- 1) Requires VAX BASIC V2.4 or later. ----- ! FUNCTION STRING MONDAYS_DATE_AS_MMDDYY OPTION TYPE = EXPLICIT ! ENSURE ALL VARIABLES DECLARED %LET %DEBUG = 0% ! 1 IF DEBUG MODE, 0 IF NOT ! ----- VMS SYSTEM SERVICE ERROR STATUS VALUES ----- EXTERNAL LONG CONSTANT SS$_NORMAL ! NORMAL EXIT STATUS ! ----- VARIABLE DECLARATIONS ----- DECLARE LONG CURRENT_DOW ! CURRENT DATE'S DAY OF WEEK DECLARE WORD OFFSET_DAYS ! DAYS TO OFFSET TO A MONDAY DECLARE LONG SYS_STATUS ! SYSTEM SERVICE EXIT STATUS DECLARE STRING TEMP_STRING ! TEMPORARY STRING DECLARE LONG THE_OFFSET ! POSITIVE OFFSET VALUE MAP (MONCUR) & LONG CLUNK_DATE(1%), ! INTERNAL CLUNKS DATE & LONG OFFSET_DAYS(1%), ! OFFSET NUMBER OF DAYS & STRING DAYS_IN_MONTH = 2%, ! MAX DAYS IN MONTH & STRING TIME_STRING = 23% ! TIME TO/FROM $ASCTIM/$BINTIM ! ----- EXTERNAL FUNCTION DECLARATIONS ----- EXTERNAL LONG FUNCTION LIB$ADDX ! MULTIPLE-PRECISION ADDITION EXTERNAL LONG FUNCTION SYS$ASCTIM ! CONVERT QUAD-WORD TO ASCII EXTERNAL LONG FUNCTION SYS$BINTIM ! CONVERT ASCII TO QUAD-WORD EXTERNAL LONG FUNCTION LIB$DATE_TIME ! GET CURRENT DATE/TIME EXTERNAL LONG FUNCTION LIB$DAY_OF_WEEK ! GET NUMERIC DAY OF WEEK EXTERNAL LONG FUNCTION LIB$SUBX ! MULTIPLE-PRECISION SUBTRACTION ! ----- GET CURRENT DATE AND TIME AS ASCII STRING ----- ! ----- (dd-mmm-yyyy hh:mm:ss.cc) ----- SYS_STATUS = LIB$DATE_TIME(TIME_STRING) IF SYS_STATUS <> SS$_NORMAL THEN MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF %IF %DEBUG = 1% %THEN PRINT "MONDAYS_DATE_AS_MMDDYY DEBUG>TIME_STRING="; TIME_STRING %END %IF ! ----- CONVERT ASCII STRING (dd-mmm-yyyy hh:mm:ss.cc) TO CLUNKS ----- SYS_STATUS = SYS$BINTIM(TIME_STRING, CLUNK_DATE() BY REF) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF ! ----- GET NUMERIC DAY OF WEEK FROM CLUNK DATE ----- SYS_STATUS = LIB$DAY_OF_WEEK(CLUNK_DATE() BY REF, CURRENT_DOW BY REF) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF %IF %DEBUG = 1% %THEN PRINT "MONDAYS_DATE_AS_MMDDYY DEBUG>CURRENT_DOW="; CURRENT_DOW %END %IF ! ----- IF CURRENT DAY OF WEEK IS AFTER WEDNESDAY NOON AND IS ON ----- ! ----- OR BEFORE MONDAY 23:59:59, RETURN THE NEXT/CURRENT ----- ! ----- MONDAY'S DATE, OTHERWISE, RETURN THE PREVIOUS MONDAY'S DATE ---- SELECT CURRENT_DOW CASE 1% ! MONDAY OFFSET_DAYS = 0% ! RETURN CURRENT DATE THE_OFFSET = 0% ! STORE NON-NEGATIVE OFFSET CASE 2% ! TUESDAY OFFSET_DAYS = -1% ! RETURN 1 DAY IN PAST THE_OFFSET = 1% ! STORE NON-NEGATIVE OFFSET CASE 3% ! WEDNESDAY ! ----- SEE IF CURRENT TIME IS AFTER 12 NOON ----- IF MID(TIME_STRING, 13%, 2%) > "12" THEN OFFSET_DAYS = 5% ! RETURN 5 DAYS IN FUTURE THE_OFFSET = 5% ! STORE NON-NEGATIVE OFFSET ELSE OFFSET_DAYS = -2% ! RETURN 2 DAYS IN PAST THE_OFFSET = 2% ! STORE NON-NEGATIVE OFFSET END IF CASE 4% ! THURSDAY OFFSET_DAYS = 4% ! RETURN 4 DAYS IN FUTURE THE_OFFSET = 4% ! STORE NON-NEGATIVE OFFSET CASE 5% ! FRIDAY OFFSET_DAYS = 3% ! RETURN 3 DAYS IN FUTURE THE_OFFSET = 3% ! STORE NON-NEGATIVE OFFSET CASE 6% ! SATURDAY OFFSET_DAYS = 2% ! RETURN 2 DAYS IN FUTURE THE_OFFSET = 2% ! STORE NON-NEGATIVE OFFSET CASE 7% ! SUNDAY OFFSET_DAYS = 1% ! RETURN 1 DAY IN FUTURE THE_OFFSET = 1% ! STORE NON-NEGATIVE OFFSET CASE ELSE MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END SELECT ! ----- CONVERT OFFSET NUMBER OF DAYS TO CLUNKS ----- TIME_STRING = NUM1$(THE_OFFSET) + " 00:00:00.00" SYS_STATUS = SYS$BINTIM(TIME_STRING, OFFSET_DAYS() BY REF) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF IF OFFSET_DAYS < 0% THEN ! IF NEGATIVE OFFSET: ! ----- SUBTRACT OFFSET NUMBER OF DAYS FROM CLUNK DATE ----- ! ----- (THIS IS DONE BY ADDING THE NEGATIVE DELTA DATE ----- ! ----- TO THE INTERNAL DATE) ----- SYS_STATUS = LIB$ADDX(CLUNK_DATE() BY REF, & OFFSET_DAYS() BY REF, CLUNK_DATE() BY REF) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN ! ----- RETURN STRING INDICATING ERROR ----- MONDAYS_DATE_AS_MMDDYY = "" EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF ELSE ! IF POSITIVE OR ZERO OFFSET: IF OFFSET_DAYS > 0% THEN ! IF POSITIVE OFFSET: ! ----- ADD OFFSET NUMBER OF DAYS TO CLUNK DATE ----- ! ----- (THIS IS DONE BY SUBTRACTING THE NEGATIVE ----- ! ----- DELTA DATE FROM THE INTERNAL DATE) ----- SYS_STATUS = LIB$SUBX(CLUNK_DATE() BY REF, & OFFSET_DAYS() BY REF, CLUNK_DATE() BY REF) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN ! ----- RETURN STRING INDICATING ERROR ----- MONDAYS_DATE_AS_MMDDYY = "" EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF END IF END IF ! ----- CONVERT CLUNKS BACK TO ASCII STRING ----- ! ----- (dd-mmm-yyyy hh:mm:ss.cc) (RJLB) ----- SYS_STATUS = SYS$ASCTIM(, TIME_STRING, CLUNK_DATE() BY REF, ) IF (SYS_STATUS AND 1%) <> SS$_NORMAL THEN MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END IF %IF %DEBUG = 1% %THEN PRINT "MONDAYS_DATE_AS_MMDDYY DEBUG>TIME_STRING="; TIME_STRING %END %IF ! ----- CONVERT ASCII STRING BACK TO RETURNED DATE (MMDDYY) ----- SELECT MID(TIME_STRING, 4%, 3%) CASE "JAN" TEMP_STRING = "01" CASE "FEB" TEMP_STRING = "02" CASE "MAR" TEMP_STRING = "03" CASE "APR" TEMP_STRING = "04" CASE "MAY" TEMP_STRING = "05" CASE "JUN" TEMP_STRING = "06" CASE "JUL" TEMP_STRING = "07" CASE "AUG" TEMP_STRING = "08" CASE "SEP" TEMP_STRING = "09" CASE "OCT" TEMP_STRING = "10" CASE "NOV" TEMP_STRING = "11" CASE "DEC" TEMP_STRING = "12" CASE ELSE MONDAYS_DATE_AS_MMDDYY = "" ! RETURN STRING INDICATING ERROR EXIT FUNCTION ! EXIT WITH ERROR STATUS END SELECT IF LEFT(TIME_STRING, 1%) = " " THEN MONDAYS_DATE_AS_MMDDYY = TEMP_STRING + "0" + & MID(TIME_STRING, 2%, 1%) + MID(TIME_STRING, 10%, 2%) ELSE MONDAYS_DATE_AS_MMDDYY = TEMP_STRING + & LEFT(TIME_STRING, 2%) + MID(TIME_STRING, 10%, 2%) END IF END FUNCTION