HP 3000 Manuals

Sample Programs [ HP Link Editor/XL Reference Manual ] MPE/iX 5.0 Documentation


HP Link Editor/XL Reference Manual

Sample Programs 

This section lists the HP COBOL II, HP FORTRAN 77, and HP Pascal source
files used in the examples in the previous sections of this chapter.

These source     are listed in:
files:

EX1SRC           Figure 2-15
EX2ASRC          Figure 2-16
EX2BSRC          Figure 2-17
LIB1SRC          Figure 2-18
LIB2SRC          Figure 2-19
LIB3SRC          Figure 2-20
LIB4SRC          Figure 2-21
LIB5SRC          Figure 2-22
EX3ASRC          Figure 2-23
EX3BSRC          Figure 2-24
EX3CSRC          Figure 2-25
EX3DSRC          Figure 2-26
____________________________________________________________________
|                                                                  |
|     IDENTIFICATION DIVISION.                                     |
|     PROGRAM-ID. EX1.                                             |
|     ENVIRONMENT DIVISION.                                        |
|     INPUT-OUTPUT SECTION.                                        |
|     FILE-CONTROL.                                                |
|         SELECT IFILE             ASSIGN "IFILE".                 |
|         SELECT PFILE             ASSIGN "PFILE".                 |
|     DATA DIVISION.                                               |
|     FILE SECTION.                                                |
|     FD  IFILE.                                                   |
|     01  IREC.                                                    |
|         05  NAME                 PIC X(30).                      |
|         05  SOC-SEC              PIC X(9).                       |
|         05  HIRE-DATE.                                           |
|             10 MO                PIC XX.                         |
|             10 DA                PIC XX.                         |
|             10 YR                PIC XX.                         |
|         05  SALARY               PIC S9(6).                      |
|         05                       PIC X(29).                      |
|     FD  PFILE.                                                   |
|     01  PREC.                                                    |
|         05  SOC-SEC              PIC X(9).                       |
|         05                       PIC XX.                         |
|         05  NAME                 PIC X(30).                      |
|         05                       PIC XX.                         |
|         05  HIRE-DATE.                                           |
|             10  MO               PIC XX.                         |
|             10                   PIC X.                          |
|             10  DA               PIC XX.                         |
|             10                   PIC X.                          |
|             10  YR               PIC XX.                         |
|         05                       PIC X(81).                      |
|     01  HREC.                                                    |
|         05  HSOC-SEC             PIC X(11).                      |
|         05  HNAME                PIC X(32).                      |
|         05  HHIRE-DATE           PIC X(89).                      |
____________________________________________________________________

          Figure 2-15.  The HP COBOL II Source File, EX1SRC 
____________________________________________________________________
|                                                                  |
|     WORKING-STORAGE SECTION.                                     |
|     01  LNCNT                    PIC S9(4) BINARY VALUE 60.      |
|     01  W-DATE.                                                  |
|         05  WYR                  PIC XX.                         |
|         05                       PIC X(4).                       |
|     PROCEDURE DIVISION.                                          |
|     P1.                                                          |
|         ACCEPT W-DATE FROM DATE.                                 |
|         OPEN INPUT IFILE OUTPUT PFILE.                           |
|         PERFORM WITH TEST AFTER UNTIL SOC-SEC OF IREC = ALL "9"  |
|             READ IFILE                                           |
|                 AT END MOVE ALL "9" TO SOC-SEC OF IREC           |
|                 NOT AT END                                       |
|                     IF WYR = YR OF IREC THEN                     |
|                         ADD 1 TO LNCNT                           |
|                         IF LNCNT > 50 PERFORM HEADINGS END-IF    |
|                         MOVE SPACES TO PREC                      |
|                         MOVE CORR IREC TO PREC                   |
|                         WRITE PREC AFTER ADVANCING 1 LINE        |
|                     END-IF                                       |
|                 END-READ                                         |
|             END-PERFORM                                          |
|         CLOSE IFILE PFILE                                        |
|         STOP RUN.                                                |
|     HEADINGS.                                                    |
|         MOVE "SOC SEC NO" TO HSOC-SEC.                           |
|         MOVE "NAME" TO HNAME.                                    |
|         MOVE "HIRE DATE" TO HHIRE-DATE.                          |
|         WRITE PREC AFTER ADVANCING PAGE.                         |
|         MOVE 0 TO LNCNT.                                         |
____________________________________________________________________

          Figure 2-15.  The HP COBOL II Source File, EX1SRC (Continued) 
