'=========================================================================== ' Subject: A PERPETUAL CALENDAR Date: 05/15/94 (00:00) ' Author: The ABC Programmer Code: QB, QBasic, PDS ' Keys: PERPETUAL,CALENDAR Packet: DATETIME.ABC '=========================================================================== DECLARE FUNCTION MonthDays% (monthNum%, year%) DECLARE SUB ClearBuffer () DECLARE SUB ShowSchedule () DECLARE SUB CenterMessage (Info$, LineNum%, Colour%) DECLARE SUB ShowMonth (Month%, day%, year%) DECLARE FUNCTION DayNum% (Month%, day%, year%) DECLARE FUNCTION DateNum& (Month%, day%, year%) DECLARE FUNCTION LeapYear% (year%) DECLARE FUNCTION MonthName$ (monthNum%) DECLARE FUNCTION MonthDay% (Month%, year%) CONST MAXYEAR% = 2100 CONST MINYEAR% = 1950 CONST FALSE% = 0 CONST TRUE% = NOT FALSE% curMonth% = VAL(LEFT$(DATE$, 2)) curDay% = VAL(MID$(DATE$, 4, 2)) curYear% = VAL(RIGHT$(DATE$, 4)) CLS ShowMonth curMonth%, curDay%, curYear% CALL ShowSchedule GOSUB ShowNotes SelectMonth: V$ = INKEY$ IF V$ = CHR$(0) + "H" THEN GOSUB PreviousWeek IF V$ = CHR$(0) + "P" THEN GOSUB NextWeek IF V$ = CHR$(0) + "K" THEN GOSUB PreviousDay IF V$ = CHR$(0) + "M" THEN GOSUB NextDay IF V$ = CHR$(0) + "Q" THEN GOSUB NextMonth IF V$ = CHR$(0) + "I" THEN GOSUB PreviousMonth IF V$ = CHR$(13) THEN GOTO CallCalendar IF V$ = CHR$(27) THEN GOTO QuitProgram done% = FALSE% makeCall% = FALSE% GOTO SelectMonth CallCalendar: ComLine$ = STR$(curMonth%) + "/" ComLine$ = ComLine$ + STR$(curDay%) + "/" ComLine$ = ComLine$ + STR$(curYear%) OPEN "SCHEDULE.DAT" FOR INPUT AS #1 DO LINE INPUT #1, DAT$ IF INSTR(DAT$, ComLine$) > 0 THEN GOSUB DisplaySchedule: EXIT DO ELSE GOSUB InputSchedule: EXIT DO END IF LOOP UNTIL EOF(1) CLOSE #1 ShowMonth curMonth%, curDay%, curYear% GOTO SelectMonth PreviousDay: IF curDay% > 1 THEN curDay% = curDay% - 1 ELSEIF curMonth% > 1 THEN curMonth% = curMonth% - 1 curDay% = MonthDays%(curMonth%, curYear%) VIEW PRINT 1 TO 11 CLS GOSUB ShowNotes ELSE curYear% = curYear% - 1 curMonth% = 12 curDay% = 31 END IF ShowMonth curMonth%, curDay%, curYear% RETURN NextDay: IF curDay% < MonthDays%(curMonth%, curYear%) THEN curDay% = curDay% + 1 ELSEIF curMonth% <> 12 THEN curDay% = 1 curMonth% = curMonth% + 1 VIEW PRINT 1 TO 11 CLS GOSUB ShowNotes ELSE curDay% = 1 curMonth% = 1 curYear% = curYear% + 1 END IF ShowMonth curMonth%, curDay%, curYear% RETURN PreviousWeek: IF curDay% > 7 THEN curDay% = curDay% - 7 ShowMonth curMonth%, curDay%, curYear% END IF RETURN NextWeek: IF curDay% <= MonthDays%(curMonth%, curYear%) - 7 THEN curDay% = curDay% + 7 ShowMonth curMonth%, curDay%, curYear% END IF RETURN PreviousMonth: IF curMonth% > 1 THEN curMonth% = curMonth% - 1 ELSEIF curYear% > MINYEAR% THEN curYear% = curYear% - 1 curMonth% = 12 END IF maxDay% = MonthDays%(curMonth%, curYear%) IF curDay% > maxDay% THEN curDay% = maxDay% VIEW PRINT 1 TO 11 CLS ShowMonth curMonth%, curDay%, curYear% GOSUB ShowNotes RETURN NextMonth: IF curMonth% < 12 THEN curMonth% = curMonth% + 1 ELSEIF curYear% < MAXYEAR% THEN curYear% = curYear% + 1 curMonth% = 1 END IF maxDay% = MonthDays%(curMonth%, curYear%) IF curDay% > maxDay% THEN curDay% = maxDay% VIEW PRINT 1 TO 11 CLS ShowMonth curMonth%, curDay%, curYear% GOSUB ShowNotes RETURN PreviousYear: IF curYear% > MINTEAR% THEN curYear% = curYear% - 1 maxDay% = MonthDays%(curMonth%, curYear%) IF curDay% > maxDay% THEN curDay% = maxDay% ShowMonth curMonth%, curDay%, curYear% END IF RETURN NextYear: IF curYear% < MAXYEAR% THEN curYear% = curYear% + 1 maxDay% = MonthDays%(curMonth%, curYear%) IF curDay% > maxDay% THEN curDay% = maxDay% ShowMonth curMonth%, curDay%, curYear% END IF RETURN DisplaySchedule: INPUT #1, Info1$, Info2$, Info3$ VIEW PRINT 12 TO 23 IF curMonth% = 1 THEN curMonth$ = " January" IF curMonth% = 2 THEN curMonth$ = " February" IF curMonth% = 3 THEN curMonth$ = " March" IF curMonth% = 4 THEN curMonth$ = " April" IF curMonth% = 5 THEN curMonth$ = " May" IF curMonth% = 6 THEN curMonth$ = " June" IF curMonth% = 7 THEN curMonth$ = " July" IF curMonth% = 8 THEN curMonth$ = " August" IF curMonth% = 9 THEN curMonth$ = " September" IF curMonth% = 10 THEN curMonth$ = " October" IF curMonth% = 11 THEN curMonth$ = " November" IF curMonth% = 12 THEN curMonth$ = " December" LOCATE 17, 5: COLOR 14: PRINT curMonth$; curDay%; curYear% CALL CenterMessage(Info1$, 19, 15) CALL CenterMessage(Info2$, 20, 7) CALL CenterMessage(Info3$, 21, 7) VIEW PRINT 1 TO 11 RETURN ShowNotes: VIEW PRINT 13 TO 15 LOCATE 14, 3: COLOR 7: PRINT "Notes:" COLOR 10 currentDay% = curDay% GOSUB NextCurDay M = 7 OPEN "SCHEDULE.DAT" FOR INPUT AS #1 DO LINE INPUT #1, DAT$ IF INSTR(DAT$, ComLine$) THEN M = M + 2: LOCATE 14, M: PRINT currentDay%: currentDay% = currentDay% + 1: GOSUB NextCurDay LOOP UNTIL EOF(1) CLOSE #1 VIEW PRINT 1 TO 11 RETURN NextCurDay: ComLine$ = STR$(curMonth%) + "/" ComLine$ = ComLine$ + STR$(currentDay%) + "/" ComLine$ = ComLine$ + STR$(curYear%) RETURN InputSchedule: RETURN QuitProgram: done% = TRUE% SUB CenterMessage (Info$, LineNum%, Colour%) LOCATE LineNum%, 15 LOCATE LineNum%, INT((80 - LEN(Info$)) / 2) COLOR Colour%, 0 PRINT LEFT$(Info$, 77) END SUB SUB ClearBuffer DO WHILE INKEY$ <> "" LOOP END SUB FUNCTION DateNum& (Month%, day%, year%) startYear% = 1900 january% = 1 daysPerYr& = 365 tooEarly% = (year% < startYear%) badMonth% = (Month% < 1 OR Month% > 12) badDay% = (day% < 1 OR day% > MonthDays%(Month%, year%)) IF tooEarly% OR badMonth% OR badDay% THEN DateNum& = 0 EXIT FUNCTION END IF num& = daysPerYr& * (year% - startYear%) FOR curYear% = startYear% TO year% - 1 STEP 4 IF LeapYear%(curYear%) THEN num& = num& + 1 NEXT curYear% FOR curMonth% = january% TO Month% - 1 num& = num& + MonthDays%(curMonth%, year%) NEXT curMonth% num& = num& + day% DateNum& = num& END FUNCTION FUNCTION DayNum% (Month%, day%, year%) d& = DateNum&(Month%, day%, year%) IF d& <> 0 THEN dow% = d& MOD 7 + 1 ELSE dow% = 0 DayNum% = dow% END FUNCTION FUNCTION LeapYear% (year%) divBy4% = (year% MOD 4 = 0) century% = (year% MOD 100 = 0) century400% = (year% MOD 400 = 0) LeapYear% = divBy4% AND (century% IMP century400%) END FUNCTION FUNCTION MonthDays% (monthNum%, year%) IF monthNum% < 1 OR monthNum% > 12 THEN MonthDays% = 0 EXIT FUNCTION END IF SELECT CASE monthNum% CASE 2 days% = 28 IF LeapYear%(year%) THEN days% = days% + 1 CASE 4, 6, 9, 11 days% = 30 CASE ELSE days% = 31 END SELECT MonthDays% = days% END FUNCTION FUNCTION MonthName$ (monthNum%) M$ = "January February March April " M$ = M$ + "May June July August " M$ = M$ + "September October Novemeber December " IF monthNum% >= 1 AND monthNum% <= 12 THEN moStr$ = MID$(M$, (monthNum% - 1) * 10 + 1, 10) moStr$ = RTRIM$(moStr$) ELSE moStr$ = "" END IF MonthName$ = moStr$ END FUNCTION SUB ShowMonth (Month%, day%, year%) firstDay% = DayNum%(Month%, 1, year%) monthLength% = MonthDays%(Month%, year%) moStr$ = MonthName$(Month%) LOCATE 1, 1 COLOR 14, 0: PRINT SPACE$(35 - LEN(moStr$) \ 2); moStr$; year% PRINT COLOR 15 PRINT " Sunday Monday Tuesday Wednesday Thursday Friday Saturday" PRINT COLOR 7 curDate% = 0 DO PRINT " "; FOR curDay% = 1 TO 7 isFirstDay% = (curDay% = firstDay% AND curDate% = 0) isInMonth% = (curDate% > 0 AND curDate% < monthLength%) IF isFirstDay% OR isInMonth% THEN curDate% = curDate% + 1 IF curDate% = day% THEN COLOR 15, 1 PRINT USING "###"; curDate%; PRINT " "; COLOR 7, 0 ELSE PRINT " "; END IF NEXT curDay% PRINT LOOP UNTIL curDate% = monthLength% END SUB SUB ShowSchedule VIEW PRINT 12 TO 24 COLOR 11 LOCATE 13, 1: PRINT CHR$(218); STRING$(77, 196); CHR$(191) LOCATE 14, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 15, 1: PRINT CHR$(192); STRING$(77, 196); CHR$(217) LOCATE 17, 1: PRINT CHR$(218); STRING$(77, 196); CHR$(191) LOCATE 18, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 19, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 20, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 21, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 22, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179) LOCATE 23, 1: PRINT CHR$(192); STRING$(77, 196); CHR$(217) VIEW PRINT 1 TO 11 END SUB --------------[ Cut and save this as SCHEDULE.DAT ]----------------- 8/ 28/ 1995 "This is the Schedule.Dat file","To save notes press enter on any day","Enjoy!"