DECLARE FUNCTION dayno! (d!, m!, y!) DECLARE FUNCTION easter! (yr!) DECLARE FUNCTION fdate$ (day!, mon!) DECLARE FUNCTION fday$ (d!, m!, y!) DECLARE FUNCTION fdom! (day!, yr!) DECLARE FUNCTION fmon! (day!, yr!) DECLARE FUNCTION fwom! (d!) DECLARE FUNCTION fget$ () CLS DIM reader$(5, 0 TO 19), dayname$(0 TO 366), ed(19, 0 TO 6), numofreaders(5), omit(5), entries(0 TO 366, 5) INPUT "Enter the drive and directory name where the INI file is located (eg C:\ROTA): ", id$ id$ = id$ + "\" PRINT "Initialising..." iif$ = id$ + "rota.ini" OPEN iif$ FOR INPUT AS #2 fi$ = "" DO LINE INPUT #2, fi$ LOOP UNTIL fi$ = "[General]" OR EOF(2) yr = 0 nr = 0 DO IF NOT EOF(2) THEN LINE INPUT #2, fi$ IF UCASE$(LEFT$(fi$, 4)) = "YEAR" THEN yr = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) IF UCASE$(LEFT$(fi$, 5)) = "ROTAS" THEN nr = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) IF UCASE$(LEFT$(fi$, 6)) = "OUTPUT" THEN ofile$ = MID$(fi$, INSTR(fi$, "=") + 1) LOOP UNTIL LEFT$(fi$, 1) = "[" OR EOF(2) CLOSE #2 IF nr = 0 THEN PRINT "You must specify the number of concurrent rotas in the .ini file." PRINT "To do this, include a line starting Rotas= in the [General] section." END END IF IF nr > 5 THEN nr = 5 PRINT "Maximum of 5 rotas exceeded. Only the first five will be calculated." END IF IF yr = 0 THEN PRINT "Year not found under [General] in .ini file." INPUT "Enter the year: ", yr ELSE PRINT "Year found in .ini file:", yr END IF IF yr MOD 4 = 0 THEN leapyr = 1 ELSE leapyr = 0 FOR cr = 1 TO nr FOR cd = 0 TO 366 entries(cd, cr) = 1 NEXT NEXT REM Get readers' names FOR nrc = 1 TO nr OPEN iif$ FOR INPUT AS #2 fi$ = "" DO LINE INPUT #2, fi$ LOOP UNTIL fi$ = "[Rota" + STR$(nrc) + "]" OR EOF(2) IF EOF(2) THEN PRINT "You have not specified members of rota"; nrc PRINT "In the .ini file, for each rota, include a line [Rota N]," PRINT "where N is the rota number," PRINT "followed by lines Name=name for each rota member:" PRINT "eg" PRINT "[Rota 1]" PRINT "Name=John Smith" PRINT "Name=Barbara Smythe" END END IF rc = 0 DO IF NOT EOF(2) THEN LINE INPUT #2, fi$ IF UCASE$(LEFT$(fi$, 4)) = "NAME" THEN reader$(nrc, rc) = MID$(fi$, INSTR(fi$, "=") + 1) rc = rc + 1 END IF IF UCASE$(LEFT$(fi$, 4)) = "OMIT" THEN wkno = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) - 1 omit(nrc) = omit(nrc) + 2 ^ wkno END IF IF UCASE$(LEFT$(fi$, 7)) = "ENTRIES" THEN ne = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) FOR cd = 0 TO 366 entries(cd, nrc) = ne NEXT END IF LOOP UNTIL LEFT$(fi$, 1) = "[" OR EOF(2) OR rc = 20 CLOSE #2 numofreaders(nrc) = rc PRINT rc; "members of rota"; nrc; "found in .ini file" NEXT nrc REM Find Easter easterday = easter(yr) ashwed = easterday - 46 whitsun = easterday + 49 REM Calculate Sunday dates sunday1 = easterday WHILE sunday1 > 14 sunday1 = sunday1 - 7 WEND restart = easterday WHILE restart < 149 restart = restart + 7 WEND FOR sc = 9 TO 33 dayname$(restart - 63 + (sc * 7)) = "Sunday" + STR$(sc) NEXT dayname$(restart + 175) = "Christ the King" FOR sc = 1 TO 4 dayname$(restart + 175 + (sc * 7)) = "Sunday" + STR$(sc) + " of Advent" NEXT sundaylast = restart + 210 SELECT CASE sundaylast CASE 25 dayname$(sundaylast) = "Christmas Day: Morning" CASE ELSE dayname$(sundaylast) = "Holy Family" END SELECT dayname$(sunday1) = "Baptism of Our Lord" SELECT CASE sunday1 - 7 + leapyr CASE 6 dayname$(6) = "Epiphany" CASE 2 TO 5 dayname$(sunday1 - 7) = "Christmas 2" CASE 1 dayname$(1) = "Mary, Mother of God" END SELECT FOR sc = 2 TO 9 dayname$(sunday1 + (sc - 1) * 7) = "Sunday" + STR$(sc) NEXT dayname$(easterday) = "Easter Sunday" dayname$(easterday - 1) = "Easter Sunday: Vigil" dayname$(easterday - 2) = "Good Friday" dayname$(easterday - 3) = "Maundy Thursday" dayname$(easterday - 7) = "Palm Sunday" FOR sc = 5 TO 1 STEP -1 dayname$(easterday - 49 + (sc * 7)) = "Lent" + STR$(sc) NEXT dayname$(ashwed) = "Ash Wednesday" FOR sc = 2 TO 7 dayname$(easterday + (sc - 1) * 7) = "Sunday" + STR$(sc) + " of Easter" NEXT dayname$(easterday + 39) = "Ascension" dayname$(whitsun) = "Pentecost" dayname$(whitsun + 7) = "Trinity Sunday" dayname$(dayno(24, 12, yr)) = "Christmas Day: Midnight" dayname$(dayno(25, 12, yr)) = "Christmas Day" REM Check includes OPEN iif$ FOR INPUT AS #2 fi$ = "" DO LINE INPUT #2, fi$ LOOP UNTIL fi$ = "[Calendar]" OR EOF(2) DO IF NOT EOF(2) THEN LINE INPUT #2, fi$ IF UCASE$(LEFT$(fi$, 7)) = "INCLUDE" THEN n$ = MID$(fi$, INSTR(fi$, "=") + 1) IF n$ = "Corpus Christi" THEN dayname$(whitsun + 11) = n$ IF n$ = "Sacred Heart" THEN dayname$(whitsun + 19) = n$ END IF LOOP UNTIL LEFT$(fi$, 1) = "[" OR EOF(2) CLOSE #2 REM Add static dates from datalist OPEN iif$ FOR INPUT AS #2 fi$ = "" DO LINE INPUT #2, fi$ LOOP UNTIL fi$ = "[Calendar]" OR EOF(2) DO IF NOT EOF(2) THEN LINE INPUT #2, fi$ IF UCASE$(LEFT$(fi$, 5)) = "EXTRA" THEN day = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) mon = VAL(MID$(fi$, INSTR(fi$, "/") + 1)) n$ = MID$(fi$, INSTR(fi$, ",") + 1) cc = dayno(day, mon, yr) REM Handle transferences IF cc = ashwed THEN cc = cc - 1 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Ash Wednesday)" n$ = n$ + " (tr)" END IF IF cc = easterday - 14 OR cc = easterday - 21 OR cc = easterday - 28 OR cc = easterday - 35 OR cc = easterday - 42 THEN cc = cc - 1 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Sunday of Lent)" n$ = n$ + " (tr)" END IF IF cc > easterday - 8 AND cc < easterday + 1 THEN cc = easterday - 8 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Holy Week)" n$ = n$ + " (tr)" END IF IF cc > easterday AND cc < easterday + 8 THEN cc = easterday + 8 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Easter Week)" n$ = n$ + " (tr)" END IF IF cc = easterday + 14 OR cc = easterday + 21 OR cc = easterday + 28 OR cc = easterday + 35 OR cc = easterday + 42 OR cc = easterday + 49 OR cc = easterday + 56 THEN cc = cc - 1 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Sunday in Eastertide)" n$ = n$ + " (tr)" END IF IF cc = easterday + 39 THEN cc = cc + 1 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Ascension)" n$ = n$ + " (tr)" END IF IF cc = restart + 182 OR cc = restart + 189 OR cc = restart + 196 OR cc = restart + 203 THEN cc = cc - 1 PRINT n$; " has been transferred to "; fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); " (Sunday of Advent)" n$ = n$ + " (tr)" END IF dayname$(cc) = n$ END IF IF UCASE$(LEFT$(fi$, 7)) = "ENTRIES" THEN ne = VAL(MID$(fi$, INSTR(fi$, "=") + 1)) rn = VAL(MID$(fi$, INSTR(fi$, ",") + 1)) n$ = MID$(fi$, INSTR(INSTR(fi$, ",") + 1, fi$, ",") + 1) FOR dc = 0 TO 366 IF dayname$(dc) = n$ THEN entries(dc, rn) = ne END IF NEXT END IF LOOP UNTIL LEFT$(fi$, 1) = "[" OR EOF(2) CLOSE #2 IF ofile$ <> "" THEN PRINT "Output written to: "; ofile$ ELSE INPUT "Output filename? ", ofile$ IF ofile$ = "" THEN END END IF OPEN "o", 1, ofile$ FOR cc = 0 TO 366 IF dayname$(cc) <> "" THEN PRINT #1, dayname$(cc); CHR$(9); fday$(fdom(cc, yr), fmon(cc, yr), yr); fdate$(fdom(cc, yr), fmon(cc, yr)); CHR$(9); FOR nrc2 = 1 TO nr - 1 FOR nrc = nrc2 + 1 TO nr FOR ec2 = 0 TO entries(cc, nrc2) - 1 FOR ec1 = 0 TO entries(cc, nrc) - 1 IF reader$(nrc2, (cr(nrc2) + ec2) MOD numofreaders(nrc2)) = reader$(nrc, (cr(nrc) + ec1) MOD numofreaders(nrc)) AND INSTR(reader$(nrc2, (cr(nrc2) + ec2) MOD numofreaders(nrc2)), "*") = 0 THEN cr(nrc) = cr(nrc) + 1 END IF NEXT ec1 NEXT ec2 NEXT nrc NEXT nrc2 FOR nrc = 1 TO nr wkno = fwom(fdom(cc, yr)) IF fday$(fdom(cc, yr), fmon(cc, yr), yr) = "Sunday" THEN IF (omit(nrc) AND (2 ^ (wkno - 1))) THEN PRINT #1, CHR$(9); ELSE FOR ec = 1 TO entries(cc, nrc) r$ = reader$(nrc, cr(nrc) MOD numofreaders(nrc)) r1$ = MID$(r$, INSTR(r$, "*") + 1) PRINT #1, r1$; CHR$(9); cr(nrc) = cr(nrc) + 1 NEXT END IF ELSE FOR ec = 1 TO entries(cc, nrc) r$ = reader$(nrc, cr(nrc) MOD numofreaders(nrc)) r1$ = MID$(r$, INSTR(r$, "*") + 1) PRINT #1, r1$; CHR$(9); cr(nrc) = cr(nrc) + 1 NEXT END IF NEXT nrc PRINT #1, "" END IF NEXT cc END Edata: DATA 106,107,108,109,110,111,105 DATA 099,100,094,095,096,097,098 DATA 085,086,087,088,089,083,084 DATA 106,107,108,102,103,104,105 DATA 092,093,094,095,096,097,091 DATA 113,114,115,109,110,111,112 DATA 099,100,101,102,103,104,105 DATA 092,093,094,088,089,090,091 DATA 113,107,108,109,110,111,112 DATA 099,100,101,102,096,097,098 DATA 085,086,087,088,089,090,091 DATA 106,107,108,109,110,104,105 DATA 099,093,094,095,096,097,098 DATA 085,086,087,088,082,083,084 DATA 106,107,101,102,103,104,105 DATA 092,093,094,095,096,090,091 DATA 113,114,108,109,110,111,112 DATA 099,100,101,102,103,104,098 DATA 092,093,087,088,089,090,091 FUNCTION dayno (d, m, y) SELECT CASE m CASE 1 n = d CASE 2 n = d + 31 CASE 3 n = d + 59 CASE 4 n = d + 90 CASE 5 n = d + 120 CASE 6 n = d + 151 CASE 7 n = d + 181 CASE 8 n = d + 212 CASE 9 n = d + 243 CASE 10 n = d + 273 CASE 11 n = d + 304 CASE 12 n = d + 334 END SELECT IF y MOD 4 = 0 THEN leap = 1 IF m < 3 THEN dayno = n - leap ELSE dayno = n END FUNCTION FUNCTION easter (yr) DIM ed(19, 0 TO 6) gn = (yr + 1) MOD 19 IF gn = 0 THEN gn = 19 d1 = (INT(yr * 1.25) + 6) MOD 7 d = (7 - d1) MOD 7 RESTORE Edata FOR gnc = 1 TO 19 FOR slc = 0 TO 6 READ ed(gnc, slc) NEXT NEXT easter = ed(gn, d) END FUNCTION FUNCTION fdate$ (day, mon) SELECT CASE mon CASE 1 fdate$ = STR$(day) + " January" CASE 2 fdate$ = STR$(day) + " February" CASE 3 fdate$ = STR$(day) + " March" CASE 4 fdate$ = STR$(day) + " April" CASE 5 fdate$ = STR$(day) + " May" CASE 6 fdate$ = STR$(day) + " June" CASE 7 fdate$ = STR$(day) + " July" CASE 8 fdate$ = STR$(day) + " August" CASE 9 fdate$ = STR$(day) + " September" CASE 10 fdate$ = STR$(day) + " October" CASE 11 fdate$ = STR$(day) + " November" CASE 12 fdate$ = STR$(day) + " December" CASE ELSE fdate$ = "DATE ERROR" END SELECT END FUNCTION FUNCTION fday$ (d, m, y) yr = yr - 1900 IF m < 3 THEN mflag = -1 ELSE mflag = 0 p1 = d p2 = INT(((((m + 9) MOD 12) * 153) + 2) / 5) p3 = INT((y + mflag) * 1461 / 4) p4 = (INT((y + mflag) / 100) + 1) * 3 p5 = INT(p4 / 4) jul = p1 + p2 + p3 - p5 day = (jul + 2) MOD 7 SELECT CASE day CASE 0 fday$ = "Sunday" CASE 1 fday$ = "Monday" CASE 2 fday$ = "Tuesday" CASE 3 fday$ = "Wednesday" CASE 4 fday$ = "Thursday" CASE 5 fday$ = "Friday" CASE 6 fday$ = "Saturday" CASE ELSE fday$ = "DAY ERROR" END SELECT END FUNCTION FUNCTION fdom (day, yr) IF yr MOD 4 = 0 THEN leap = 1 ELSE leap = 0 SELECT CASE day CASE IS < 32 REM January fdom = day + leap CASE IS < 60 REM February fdom = day - 31 + leap CASE IS < 91 REM March fdom = day - 59 CASE IS < 121 REM April fdom = day - 90 CASE IS < 152 REM May fdom = day - 120 CASE IS < 182 REM June fdom = day - 151 CASE IS < 213 REM July fdom = day - 181 CASE IS < 244 REM August fdom = day - 212 CASE IS < 274 REM September fdom = day - 243 CASE IS < 305 REM October fdom = day - 273 CASE IS < 335 REM November fdom = day - 304 CASE ELSE REM December fdom = day - 334 END SELECT END FUNCTION FUNCTION fget$ WHILE a$ = "" a$ = INKEY$ WEND fget$ = a$ END FUNCTION FUNCTION fmon (day, yr) IF yr MOD 4 = 0 THEN leap = 1 ELSE leap = 0 SELECT CASE day + leap CASE IS < 32 REM January fmon = 1 CASE IS < 60 REM February fmon = 2 CASE IS < 91 REM March fmon = 3 CASE IS < 121 REM April fmon = 4 CASE IS < 152 REM May fmon = 5 CASE IS < 182 REM June fmon = 6 CASE IS < 213 REM July fmon = 7 CASE IS < 244 REM August fmon = 8 CASE IS < 274 REM September fmon = 9 CASE IS < 305 REM October fmon = 10 CASE IS < 335 REM November fmon = 11 CASE ELSE REM December fmon = 12 END SELECT END FUNCTION FUNCTION fwom (d) SELECT CASE d CASE IS < 8 fwom = 1 CASE IS < 15 fwom = 2 CASE IS < 22 fwom = 3 CASE IS < 29 fwom = 4 CASE ELSE fwom = 5 END SELECT END FUNCTION