____________________________________________________________________
|                                                                  |
|     C   This program prints an amortization table for a loan     |
|     C   with regular payments on the first of each month.        |
|     C   It calculates prepaid interest from the current          |
|     C   date until the end of the current month, and begins      |
|     C   the amortization at the beginning of the next month.     |
|     C   Input to the program is the current date (in month,      |
|     C   day, year form), the principal amount, annual interest   |
|     C   rate, and the term of the loan in years.                 |
|                                                                  |
|           PROGRAM EX2                                            |
|           INTEGER TODAY, NXTMON, TERM                            |
|           DOUBLE PRECISION PRIN, RATE, PREPD, PAYMNT, PCT        |
|           INTEGER JULIAN                                         |
|           DOUBLE PRECISION AMORT                                 |
|           COMMON MONTH, DAY, YEAR                                |
|           INTEGER MONTH, DAY, YEAR                               |
|                                                                  |
|           READ (5,*) MONTH, DAY, YEAR                            |
|           READ (5,*) PRIN, RATE, TERM                            |
|                                                                  |
|     C   Determine the number of days remaining in the current    |
|     C   month.  The Julian dates for today and the first of the  |
|     C   next month are used for this calculation.                |
|                                                                  |
|           TODAY = JULIAN(MONTH, DAY, YEAR)                       |
|           DAY = 1                                                |
|           CALL ADDDAT(MONTH, DAY, YEAR, 1, 0, 0)                 |
|           NXTMON = JULIAN(MONTH, DAY, YEAR)                      |
|                                                                  |
|     C   Calculate the prepaid interest and the monthly payments. |
|     C   The prepaid interest is calculated as simple interest.   |
|                                                                  |
|           PREPD = PRIN * (NXTMON-TODAY) * (RATE/365.0D0)         |
|           PAYMNT = AMORT(PRIN, RATE/12.0D0, TERM*12)             |
|           PCT = RATE * 100.0D0                                   |
|           WRITE (6, 100) PREPD, PRIN, PCT, TERM, PAYMNT          |
|       100 FORMAT ('1', 'Prepaid Interest:  ', F10.2/             |
|          *        '0', 'Principal:         ', F10.2/             |
|          *        ' ', 'Interest Rate:     ', F10.2, '%'/        |
|          *        ' ', 'Number of Years:   ', I7/                |
|          *        ' ', 'Monthly Payment:   ', F10.2)             |
|                                                                  |
|           CALL PRTTAB(PRIN, RATE/12.0D0, TERM*12, PAYMNT)        |
|           STOP                                                   |
|           END                                                    |
____________________________________________________________________

          Figure 2-16.  The HP FORTRAN 77 Source File, EX2ASRC 
