|
| 1 | + IDENTIFICATION DIVISION. |
| 2 | + PROGRAM-ID. MEETUP. |
| 3 | + AUTHOR. kapitaali. |
| 4 | + ENVIRONMENT DIVISION. |
| 5 | + DATA DIVISION. |
| 6 | + WORKING-STORAGE SECTION. |
| 7 | + 01 WS-YEAR PIC 9999. |
| 8 | + 01 WS-MONTH PIC 99. |
| 9 | + 01 WS-WEEK PIC X(10). |
| 10 | + 01 WS-DAYOFWEEK PIC X(10). |
| 11 | + 01 WS-RESULT PIC X(40). |
| 12 | + 01 WEEKDAY PIC X(10). |
| 13 | + 01 MY-DATE PIC 9(8). |
| 14 | + 01 SOME-FLD PIC 9999. |
| 15 | + 01 MY-REM PIC 9999. |
| 16 | + 01 ITER PIC 99. |
| 17 | + 01 NO-OF-WDS PIC 9. |
| 18 | + 01 LEAP-YEAR PIC 9. |
| 19 | + |
| 20 | + 01 Weekdaytable. |
| 21 | + 02 WEEKDAYS-T PIC 99 OCCURS 6 TIMES. |
| 22 | + |
| 23 | + |
| 24 | + PROCEDURE DIVISION. |
| 25 | + |
| 26 | + |
| 27 | + GET-WEEKDAY. |
| 28 | + DIVIDE FUNCTION INTEGER-OF-DATE(MY-DATE) BY 7 |
| 29 | + GIVING SOME-FLD REMAINDER MY-REM. |
| 30 | + EVALUATE MY-REM |
| 31 | + WHEN 0 MOVE 'Sunday' TO WEEKDAY |
| 32 | + WHEN 1 MOVE 'Monday' TO WEEKDAY |
| 33 | + WHEN 2 MOVE 'Tuesday' TO WEEKDAY |
| 34 | + WHEN 3 MOVE 'Wednesday' TO WEEKDAY |
| 35 | + WHEN 4 MOVE 'Thursday' TO WEEKDAY |
| 36 | + WHEN 5 MOVE 'Friday' TO WEEKDAY |
| 37 | + WHEN 6 MOVE 'Saturday' TO WEEKDAY |
| 38 | + END-EVALUATE. |
| 39 | + |
| 40 | + |
| 41 | + MEETUP. |
| 42 | + INITIALIZE Weekdaytable. |
| 43 | + MOVE ZEROES TO Weekdaytable. |
| 44 | + PERFORM FIND-WEEKDAYS. |
| 45 | + MOVE MY-DATE(1:4) TO WS-RESULT(1:4) |
| 46 | + MOVE '-' TO WS-RESULT(5:1) |
| 47 | + MOVE MY-DATE(5:2) TO WS-RESULT(6:2) |
| 48 | + MOVE '-' TO WS-RESULT(8:1) |
| 49 | + EVALUATE WS-WEEK |
| 50 | + WHEN "first" |
| 51 | + MOVE WEEKDAYS-T(1) TO WS-RESULT(9:2) |
| 52 | + WHEN "second" |
| 53 | + MOVE WEEKDAYS-T(2) TO WS-RESULT(9:2) |
| 54 | + WHEN "third" |
| 55 | + MOVE WEEKDAYS-T(3) TO WS-RESULT(9:2) |
| 56 | + WHEN "fourth" |
| 57 | + MOVE WEEKDAYS-T(4) TO WS-RESULT(9:2) |
| 58 | + WHEN "teenth" |
| 59 | + MOVE WEEKDAYS-T(6) TO WS-RESULT(9:2) |
| 60 | + WHEN "last" |
| 61 | + MOVE 0 TO LEAP-YEAR |
| 62 | + PERFORM IS-IT-LEAP-YEAR |
| 63 | + MOVE WEEKDAYS-T(5) TO ITER |
| 64 | + MOVE ITER TO WS-RESULT(9:2) |
| 65 | + IF ITER = 0 OR ITER > 31 |
| 66 | + MOVE WEEKDAYS-T(4) TO WS-RESULT(9:2) |
| 67 | + END-IF |
| 68 | + IF WS-MONTH = 2 AND LEAP-YEAR = 1 AND ITER > 29 |
| 69 | + MOVE WEEKDAYS-T(4) TO WS-RESULT(9:2) |
| 70 | + END-IF |
| 71 | + IF WS-MONTH = 2 AND LEAP-YEAR = 0 AND ITER > 28 |
| 72 | + MOVE WEEKDAYS-T(4) TO WS-RESULT(9:2) |
| 73 | + END-IF |
| 74 | + IF WS-MONTH = 4 AND LEAP-YEAR = 0 AND ITER > 30 |
| 75 | + MOVE WEEKDAYS-T(4) TO WS-RESULT(9:2) |
| 76 | + END-IF |
| 77 | + END-EVALUATE. |
| 78 | + |
| 79 | + |
| 80 | + IS-IT-LEAP-YEAR. |
| 81 | + * on every year that is evenly divisible by 4 |
| 82 | + IF FUNCTION MOD(WS-YEAR, 4) = 0 |
| 83 | + * except every year that is evenly divisible by 100 |
| 84 | + IF FUNCTION MOD(WS-YEAR, 100) = 0 |
| 85 | + * unless the year is also evenly divisible by 400 |
| 86 | + IF FUNCTION MOD(WS-YEAR, 400) = 0 |
| 87 | + MOVE 1 TO LEAP-YEAR |
| 88 | + EXIT PARAGRAPH |
| 89 | + ELSE |
| 90 | + MOVE 0 TO LEAP-YEAR |
| 91 | + EXIT PARAGRAPH |
| 92 | + END-IF |
| 93 | + MOVE 0 TO LEAP-YEAR |
| 94 | + EXIT PARAGRAPH |
| 95 | + ELSE |
| 96 | + MOVE 1 TO LEAP-YEAR |
| 97 | + EXIT PARAGRAPH |
| 98 | + END-IF. |
| 99 | + |
| 100 | + |
| 101 | + FIND-WEEKDAYS. |
| 102 | + * moves date that matches day of week to table |
| 103 | + MOVE 1 TO NO-OF-WDS. |
| 104 | + PERFORM VARYING ITER FROM 1 BY 1 UNTIL ITER > 31 |
| 105 | + MOVE WS-YEAR TO MY-DATE(1:4) |
| 106 | + MOVE WS-MONTH TO MY-DATE(5:2) |
| 107 | + MOVE ITER TO MY-DATE(7:2) |
| 108 | + PERFORM GET-WEEKDAY |
| 109 | + IF WS-DAYOFWEEK IS EQUAL TO WEEKDAY |
| 110 | + MOVE ITER TO WEEKDAYS-T(NO-OF-WDS) |
| 111 | + ADD 1 TO NO-OF-WDS |
| 112 | + END-IF |
| 113 | + END-PERFORM. |
| 114 | + * find teenth |
| 115 | + PERFORM VARYING ITER FROM 13 BY 1 UNTIL ITER = 20 |
| 116 | + MOVE WS-YEAR TO MY-DATE(1:4) |
| 117 | + MOVE WS-MONTH TO MY-DATE(5:2) |
| 118 | + MOVE ITER TO MY-DATE(7:2) |
| 119 | + PERFORM GET-WEEKDAY |
| 120 | + IF WS-DAYOFWEEK IS EQUAL TO WEEKDAY |
| 121 | + MOVE ITER TO WEEKDAYS-T(6) |
| 122 | + END-IF |
| 123 | + END-PERFORM. |
0 commit comments