********************************************************************
      * Program Name - CHKDIG02                                          *
      *                                                                  *
      * Function     - This program was designed to calculate and        *
      *                display a check digit for an 11-digit number.     *
      *                The logic of this program is in accordance to     *
      *                the algorithm defined as 'Luhn', or Mod 10.       *
      *                                                                  *
      *  1. Starting with the last digit and moving left, double the     *
      *  value of all the alternate digits. Values of 10 or more, add    *
      *  the digits together and use the resulting value for example:    *
      *  8 * 2 = 16, 1 + 6 = 7. Sum all the alternate (odd) digits.      *
      *                                                                  *
      *  2. Sum all the even digits together. Then, add the sum of the   *
      *  even digits with the sum of the odd digits.                     *
      *                                                                  *
      *  3. If the total ends in 0, the check digit is zero. Otherwise   *
      *  round up to the nearest multiple of 10, subtract the sum from   *
      *  the rounded value and the check digit is the difference of the  *
      *  two values.                                                     *
      *                                                                  *
      * Programmer   - Steve Croy        03/13/08                        *
      ********************************************************************
      ********************************************************************
      *               PROGRAM INTERFACE SECTION                          *
      *                                                                  *
      *  CALLED BY PROGRAMS:                                             *
      *  CALLS PROGRAMS....:                                             *
      *                                                                  *
      ********************************************************************
      ********************************************************************
      *                   Modification log                               *
      *                                                                  *
      *   Date    Programmer      Description                            *
      *                                                                  *
      ********************************************************************
     FCHKDIGDF2 CF   E             WORKSTN
      *
     D                 DS
     D  DOUBLE                 1      2  0
     D    DIG1                 1      1  0
     D    DIG2                 2      2  0
      *
     D                 DS
     D  CHK#                   1      1  0
      *
     D  numn           DS            11
     D    UPC                  1     11  0
     D                                     DIM(11)
     D  even           s              3  0
     D  odd            s              3  0
     D  total          s              3  0
     D  z              s              3  0
     D  chkn           s              1  0
     D  e              s              3  0
     D  o              s              3  0
      *
      /free
          CLEAR chkdig;
          CLEAR number;
          DOU *IN99;
             EXFMT CHKDIG01;
             IF not *IN99;
                number = %xlate(' ':'0':number);
                numn = number;
                odd = 0;
                FOR o = 11 by 2 downto 1;
                   double = upc(o) * 2;
                   odd = odd + (dig1 + dig2);
                ENDFOR;
                even = 0;
                FOR e = 2 by 2 to 10;
                   even = even + upc(e);
                ENDFOR;
                total = even + odd;
               // Calculate the check digit
               z = 10;
               DOW Total > z;
                  z = z + 10;
               ENDDO;
               CHKN = Z - TOTAL;
               CHKDIG = %EDITC(CHKN:'X');
               CHK# = CHKN;
               *IN15 = *ON;
             ENDIF;
          ENDDO;
          *INLR = *ON;
          RETURN;
      /end-free