_______________________________________________________________________
|                                                                     |
|     C   Print the amortization table                                |
|                                                                     |
|           SUBROUTINE PRTTAB(PRIN, RATE, TERM, PAYMNT)               |
|           DOUBLE PRECISION PRIN, RATE, PAYMNT                       |
|           INTEGER TERM                                              |
|           DOUBLE PRECISION ACCINT, PPRIN, PINT, RPRIN               |
|           CHARACTER*3 DW, WKDAY                                     |
|           COMMON MONTH, DAY, YEAR                                   |
|           INTEGER MONTH, DAY, YEAR                                  |
|           ACCINT = 0.0                                              |
|           WRITE (6, 101)                                            |
|       101 FORMAT ('0', '                 Beginning  Payment to  ',  |
|          *             'Payment to   Accumulated     Remaining'/    |
|          *        ' ', '   Due Date      Principal   Principal  ',  |
|          *             '  Interest      Interest     Principal')    |
|           DO 1 I = 1, TERM                                          |
|              CALL ADDDAT(MONTH, DAY, YEAR, 1, 0, 0)                 |
|              PINT = PRIN * RATE                                     |
|              PPRIN = PAYMNT - PINT                                  |
|              ACCINT = ACCINT + PINT                                 |
|              RPRIN = PRIN - PPRIN                                   |
|              DW = WKDAY(MONTH, DAY, YEAR)                           |
|              WRITE (6, 102) DW, MONTH, DAY, YEAR, PRIN, PPRIN, PINT,|
|          *                  ACCINT, RPRIN                           |
|       102    FORMAT (' ', A3, ' ', I2, '/', I2, '/', I4, 2X, F10.2, |
|          *           4X, F8.2, 4X, F8.2, 4X, F10.2, 4X, F10.2)      |
|              PRIN = RPRIN                                           |
|         1 CONTINUE                                                  |
|           RETURN                                                    |
|           END                                                       |
_______________________________________________________________________

          Figure 2-16.  The HP FORTRAN 77 Source File, EX2ASRC (Continued) 
_______________________________________________________________________
|                                                                     |
|     C   JULIAN returns the Julian date for the given month, day,    |
|     C   and year.  The Julian date calculated here is valid from    |
|     C   Mar 1, 1900 to Feb 28, 2100.  It is the astronomical date   |
|     C   for noon on that day.                                       |
|                                                                     |
|           INTEGER FUNCTION JULIAN(MONTH, DAY, YEAR)                 |
|           INTEGER MONTH, DAY, YEAR                                  |
|           PARAMETER (J1900 = 2415020)                               |
|           INTEGER JAN1, MON1                                        |
|           INTEGER MTABLE(12)                                        |
|           DATA MTABLE /0,31,59,90,120,151,181,212,243,273,304,334/  |
|                                                                     |
|     C   Find Julian date for Jan 1 of given year.                   |
|                                                                     |
|           JAN1 = J1900 + INT(365.25D0 * (YEAR-1900) + 0.75)         |
|                                                                     |
|     C   Find number of days to 1st of given month.                  |
|                                                                     |
|           MON1 = MTABLE(MONTH)                                      |
|           IF (MOD(YEAR,4) .EQ. 0 .AND. MONTH .GE. 3) MON1 = MON1 + 1|
|           JULIAN = JAN1 + MON1 + DAY - 1                            |
|           RETURN                                                    |
|           END                                                       |
|                                                                     |
|                                                                     |
|     C   MDY converts a Julian date to month, day, year format.      |
|                                                                     |
|           SUBROUTINE MDY(JDATE, MONTH, DAY, YEAR)                   |
|           INTEGER JDATE, MONTH, DAY, YEAR, YDATE                    |
|           PARAMETER (J1900 = 2415020)                               |
|           INTEGER MTABLE(12)                                        |
|           DATA MTABLE /31,28,31,30,31,30,31,31,30,31,30,31/         |
|           YEAR = 1900 + INT((JDATE-J1900) / 365.25D0)               |
|           DAY = JDATE - JULIAN(1, 1, YEAR) + 1                      |
|           MTABLE(2) = 28                                            |
|           IF (MOD(YEAR,4) .EQ. 0) MTABLE(2) = 29                    |
|           MONTH = 1                                                 |
|         1 IF (DAY .LE. MTABLE(MONTH) .OR. MONTH .GE. 12) GOTO 2     |
|              DAY = DAY - MTABLE(MONTH)                              |
|              MONTH = MONTH + 1                                      |
_______________________________________________________________________

          Figure 2-17.  The HP FORTRAN 77 Source File, EX2BSRC 
