* * * * Merkling Code Examples - COBOL - DMUDOW * * * *

           TITLE ' - Day-Of-Week Utility'
       IDENTIFICATION DIVISION.
       PROGRAM-ID.     DMUDOW.
       AUTHOR.         DAN MERKLING.
       DATE-WRITTEN.   03/13/2007.
       DATE-COMPILED.

      *----------------------------------------------------------------+
      * Purpose:                                                       |
      *     This callable sub-routine determines the day-of-week for   |
      *     a passed-in date.                                          |
      *                                                                |
      * Parameters & usage:                                            |
      *     A single 19-byte parameter block is used to call this      |
      *     routine, configured as follows:                            |
      *                                                                |
      *       01  DAY-OF-WEEK-PARMS                                    |
      *         05  DW-DT                                              |
      *         05  DW-DY-OF-WK                                        |
      *         05  DW-DY-OF-WK-NM                                     |
      *         05  DW-RSLT                                            |
      *                                                                |
      *     The individual parameters are defined & used as follows:   |
      *                                                                |
      *       DW-DT - INTEGER - 8                                      |
      *       This is the input date for which the day-of-week will be |
      *       found. It must be all digits, with no spaces. If the     |
      *       date is not provided, the system date will be retrieved  |
      *       & used as the input.                                     |
      *                                                                |
      *       Format: YYYYMMDD                                         |
      *                                                                |
      *       DW-DY-OF-WK - INTEGER - 1                                |
      *       This is the numeric value for the day of the week. The   |
      *       first day of a week is Monday & the last day of a week   |
      *       is Sunday. Therefore, the value returned in this field   |
      *       is 1 for Monday thru 7 for Sunday.                       |
      *                                                                |
      *       Format: 9                                                |
      *                                                                |
      *       DW-DY-OF-WK-NM - STRING - 9                              |
      *       This is the alpha name of the day of the week as         |
      *       determined by this routine.                              |
      *                                                                |
      *       Format: Xxxxxxxxx                                        |
      *                                                                |
      *       DW-RSLT - STRING - 1                                     |
      *       This is the result code (or return code) returned by the |
      *       routine. It should be checked after every call to this   |
      *       program.                                                 |
      *                                                                |
      *       Values: -     = Initialized; no processing yet performed |
      *               Blank = No errors or warnings; all processing    |
      *                       performed correctly                      |
      *               D     = Invalid date value                       |
      *               Z     = Serious unexpected error                 |
      *----------------------------------------------------------------+
      *           M O D I F I C A T I O N    H I S T O R Y             |
      *----------------------------------------------------------------+
      *  Programmer    Date   Change #     Description / Remarks       |
      * ------------ -------- -------- ------------------------------- |
      *----------------------------------------------------------------+
           EJECT
       ENVIRONMENT DIVISION.

       INPUT-OUTPUT SECTION.

       FILE-CONTROL.

       DATA DIVISION.

       FILE SECTION.
           EJECT
      *----------------------------------------------------------------+
      *                         Working Storage                        |
      *----------------------------------------------------------------+

       WORKING-STORAGE SECTION.

       77  PGM-ID                      PIC X(08) VALUE 'DMUDOW'.
       77  PGM-VER                     PIC X(05) VALUE '01.02'.
       77  FILLER                      PIC X(23) VALUE
                                       ' WORKING STORAGE BEGINS'.

       01  WORKING-VARIABLES.
           05  WS-CUR-DT.
             10  WS-CUR-YYYYMMDD.
               15  WS-CUR-YYYY         PIC 9(04).
               15  WS-CUR-MM           PIC 9(02).
               15  WS-CUR-DD           PIC 9(02).
             10  FILLER                PIC 9(08).
             10  FILLER                PIC X(05).
           05  WS-LILIAN               PIC 9(09) BINARY.
           05  WS-FEEDBACK-CODE.
             10  WS-FC-SEV             PIC 9(04) BINARY.
             10  WS-FC-MSG             PIC 9(04) BINARY.
             10  FILLER                PIC X(08).
           05  WS-DOW                  PIC 9(09) BINARY.

       01  CHR-DT.
           05  CD-LEN                  PIC 9(04) BINARY.
           05  CD-TXT.
             10  CD-CHAR               PIC X(01) OCCURS 0 TO 256
                                                 DEPENDING ON CD-LEN.

       01  PIC-STR.
           05  PS-LEN                  PIC 9(04) BINARY.
           05  PS-TXT.
             10  PS-CHAR               PIC X(01) OCCURS 0 TO 256
                                                 DEPENDING ON PS-LEN.

       01  DAY-TABLE.
           05  DAY-TABLE-DATA.
             10  FILLER                PIC X(09) VALUE 'Monday'.
             10  FILLER                PIC X(09) VALUE 'Tuesday'.
             10  FILLER                PIC X(09) VALUE 'Wednesday'.
             10  FILLER                PIC X(09) VALUE 'Thursday'.
             10  FILLER                PIC X(09) VALUE 'Friday'.
             10  FILLER                PIC X(09) VALUE 'Saturday'.
             10  FILLER                PIC X(09) VALUE 'Sunday'.
           05  DAY-TABLE-ARRAY REDEFINES DAY-TABLE-DATA.
             10  DAY-ENTRY             OCCURS 7.
               15  DAY-NAME            PIC X(09).
           EJECT
      *----------------------------------------------------------------+
      *                      Literals & Constants                      |
      *----------------------------------------------------------------+

       01  LITERALS-AND-CONSTANTS.
           05  CEEDAYS-PGM-ID          PIC X(08) VALUE 'CEEDAYS'.
           05  CEEDYWK-PGM-ID          PIC X(08) VALUE 'CEEDYWK'.
           EJECT
      *----------------------------------------------------------------+
      *                        Linkage Section                         |
      *----------------------------------------------------------------+

       LINKAGE SECTION.

      *01  DAY-OF-WEEK-PARMS
           COPY DMUDOW.
           EJECT
      *----------------------------------------------------------------+
      *                         0000-MAIN-LOGIC                        |
      *                                                                |
      * Main routine logic.                                            |
      *----------------------------------------------------------------+

       PROCEDURE DIVISION,
                 USING DAY-OF-WEEK-PARMS.

       0000-MAIN-LOGIC.

           MOVE ZERO                    TO DW-DY-OF-WK.
           MOVE SPACES                  TO DW-DY-OF-WK-NM.
           SET  DW-INCOMPLETE           TO TRUE.
           IF DW-DT-X <= SPACES THEN
             MOVE FUNCTION CURRENT-DATE TO WS-CUR-DT
             MOVE WS-CUR-YYYYMMDD       TO DW-DT
           END-IF.
           IF DW-DT NOT NUMERIC THEN
             SET  DW-UNEXPECTED-ERR     TO TRUE
             GO TO 0000-EXIT
           END-IF.
           MOVE 8                       TO CD-LEN,
                                           PS-LEN.
           MOVE DW-DT                   TO CD-TXT.
           MOVE 'YYYYMMDD'              TO PS-TXT.
           CALL CEEDAYS-PGM-ID,
                USING CHR-DT,
                      PIC-STR,
                      WS-LILIAN,
                      WS-FEEDBACK-CODE.
           IF WS-FC-SEV = 3 THEN
             SET  DW-INVALID-DATA-VALUE TO TRUE
             GO TO 0000-EXIT
           END-IF.
           SET  DW-OK                   TO TRUE.
           CALL CEEDYWK-PGM-ID,
                USING WS-LILIAN,
                      WS-DOW,
                      WS-FEEDBACK-CODE.
           SUBTRACT 1 FROM WS-DOW.
           IF WS-DOW = 0 THEN
             MOVE 7                     TO DW-DY-OF-WK
           ELSE
             MOVE WS-DOW                TO DW-DY-OF-WK
           END-IF.
           MOVE DAY-NAME(DW-DY-OF-WK)   TO DW-DY-OF-WK-NM.

       0000-EXIT.
           GOBACK.


       END PROGRAM DMUDOW.