IDENTIFICATION DIVISION. PROGRAM-ID. MAILER. AUTHOR. BOB CURRIER. DATE-WRITTEN. AUGUST 31, 1974 00:18:23 DATE-COMPILED. REMARKS. A MAILER SYSTEM FOR THE DECSYSTEM-10 WRITTEN IN COBOL FOR LACK OF ANYTHING BETTER. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. PDP-10. OBJECT-COMPUTER. PDP-10. SPECIAL-NAMES. CONSOLE IS TTY. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MAIL-FILE ASSIGN TO DSK, ACCESS MODE IS RANDOM ACTUAL KEY IS MAIL-KEY FILE-LIMIT IS 0 THRU 9999. SELECT OTHER-MAIL-FILE ASSIGN TO DSK, ACCESS MODE IS RANDOM ACTUAL KEY IS OTHER-MAIL-KEY FILE-LIMIT 0 THRU 9999. DATA DIVISION. FILE SECTION. FD MAIL-FILE BLOCK CONTAINS 64 RECORDS LABEL RECORDS ARE STANDARD, VALUE OF USER-NUMBER IS MAIL-PPN VALUE OF IDENTIFICATION IS BOX-NAME DATA RECORDS ARE MAIL-REC-0, MAIL-HEADER, MAIL-REC. 01 MAIL-REC-0. 02 NUM-MESS PIC 9(4). 02 NEXT-FREE PIC 9(4). 02 MY-PROJ PIC 9(6). 02 MY-PROG PIC 9(6). 02 MY-NAME PIC X(30). 02 FILLER PIC X(50). 01 MAIL-HEADER. 02 POINTER PIC 9(4). 02 FROM-PROJ PIC 9(6). 02 FROM-PROG PIC 9(6). 02 FROM-NAME PIC X(30). 02 FROM-SUBJECT PIC X(30). 02 MES-DATE PIC X(8). 02 MES-TIME PIC X(8). 02 FILLER PIC X(8). 01 MAIL-REC. 02 FILLER PIC X(100). FD OTHER-MAIL-FILE BLOCK CONTAINS 64 RECORDS LABEL RECORDS ARE STANDARD, VALUE OF IDENTIFICATION IS BOX-NAME VALUE OF USER-NUMBER IS SEND-TO DATA RECORDS ARE O-MAIL-REC-0, O-MAIL-HEADER, O-MAIL-REC. 01 O-MAIL-REC-0. 02 O-NUM-MESS PIC 9(4). 02 O-NEXT-FREE PIC 9(4). 02 O-MY-PROJ PIC 9(6). 02 O-MY-PROG PIC 9(6). 02 O-MY-NAME PIC X(30). 02 FILLER PIC X(50). 01 O-MAIL-HEADER. 02 O-POINTER PIC 9(4). 02 O-FROM-PROJ PIC 9(6). 02 O-FROM-PROG PIC 9(6). 02 O-FROM-NAME PIC 9(6). 02 O-FROM-SUBJECT PIC X(30). 02 O-MES-DATE PIC X(8). 02 O-MES-TIME PIC X(8). 02 FILLER PIC X(8). 01 O-MAIL-REC. 02 FILLER PIC X(100). WORKING-STORAGE SECTION. 77 THIS-NUM PIC 99. 77 BOX-NAME PIC X(9) VALUE "MAIL BOX". 77 REN-PROT PIC 999 VALUE 122. 77 REN-ERR PIC 9. 77 TEMP PIC 99. 77 NEW-NUM PIC 9. 77 PPN-DEX PIC 9(6). 77 MAIL-PPN PIC S9(10) COMP. 77 GN-NUM PIC 9(6). 77 GN-FLAG PIC 9. 77 NEXT-MES PIC 9(6). 77 PROJ-HOLD PIC 9(6). 77 PROG-HOLD PIC 9(6). 77 NAME-HOLD PIC X(30). 77 SUBJECT PIC X(30). 77 FREE PIC 9(6). 77 KEY-HOLD PIC 9(6). 77 PPN-NUM PIC 9. 77 CHARACTER PIC S9(10) COMP. 77 SEND-TO PIC S9(10) COMP. 77 PROJ PIC 9(6) COMP. 77 PROG PIC 9(6) COMP. 77 COMMAND PIC X(6). 77 MAIL-KEY PIC 9(6) COMP. 77 OTHER-MAIL-KEY PIC 9(6) COMP. 77 SPDEX PIC 99. 77 SPMAX PIC 99. 01 LIST-LINE. 02 L-MES-NUM PIC Z9. 02 FILLER PIC X. 02 L-DATE PIC X(8). 02 FILLER PIC X. 02 L-FROM PIC X(30). 02 FILLER PIC X. 02 L-SUBJECT PIC X(29). 01 DIS-PROJ. 02 DIS-PROJ-IND OCCURS 6 TIMES PIC 9. 01 DIS-PROG. 02 DIS-PROG-IND OCCURS 6 TIMES PIC 9. 01 SPNOR-HOLD. 02 SPNOR-VAR OCCURS 30 TIMES PIC IS X. 01 DATE-EXPAND. 02 DATER. 03 MONTH PIC XX. 03 FILLER PIC X VALUE "/". 03 DAY PIC XX. 03 FILLER PIC X VALUE "/". 03 YEAR PIC XX. 02 TIMER. 03 HOUR PIC XX. 03 FILLER PIC X VALUE ":". 03 MIN PIC XX. 03 FILLER PIC X VALUE ":". 03 SEC PIC XX. 01 BIG-PPN. 02 PPN-STUFF OCCURS 20 TIMES PIC IS X. 01 CHARACTERS-FOR-TABLE. 02 FILLER PIC X(30) VALUE SPACES. 02 FILLER PIC X(30) VALUE " ! #$%&'()*+,-./0123456789:;". 02 FILLER PIC X(30) VALUE "<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY". 02 FILLER PIC X(30) VALUE "Z[\]^_'ABCDEFGHIJKLMNOPQRSTUVW". 02 FILLER PIC X(8) VALUE "XYZ ". 01 CHAR-TAB REDEFINES CHARACTERS-FOR-TABLE. 02 CHARACTER-TABLE OCCURS 128 TIMES PICTURE IS X. 01 DATE. 02 YEAR PIC XX. 02 MONTH PIC XX. 02 DAY PIC XX. 02 HOUR PIC 99. 02 MIN PIC XX. 02 SEC PIC XX. PROCEDURE DIVISION. START. DISPLAY "DECSYSTEM-10 MAILER SUBSYSTEM V1.02". DISPLAY " ". START-2. ENTER MACRO GETPPN USING PROJ, PROG. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN I-O MAIL-FILE. MOVE ZERO TO MAIL-KEY. READ MAIL-FILE RECORD INVALID KEY GO TO NOT-OK-FILE. * ENTER MACRO GETPPN USING PROJ, PROG. * IF MY-PROJ = PROG AND MY-PROG = PROG GO TO OK-FILE. GO TO OK-FILE. NOT-OK-FILE. CLOSE MAIL-FILE WITH DELETE. OPEN OUTPUT MAIL-FILE. ENTER MACRO GETPPN USING PROJ, PROG. MOVE PROJ TO MY-PROJ. MOVE PROG TO MY-PROG. MOVE ZERO TO NUM-MESS. MOVE 1 TO NEXT-FREE. DISPLAY "WHAT IS YOUR NAME? "WITH NO ADVANCING. ACCEPT MY-NAME. DISPLAY " ". WRITE MAIL-REC-0 INVALID KEY DISPLAY "ERROR INITIALIZING MAIL FILE"; STOP RUN. CLOSE MAIL-FILE. ENTER MACRO RENAME USING BOX-NAME,BOX-NAME,REN-PROT,REN-ERR. IF REN-ERR NOT = ZERO DISPLAY "ERROR REPROTECTING FILE"; STOP RUN. GO TO START-2. OK-FILE. MOVE TODAY TO DATE. IF ( HOUR OF DATE > 0 AND HOUR OF DATE < 12 ) DISPLAY "GOOD MORNING" WITH NO ADVANCING; GO TO PRINT-NAME. IF ( HOUR OF DATE > 11 AND HOUR OF DATE < 17 ) DISPLAY "GOOD AFTERNOON" WITH NO ADVANCING; GO TO PRINT-NAME. DISPLAY "GOOD EVENING" WITH NO ADVANCING. PRINT-NAME. DISPLAY " "; MY-NAME. CLOSE MAIL-FILE. MAIL-LOOP. DISPLAY " ". DISPLAY "!" WITH NO ADVANCING. NEXT-CHAR. ENTER FORTRAN-IV FRITZ USING CHARACTER. MOVE CHARACTER-TABLE ( CHARACTER + 1 ) TO COMMAND. IF CHARACTER = 0 OR 10 OR 13 GO TO MAIL-LOOP. IF COMMAND = "T" GO TO TYPE-MESSAGE. IF COMMAND = "S" GO TO SEND-MESSAGE. IF COMMAND = "Q" GO TO QUIT-MAILER. IF COMMAND = "L" GO TO LIST-MESSAGE. IF COMMAND = "K" GO TO KILL-MESSAGE. IF COMMAND = "?" GO TO HELP-MESSAGE. DISPLAY " ?" WITH NO ADVANCING. GO TO MAIL-LOOP. QUIT-MAILER. DISPLAY "QUIT [CONFIRM]" WITH NO ADVANCING. QM-LOOP. ENTER FORTRAN-IV FRITZ USING CHARACTER. IF CHARACTER = 127 DISPLAY " XXX"; GO TO MAIL-LOOP. IF CHARACTER NOT = 13 DISPLAY " ? [CONFIRM]" WITH NO ADVANCING; GO TO QM-LOOP. * NOW GET RID OF THE LINE-FEED ENTER FORTRAN-IV FRITZ USING CHARACTER. STOP RUN. TYPE-MESSAGE. DISPLAY "TYPE " WITH NO ADVANCING. MOVE ZERO TO GN-FLAG. PERFORM GET-NUM. IF GN-FLAG = 1 ; GO TO MAIL-LOOP. ENTER MACRO GETPPN USING PROJ, PROG. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN INPUT MAIL-FILE. MOVE ZERO TO MAIL-KEY. PERFORM GET-MAIL. IF ( GN-NUM = ZERO ) OR ( GN-NUM > NUM-MESS ); DISPLAY " "; DISPLAY "INVALID MESSAGE NUMBER"; CLOSE MAIL-FILE; GO TO MAIL-LOOP. MOVE MY-PROJ TO DIS-PROJ. MOVE MY-PROG TO DIS-PROG. MOVE 1 TO MAIL-KEY. TM-LOOP. READ MAIL-FILE RECORD INVALID KEY DISPLAY "MESSAGE NO FOUND!"; CLOSE MAIL-FILE; GO TO MAIL-LOOP. SUBTRACT 1 FROM GN-NUM. IF GN-NUM = ZERO GO TO TGOT-IT. MOVE POINTER TO MAIL-KEY. GO TO TM-LOOP. TGOT-IT. DISPLAY " ". DISPLAY "TO: [" WITH NO ADVANCING. PERFORM PPN-OUT. MOVE FROM-PROJ TO DIS-PROJ. MOVE FROM-PROG TO DIS-PROG. DISPLAY "FROM: " WITH NO ADVANCING. MOVE FROM-NAME TO SPNOR-HOLD. PERFORM SPNOR. DISPLAY "[" WITH NO ADVANCING. PERFORM PPN-OUT. DISPLAY "DATE: "MES-DATE" "MES-TIME. DISPLAY "SUBJECT: "FROM-SUBJECT. DISPLAY " ". MOVE POINTER TO NEXT-MES. TLOOP. ADD 1 TO MAIL-KEY. IF MAIL-KEY = NEXT-MES DISPLAY " "; CLOSE MAIL-FILE; GO TO MAIL-LOOP. PERFORM GET-MAIL. DISPLAY MAIL-REC. GO TO TLOOP. SEND-MESSAGE. DISPLAY "SEND [CONFIRM]" WITH NO ADVANCING. SM-LOOP-1. ENTER FORTRAN-IV FRITZ USING CHARACTER. IF CHARACTER = 127 DISPLAY " XXX" WITH NO ADVANCING; GO TO MAIL-LOOP. IF CHARACTER NOT = 13 DISPLAY " ? [CONFIRM]" WITH NO ADVANCING; GO TO SM-LOOP-1. * DUMP LINE-FEED. ENTER FORTRAN-IV FRITZ USING CHARACTER. ENTER MACRO GETPPN USING PROJ, PROG. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN INPUT MAIL-FILE. MOVE ZERO TO MAIL-KEY. PERFORM GET-MAIL. MOVE MY-NAME TO NAME-HOLD. MOVE MY-PROG TO PROG-HOLD. MOVE MY-PROJ TO PROJ-HOLD. CLOSE MAIL-FILE. DISPLAY " ". DISPLAY "SEND TO: " WITH NO ADVANCING. PERFORM GET-A-PPN. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN I-O MAIL-FILE. PERFORM GET-MAIL. MOVE NEXT-FREE TO MAIL-KEY. MOVE SPACES TO MAIL-HEADER. MOVE MAIL-KEY TO KEY-HOLD. MOVE PROG-HOLD TO FROM-PROG. MOVE PROJ-HOLD TO FROM-PROJ. MOVE NAME-HOLD TO FROM-NAME. DISPLAY "SUBJECT: " WITH NO ADVANCING. ACCEPT FROM-SUBJECT. MOVE TODAY TO DATE. MOVE CORRESPONDING DATE TO DATER. MOVE CORRESPONDING DATE TO TIMER. MOVE DATER TO MES-DATE. MOVE TIMER TO MES-TIME. WRITE MAIL-HEADER INVALID KEY DISPLAY "?ERROR - COULD NOT WRITE MESSAGE HEADER"; STOP RUN. ADD 1 TO MAIL-KEY. DISPLAY "ENTER MESSAGE, ? FOR HELP.". SM-LOOP-2. MOVE SPACES TO MAIL-REC. ACCEPT MAIL-REC. IF MAIL-REC = "END" GO TO WRITE-MESS. IF MAIL-REC = "?" GO TO SM-HELP. WRITE MAIL-REC INVALID KEY DISPLAY "?ERROR - COULD NOT WRITE OUT TEXT"; STOP RUN. ADD 1 TO MAIL-KEY. GO TO SM-LOOP-2. WRITE-MESS. MOVE MAIL-KEY TO FREE. MOVE ZERO TO MAIL-KEY. PERFORM GET-MAIL. MOVE FREE TO NEXT-FREE. ADD 1 TO NUM-MESS. WRITE MAIL-REC-0 INVALID KEY DISPLAY "?ERROR - COULD NOT UPDATE RECORD 0"; STOP RUN. MOVE KEY-HOLD TO MAIL-KEY. PERFORM GET-MAIL. MOVE FREE TO POINTER. WRITE MAIL-HEADER INVALID KEY DISPLAY "?ERROR - COULD NOT UPDATE MESSAGE HEADER"; STOP RUN. CLOSE MAIL-FILE. GO TO MAIL-LOOP. SM-HELP. DISPLAY "%HLRNHF NO .HLP FILE ON SYS:; I'M SORRY, I CAN'T HELP YOU". GO TO SM-LOOP-2. LIST-MESSAGE. DISPLAY "LIST MESSAGES [CONFIRM]" WITH NO ADVANCING. LM-LOOP1. ENTER FORTRAN-IV FRITZ USING CHARACTER. IF CHARACTER = 127 DISPLAY " XXX"; GO TO MAIL-LOOP. IF CHARACTER NOT = 13 DISPLAY " ? [CONFIRM]" WITH NO ADVANCING; GO TO LM-LOOP1. ENTER FORTRAN-IV FRITZ USING CHARACTER. ENTER MACRO GETPPN USING PROJ, PROG. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN INPUT MAIL-FILE. MOVE ZERO TO MAIL-KEY. PERFORM GET-MAIL. IF NUM-MESS = ZERO DISPLAY " "; DISPLAY "NO MESSAGES"; CLOSE MAIL-FILE; GO TO MAIL-LOOP. MOVE NUM-MESS TO GN-NUM. MOVE 1 TO MAIL-KEY. PERFORM GET-MAIL. MOVE 1 TO THIS-NUM. DISPLAY " ". MOVE " #" TO LIST-LINE. MOVE " DATE" TO L-DATE. MOVE " FROM" TO L-FROM. MOVE " SUBJECT" TO L-SUBJECT. DISPLAY LIST-LINE. MOVE SPACES TO LIST-LINE. DISPLAY " ". LM-LOOP2. MOVE THIS-NUM TO L-MES-NUM. MOVE MES-DATE TO L-DATE. MOVE FROM-NAME TO L-FROM. MOVE FROM-SUBJECT TO L-SUBJECT. DISPLAY LIST-LINE. MOVE SPACES TO LIST-LINE. ADD 1 TO THIS-NUM. SUBTRACT 1 FROM GN-NUM. IF GN-NUM = ZERO; DISPLAY " "; CLOSE MAIL-FILE; GO TO MAIL-LOOP. MOVE POINTER TO MAIL-KEY. PERFORM GET-MAIL. GO TO LM-LOOP2. KILL-MESSAGE. DISPLAY "KILL ALL MESSAGES [CONFIRM]" WITH NO ADVANCING. KM-LOOP1. ENTER FORTRAN-IV FRITZ USING CHARACTER. IF CHARACTER = 127 DISPLAY " XXX"; GO TO MAIL-LOOP. IF CHARACTER NOT = 13 DISPLAY " ? [CONFIRM]" WITH NO ADVANCING; GO TO KM-LOOP1. ENTER FORTRAN-IV FRITZ USING CHARACTER. ENTER MACRO GETPPN USING PROJ, PROG. ENTER MACRO SETPPN USING PROJ, PROG, MAIL-PPN. OPEN INPUT MAIL-FILE. MOVE ZERO TO MAIL-KEY. PERFORM GET-MAIL. MOVE MY-NAME TO NAME-HOLD. CLOSE MAIL-FILE WITH DELETE. OPEN OUTPUT MAIL-FILE. MOVE NAME-HOLD TO MY-NAME. MOVE ZERO TO NUM-MESS. MOVE 1 TO NEXT-FREE. MOVE PROJ TO MY-PROJ. MOVE PROG TO MY-PROG. MOVE ZERO TO MAIL-KEY. WRITE MAIL-REC-0; INVALID KEY DISPLAY "COULD NOT WRITE REC 0"; STOP RUN. CLOSE MAIL-FILE. ENTER MACRO RENAME USING BOX-NAME, BOX-NAME, REN-PROT, REN-ERR. IF REN-ERR NOT = ZERO DISPLAY "RENAME FAILED"; STOP RUN. GO TO MAIL-LOOP. HELP-MESSAGE. DISPLAY " ". DISPLAY "OPTIONS AVAILABLE IN THIS VERSION ARE:". DISPLAY " L (LIST ALL MESSAGES)". DISPLAY " S (SEND A MESSAGE)". DISPLAY " T N (TYPE MESSAGE N)". DISPLAY " K (KILL ALL MESSAGES)". DISPLAY " Q (QUIT MAILER [EXIT])". DISPLAY " ? (TYPE THIS MESSAGE)". DISPLAY " ". GO TO MAIL-LOOP. GET-A-PPN SECTION. MOVE SPACES TO BIG-PPN. ACCEPT BIG-PPN. MOVE ZERO TO PROJ, PROG, PPN-DEX. PROJ-LOOP. ADD 1 TO PPN-DEX. IF PPN-DEX = 21 GO TO EXIT-PPN. IF PPN-STUFF ( PPN-DEX ) = "," GO TO PROG-LOOP. IF PPN-STUFF ( PPN-DEX ) = " " GO TO PROJ-LOOP. IF PPN-STUFF ( PPN-DEX ) NOT NUMERIC DISPLAY "?? ENTER PPN: " WITH NO ADVANCING; GO TO GET-A-PPN. MULTIPLY PROJ BY 10 GIVING PROJ. MOVE PPN-STUFF ( PPN-DEX ) TO PPN-NUM. ADD PPN-NUM TO PROJ. GO TO PROJ-LOOP. PROG-LOOP. ADD 1 TO PPN-DEX. IF PPN-DEX = 21 GO TO EXIT-PPN. IF PPN-STUFF ( PPN-DEX ) = " " GO TO PROG-LOOP. IF PPN-STUFF ( PPN-DEX ) NOT NUMERIC DISPLAY "?? ENTER PPN: " WITH NO ADVANCING; GO TO GET-A-PPN. MULTIPLY PROG BY 10 GIVING PROG. MOVE PPN-STUFF ( PPN-DEX ) TO PPN-NUM. ADD PPN-NUM TO PROG. GO TO PROG-LOOP. EXIT-PPN. EXIT. GET-NUM SECTION. MOVE ZERO TO GN-NUM. GN-LOOP. ENTER FORTRAN-IV FRITZ USING CHARACTER. IF CHARACTER = 13; ENTER FORTRAN-IV FRITZ USING CHARACTER; GO TO GN-EXIT. IF CHARACTER = 127 DISPLAY " XXX"; MOVE 1 TO GN-FLAG; GO TO GN-EXIT. IF (CHARACTER < 48) OR (CHARACTER > 57) MOVE 1 TO GN-FLAG; DISPLAY " ? "; GO TO GN-EXIT. MOVE CHARACTER-TABLE ( CHARACTER + 1 ) TO NEW-NUM. DISPLAY NEW-NUM WITH NO ADVANCING. MULTIPLY GN-NUM BY 10 GIVING GN-NUM. ADD NEW-NUM TO GN-NUM. GO TO GN-LOOP. GN-EXIT. EXIT. SUBROUTINES SECTION. GET-MAIL. READ MAIL-FILE INVALID KEY DISPLAY "INVALID MAIL-FILE KEY = "MAIL-KEY; STOP RUN. PPN-OUT. EXAMINE DIS-PROJ TALLYING LEADING ZEROES. MOVE TALLY TO TEMP. ADD 1 TO TEMP. PERFORM PPN-TYPE VARYING PPN-DEX FROM TEMP BY 1 UNTIL PPN-DEX > 6. DISPLAY "," WITH NO ADVANCING. MOVE DIS-PROG TO DIS-PROJ. EXAMINE DIS-PROJ TALLYING LEADING ZEROES. MOVE TALLY TO TEMP. ADD 1 TO TEMP. PERFORM PPN-TYPE VARYING PPN-DEX FROM TEMP BY 1 UNTIL PPN-DEX > 6. DISPLAY "]". PPN-TYPE. DISPLAY DIS-PROJ-IND ( PPN-DEX ) WITH NO ADVANCING. SPNOR SECTION. SPNOR-PARA. MOVE 31 TO SPDEX. SPNOR-LOOP. SUBTRACT 1 FROM SPDEX. IF SPDEX = ZERO GO TO SPNOR-EXIT. IF SPNOR-VAR ( SPDEX ) = SPACE GO TO SPNOR-LOOP. MOVE SPDEX TO SPMAX. MOVE ZERO TO SPDEX. SP-LOOP. ADD 1 TO SPDEX. IF SPDEX = SPMAX + 1 GO TO SPNOR-EXIT. DISPLAY SPNOR-VAR ( SPDEX ) WITH NO ADVANCING. GO TO SP-LOOP. SPNOR-EXIT. DISPLAY " " WITH NO ADVANCING. MOVE SPACES TO SPNOR-HOLD.