__________________________________________________________________________
|                                                                        |
|              GOTO 1                                                    |
|         2 RETURN                                                       |
|           END                                                          |
|                                                                        |
|     C   WKDAY returns a 3-letter name of the day of the week           |
|     C   given the month, day, and year.                                |
|                                                                        |
|           CHARACTER*3 FUNCTION WKDAY(MONTH, DAY, YEAR)                 |
|           INTEGER MONTH, DAY, YEAR, JDATE, DW                          |
|           INTEGER JULIAN                                               |
|           CHARACTER*3 DAYTAB(7)                                        |
|           DATA DAYTAB /'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'/|
|           JDATE = JULIAN(MONTH, DAY, YEAR)                             |
|           DW = MOD(JDATE+1, 7)                                         |
|           WKDAY = DAYTAB(DW+1)                                         |
|           RETURN                                                       |
|           END                                                          |
|                                                                        |
|                                                                        |
|     C   ADDDAT adds the given number of months, days, and years        |
|     C   to the date supplied in the first three arguments.             |
|                                                                        |
|           SUBROUTINE ADDDAT(MONTH, DAY, YEAR, NMONS, NDAYS, NYRS)      |
|           INTEGER MONTH, DAY, YEAR, NMONS, NDAYS, NYRS                 |
|           INTEGER JDATE, JULIAN                                        |
|           YEAR = YEAR + NYRS                                           |
|           MONTH = MONTH + NMONS                                        |
|                                                                        |
|           IF (MONTH .GT. 12) THEN                                      |
|              YEAR = YEAR + (MONTH-1)/12                                |
|              MONTH = MOD(MONTH-1,12) + 1                               |
|           END IF                                                       |
|                                                                        |
|           IF (NDAYS .GT. 0) THEN                                       |
|              JDATE = JULIAN(MONTH, DAY, YEAR) + NDAYS                  |
|              CALL MDY(JDATE, MONTH, DAY, YEAR)                         |
|           END IF                                                       |
|                                                                        |
|           RETURN                                                       |
|           END                                                          |
__________________________________________________________________________

          Figure 2-17.  The HP FORTRAN 77 Source File, EX2BSRC (Continued) 
___________________________________________________________________
|                                                                 |
|     C   AMORT returns the periodic payment for an amortized loan|
|     C   given principal, periodic interest rate, and term.      |
|                                                                 |
|           DOUBLE PRECISION FUNCTION AMORT(PRIN, RATE, TERM)     |
|           DOUBLE PRECISION PRIN, RATE                           |
|           INTEGER TERM                                          |
|                                                                 |
|           AMORT = PRIN * RATE / (1.0 - (1.0+RATE) ** (-TERM))   |
|                                                                 |
|           RETURN                                                |
|           END                                                   |
___________________________________________________________________

          Figure 2-17.  The HP FORTRAN 77 Source File, EX2BSRC (Continued) 
_______________________________________________________________________
|                                                                     |
|     C   JULIAN returns the Julian date for the given month, day,    |
|     C   and year.  The Julian date calculated here is valid from    |
|     C   Mar 1, 1900 to Feb 28, 2100.  It is the astronomical date   |
|     C   for noon on that day.                                       |
|                                                                     |
|           INTEGER FUNCTION JULIAN(MONTH, DAY, YEAR)                 |
|           INTEGER MONTH, DAY, YEAR                                  |
|           PARAMETER (J1900 = 2415020)                               |
|           INTEGER JAN1, MON1                                        |
|           INTEGER MTABLE(12)                                        |
|           DATA MTABLE /0,31,59,90,120,151,181,212,243,273,304,334/  |
|                                                                     |
|     C   Find Julian date for Jan 1 of given year.                   |
|                                                                     |
|           JAN1 = J1900 + INT(365.25D0 * (YEAR-1900) + 0.75)         |
|                                                                     |
|     C   Find number of days to 1st of given month.                  |
|                                                                     |
|           MON1 = MTABLE(MONTH)                                      |
|           IF (MOD(YEAR,4) .EQ. 0 .AND. MONTH .GE. 3) MON1 = MON1 + 1|
|           JULIAN = JAN1 + MON1 + DAY - 1                            |
|           RETURN                                                    |
|           END                                                       |
_______________________________________________________________________

          Figure 2-18.  The HP FORTRAN 77 Source File, LIB1SRC 
