'===========================================================================
' Subject: CALCULATES DAY OF THE WEEK         Date: Unknown Date           
'  Author: Garry Spencer                      Code: QB, QBasic, PDS        
'  Origin: gspencer@stim.tec.tn.us          Packet: DATETIME.ABC
'===========================================================================
'WEEKDAY.BAS - Function to calculate the day of the week when given the
'              date in integer form: Mon%, Day%, Year% (year: 1582 to 2450)
'              Note: Returns (0=Sunday...6=Saturday)  or -1 if an error occurs
'              Written by: Garry Spencer (gspencer@stim.tec.tn.us)

'To compile & link (stand-alone OBJ):       BC WEEKDAY;
 
'To add the WEEKDAY function to a library:  LIB libname +WEEKDAY;
 
'To compile a user program:                 BC progname/O;
'and add the WEEKDAY function to it:        LINK/EX progname WEEKDAY;
 
'To Use:
DECLARE FUNCTION WEEKDAY% (Mon%, Day%, Year%)   'do not use BYVAL
'Example:
CLS
PRINT : LOCATE 12, 12
INPUT ; "Enter date (mm,dd,yyyy): ", Mon%, Day%, Year%
DWeek% = WEEKDAY%(Mon%, Day%, Year%)
PRINT " is a ";

SELECT CASE DWeek%
    CASE 0
        PRINT "Sunday."
    CASE 1
        PRINT "Monday."
    CASE 2
        PRINT "Tuesday."
    CASE 3
        PRINT "Wednesday."
    CASE 4
        PRINT "Thursday."
    CASE 5
        PRINT "Friday."
    CASE 6
        PRINT "Saturday."
    CASE ELSE
        PRINT "Error"
    END SELECT

FUNCTION WEEKDAY% (Mon%, Day%, Year%)
DTmp% = 4: Days% = 0: Ofs% = 0: Leap% = 0: WEEKDAY% = -1
IF Year% < 1582 OR Year% > 2450 OR Mon% < 1 OR Mon% > 12 OR Day% < 1 THEN EXIT FUNCTION
FOR YTmp% = 1582 TO Year%
    DTmp% = (DTmp% + 1 + Leap%) MOD 7
        SELECT CASE 0
            CASE (YTmp% MOD 400)
                Leap% = 1
            CASE (YTmp% MOD 100)
                Leap% = 0
            CASE (YTmp% MOD 4)
                Leap% = 1
            CASE ELSE
                Leap% = 0
        END SELECT
NEXT YTmp%
FOR MTmp% = 1 TO Mon%: Ofs% = Ofs% + Days%
    SELECT CASE MTmp%
        CASE 1
            Days% = 31:
        CASE 2
            Days% = 28 + Leap%:
        CASE 3
            Days% = 31
        CASE 4
            Days% = 30:
        CASE 5
            Days% = 31:
        CASE 6
            Days% = 30
        CASE 7
            Days% = 31:
        CASE 8
            Days% = 31:
        CASE 9
            Days% = 30
        CASE 10
            Days% = 31
        CASE 11
            Days% = 30:
        CASE 12
            Days% = 31
    END SELECT
NEXT MTmp%
IF Day% <= Days% THEN WEEKDAY% = (DTmp% + Ofs% + Day% - 1) MOD 7
END FUNCTION