__________________________________________________________________
|                                                                |
|     C   MDY converts a Julian date to month, day, year format. |
|                                                                |
|           SUBROUTINE MDY(JDATE, MONTH, DAY, YEAR)              |
|           INTEGER JDATE, MONTH, DAY, YEAR, YDATE               |
|           PARAMETER (J1900 = 2415020)                          |
|           INTEGER MTABLE(12)                                   |
|           DATA MTABLE /31,28,31,30,31,30,31,31,30,31,30,31/    |
|           YEAR = 1900 + INT((JDATE-J1900) / 365.25D0)          |
|           DAY = JDATE - JULIAN(1, 1, YEAR) + 1                 |
|           MTABLE(2) = 28                                       |
|           IF (MOD(YEAR,4) .EQ. 0) MTABLE(2) = 29               |
|           MONTH = 1                                            |
|         1 IF (DAY .LE. MTABLE(MONTH) .OR. MONTH .GE. 12) GOTO 2|
|              DAY = DAY - MTABLE(MONTH)                         |
|              MONTH = MONTH + 1                                 |
|              GOTO 1                                            |
|         2 RETURN                                               |
|           END                                                  |
__________________________________________________________________

          Figure 2-19.  The HP FORTRAN 77 Source File, LIB2SRC 
__________________________________________________________________________
|                                                                        |
|     C   WKDAY returns a 3-letter name of the day of the week           |
|     C   given the month, day, and year.                                |
|                                                                        |
|           CHARACTER*3 FUNCTION WKDAY(MONTH, DAY, YEAR)                 |
|           INTEGER MONTH, DAY, YEAR, JDATE, DW                          |
|           INTEGER JULIAN                                               |
|           CHARACTER*3 DAYTAB(7)                                        |
|           DATA DAYTAB /'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'/|
|           JDATE = JULIAN(MONTH, DAY, YEAR)                             |
|           DW = MOD(JDATE+1, 7)                                         |
|           WKDAY = DAYTAB(DW+1)                                         |
|           RETURN                                                       |
|           END                                                          |
__________________________________________________________________________

          Figure 2-20.  The HP FORTRAN 77 Source File, LIB3SRC 
____________________________________________________________________
|                                                                  |
|     C   ADDDAT adds the given number of months, days, and years  |
|     C   to the date supplied in the first three arguments.       |
|                                                                  |
|           SUBROUTINE ADDDAT(MONTH, DAY, YEAR, NMONS, NDAYS, NYRS)|
|           INTEGER MONTH, DAY, YEAR, NMONS, NDAYS, NYRS           |
|           INTEGER JDATE, JULIAN                                  |
|           YEAR = YEAR + NYRS                                     |
|           MONTH = MONTH + NMONS                                  |
|                                                                  |
|           IF (MONTH .GT. 12) THEN                                |
|              YEAR = YEAR + (MONTH-1)/12                          |
|              MONTH = MOD(MONTH-1,12) + 1                         |
|           END IF                                                 |
|                                                                  |
|           IF (NDAYS .GT. 0) THEN                                 |
|              JDATE = JULIAN(MONTH, DAY, YEAR) + NDAYS            |
|              CALL MDY(JDATE, MONTH, DAY, YEAR)                   |
|           END IF                                                 |
|                                                                  |
|           RETURN                                                 |
|           END                                                    |
____________________________________________________________________

          Figure 2-21.  The HP FORTRAN 77 Source File, LIB4SRC 
___________________________________________________________________
|                                                                 |
|     C   AMORT returns the periodic payment for an amortized loan|
|     C   given principal, periodic interest rate, and term.      |
|                                                                 |
|           DOUBLE PRECISION FUNCTION AMORT(PRIN, RATE, TERM)     |
|           DOUBLE PRECISION PRIN, RATE                           |
|           INTEGER TERM                                          |
|                                                                 |
|           AMORT = PRIN * RATE / (1.0 - (1.0+RATE) ** (-TERM))   |
|                                                                 |
|           RETURN                                                |
|           END                                                   |
___________________________________________________________________

          Figure 2-22.  The HP FORTRAN 77 Source File, LIB5SRC 
____________________________________________________________________
|                                                                  |
|     {This program queries the system using defined system        |
|      intrinsics in order to print the device number, the user,   |
|      group, and account name, and the current date and time.}    |
|                                                                  |
|     program myprog (input, output);                              |
|                                                                  |
|     type                                                         |
|        pac1 = packed array [1..10] of char;                      |
|        pac2 = packed array [1..30] of char;                      |
|                                                                  |
|     var                                                          |
|        user, group, acct: pac1;                                  |
|        date             : pac2;                                  |
|        dev              : shortint;                              |
|                                                                  |
|     {"external" signifies these routines will be                 |
|      found in other modules.}                                    |
|     procedure p1(var dev: shortint); external;                   |
|                                                                  |
|     procedure p2(var user, group, acct: pac1); external;         |
|                                                                  |
|     procedure p3(var date: pac2); external;                      |
|                                                                  |
|     begin                                                        |
|         p1(dev);                                                 |
|         p2(user, group, account);                                |
|         p3(date);                                                |
|                                                                  |
|        {output the required information}                         |
|         write('Device number', dev, 'is logged on as ');         |
|         write(user, '.', group, '.', acct);                      |
|         writeln('on', date);                                     |
|     end.                                                         |
____________________________________________________________________

          Figure 2-23.  The HP Pascal Source File, EX3ASRC 
___________________________________________________________________
|                                                                 |
|     $subprogram$                                                |
|     program sub1;                                               |
|                                                                 |
|     {Here, who is specified as an intrinsic.}                   |
|     procedure who; intrinsic;                                   |
|                                                                 |
|     {This procedure calls the system intrinsic who              |
|      to return the device the current user is logged            |
|      on to. who command defaults are used for the               |
|      1st 7 parameters, as documented in the MPE XL              |
|      Intrinsics Reference Manual.}                              |
|     procedure p1(var dev: shortint);                            |
|     begin                                                       |
|        who(,,,,,,,dev);                                         |
|     end;                                                        |
|                                                                 |
|     {The main program is defined elsewhere.}                    |
|                                                                 |
|     begin                                                       |
|     end.                                                        |
___________________________________________________________________

          Figure 2-24.  The HP Pascal Source File, EX3BSRC 
___________________________________________________________________
|                                                                 |
|     $subprogram$                                                |
|                                                                 |
|     program sub2;                                               |
|                                                                 |
|     type                                                        |
|        pac1 = packed array [1..10] of char;                     |
|                                                                 |
|     procedure who; intrinsic;                                   |
|                                                                 |
|     {This procedure calls the system intrinsic who to           |
|      return the name of the current user, group, and account.   |
|      who command defaults are used for the 1st 3 parameters,    |
|      as documented in the MPE XL Intrinsics Reference Manual.}  |
|     procedure p2(var user, group, acct: pac1);                  |
|     begin                                                       |
|        who(,,,user, group, acct);                               |
|     end;                                                        |
|                                                                 |
|     {The main program is defined elsewhere.}                    |
|                                                                 |
|     begin                                                       |
|     end.                                                        |
___________________________________________________________________

          Figure 2-25.  The HP Pascal Source File, EX3CSRC 
___________________________________________________________________
|                                                                 |
|     $subprogram$                                                |
|                                                                 |
|     program sub3;                                               |
|                                                                 |
|     type                                                        |
|        pac2 = packed array [1..30] of char;                     |
|                                                                 |
|     {dateline is specified as an intrinsic}                     |
|     procedure dateline; intrinsic;                              |
|                                                                 |
|     {This procedure calls the system intrinsic dateline         |
|      to return the current date and time. dateline is           |
|      documented in the MPE XL System Intrinsics Manual.}        |
|     procedure p3(var date: pac2);                               |
|     begin                                                       |
|        dateline(date);                                          |
|     end;                                                        |
|                                                                 |
|     {The main program is defined elsewhere.}                    |
|                                                                 |
|     begin                                                       |
|     end.                                                        |
___________________________________________________________________

          Figure 2-26.  The HP Pascal Source File, EX3DSRC 



MPE/iX 5.0 Documentation