SUBROUTINE MAIN COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(400), MSGFIL(40), *REPLY(400) LOGICAL*1 TOFILE LOGICAL*1 CCFILE LOGICAL*1 SUBJCT LOGICAL*1 MSGFIL LOGICAL*1 REPLY COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 LOGICAL*1 TOS(5) LOGICAL*1 CCS(5) LOGICAL*1 ERRMSG(31) DATA TOS(1)/84/,TOS(2)/111/,TOS(3)/58/,TOS(4)/32/,TOS(5)/0/ DATA CCS(1)/67/,CCS(2)/99/,CCS(3)/58/,CCS(4)/32/,CCS(5)/0/ DATA ERRMSG(1)/78/,ERRMSG(2)/111/,ERRMSG(3)/32/,ERRMSG(4)/118/,ERR *MSG(5)/97/,ERRMSG(6)/108/,ERRMSG(7)/105/,ERRMSG(8)/100/,ERRMSG(9)/ *32/,ERRMSG(10)/117/,ERRMSG(11)/115/,ERRMSG(12)/101/,ERRMSG(13)/114 */,ERRMSG(14)/32/,ERRMSG(15)/110/,ERRMSG(16)/97/,ERRMSG(17)/109/,ER *RMSG(18)/101/,ERRMSG(19)/115/,ERRMSG(20)/32/,ERRMSG(21)/115/,ERRMS *G(22)/112/,ERRMSG(23)/101/,ERRMSG(24)/99/,ERRMSG(25)/105/,ERRMSG(2 *6)/102/,ERRMSG(27)/105/,ERRMSG(28)/101/,ERRMSG(29)/100/,ERRMSG(30) */46/,ERRMSG(31)/0/ CALL SNDCMD CALL SNDINT NUSERS = 0 CALL SNDADR(TOFILE, TEMP1, TOS) CALL SNDADR(CCFILE, TEMP2, CCS) IF(.NOT.(NUSERS .EQ. 0))GOTO 23000 CALL SNDERR(ERRMSG) 23000 CONTINUE CALL GETSBJ(SUBJCT) CALL GENMSG(MSGFIL, TEMP3) CALL MMERGE CALL SDMAIL(TEMP0, TEMP1) CALL SDMAIL(TEMP0, TEMP2) CALL CLEANF RETURN END SUBROUTINE SNDCMD INTEGER I INTEGER GETARG, EQUAL LOGICAL*1 CLOWER COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(400), MSGFIL(40), *REPLY(400) LOGICAL*1 TOFILE LOGICAL*1 CCFILE LOGICAL*1 SUBJCT LOGICAL*1 MSGFIL LOGICAL*1 REPLY COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 QUEST(2) DATA QUEST(1)/63/,QUEST(2)/0/ TOFILE(1) = 0 CCFILE(1) = 0 MSGFIL(1) = 0 REPLY(1) = 0 SUBJCT(1) = 0 I=1 23002 IF(.NOT.(GETARG(I, BUF, 400) .NE. -1))GOTO 23004 IF(.NOT.(EQUAL(BUF, QUEST) .EQ. 1))GOTO 23005 CALL ERROR(55Husage: sndmsg [-tfile] [-cfile] [-ssubject] [-rrepl *y].) GOTO 23006 23005 CONTINUE IF(.NOT.(BUF(1) .EQ. 45))GOTO 23007 I23009=(CLOWER(BUF(2))) GOTO 23009 23011 CONTINUE CALL SCOPY(BUF, 3, TOFILE, 1) GOTO 23010 23012 CONTINUE CALL SCOPY(BUF, 3, CCFILE, 1) GOTO 23010 23013 CONTINUE CALL SCOPY(BUF, 3, SUBJCT, 1) GOTO 23010 23014 CONTINUE CALL SCOPY(BUF, 3, MSGFIL, 1) GOTO 23010 23015 CONTINUE CALL SCOPY(BUF, 3, REPLY, 1) GOTO 23010 23016 CONTINUE CALL BADARG(BUF) GOTO 23010 23009 CONTINUE IF(I23009.EQ.99)GOTO 23012 IF(I23009.EQ.109)GOTO 23014 IF(I23009.EQ.114)GOTO 23015 IF(I23009.EQ.115)GOTO 23013 IF(I23009.EQ.116)GOTO 23011 GOTO 23016 23010 CONTINUE GOTO 23008 23007 CONTINUE CALL BADARG(BUF) 23008 CONTINUE 23006 CONTINUE 23003 I=I+1 GOTO 23002 23004 CONTINUE RETURN END SUBROUTINE BADARG(ARG) LOGICAL*1 ARG(100) LOGICAL*1 ERRMSG(28) DATA ERRMSG(1)/73/,ERRMSG(2)/103/,ERRMSG(3)/110/,ERRMSG(4)/111/,ER *RMSG(5)/114/,ERRMSG(6)/105/,ERRMSG(7)/110/,ERRMSG(8)/103/,ERRMSG(9 *)/32/,ERRMSG(10)/105/,ERRMSG(11)/110/,ERRMSG(12)/118/,ERRMSG(13)/9 *7/,ERRMSG(14)/108/,ERRMSG(15)/105/,ERRMSG(16)/100/,ERRMSG(17)/32/, *ERRMSG(18)/97/,ERRMSG(19)/114/,ERRMSG(20)/103/,ERRMSG(21)/117/,ERR *MSG(22)/109/,ERRMSG(23)/101/,ERRMSG(24)/110/,ERRMSG(25)/116/,ERRMS *G(26)/58/,ERRMSG(27)/32/,ERRMSG(28)/0/ CALL PUTLIN(ERRMSG, 3) CALL REMARK(ARG) RETURN END SUBROUTINE SNDINT LOGICAL*1 USER(60), FILE(40) INTEGER INT, I, JUNK INTEGER OPEN, GETLIN, GETWRD COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 SM0(4) LOGICAL*1 SM1(4) LOGICAL*1 SM2(4) LOGICAL*1 SM3(4) DATA SM0(1)/115/,SM0(2)/109/,SM0(3)/48/,SM0(4)/0/ DATA SM1(1)/115/,SM1(2)/109/,SM1(3)/49/,SM1(4)/0/ DATA SM2(1)/115/,SM2(2)/109/,SM2(3)/50/,SM2(4)/0/ DATA SM3(1)/115/,SM3(2)/109/,SM3(3)/51/,SM3(4)/0/ CALL TBINIT CALL ADRFIL(FILE) INT = OPEN(FILE, 1) IF(.NOT.(INT .NE. -3))GOTO 23017 23019 IF(.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23020 I = 1 JUNK = GETWRD(BUF, I, USER) JUNK = GETWRD(BUF, I, FILE) CALL INSTAL(USER, FILE) GOTO 23019 23020 CONTINUE CALL CLOSE(INT) GOTO 23018 23017 CONTINUE CALL ERROR(28HCannot open local user file.) 23018 CONTINUE CALL SCRATF(SM0, TEMP0) CALL SCRATF(SM1, TEMP1) CALL SCRATF(SM2, TEMP2) CALL SCRATF(SM3, TEMP3) RETURN END SUBROUTINE CLEANF COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 CALL REMOVE(TEMP0) CALL REMOVE(TEMP1) CALL REMOVE(TEMP2) CALL REMOVE(TEMP3) RETURN END SUBROUTINE SNDERR(BUF) LOGICAL*1 BUF(100) CALL CLEANF CALL ERROR(BUF) RETURN END SUBROUTINE GETSBJ(SUBJCT) LOGICAL*1 SUBJCT(400) INTEGER N INTEGER PROMPT, TTY LOGICAL*1 PSTR(10) DATA PSTR(1)/83/,PSTR(2)/117/,PSTR(3)/98/,PSTR(4)/106/,PSTR(5)/101 */,PSTR(6)/99/,PSTR(7)/116/,PSTR(8)/58/,PSTR(9)/32/,PSTR(10)/0/ IF(.NOT.(SUBJCT(1) .EQ. 0 .AND. TTY(1) .EQ. 1))GOTO 23021 N = PROMPT(PSTR, SUBJCT, 1) IF(.NOT.(N .GT. 0))GOTO 23023 SUBJCT(N) = 0 GOTO 23024 23023 CONTINUE SUBJCT(1) = 0 23024 CONTINUE 23021 CONTINUE RETURN END SUBROUTINE SDMAIL(MSG, MLIST) INTEGER INP, INT, N, JUNK, OUT, TOPFIL(2) INTEGER OPEN, GETLIN, LOOKUP, CREATE LOGICAL*1 MSG(100), MLIST(100), FILE(40) COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 MYMAIL(7) LOGICAL*1 POSTED(16) LOGICAL*1 ERRMSG(21) DATA MYMAIL(1)/109/,MYMAIL(2)/121/,MYMAIL(3)/109/,MYMAIL(4)/97/,MY *MAIL(5)/105/,MYMAIL(6)/108/,MYMAIL(7)/0/ DATA POSTED(1)/77/,POSTED(2)/97/,POSTED(3)/105/,POSTED(4)/108/,POS *TED(5)/32/,POSTED(6)/112/,POSTED(7)/111/,POSTED(8)/115/,POSTED(9)/ *116/,POSTED(10)/101/,POSTED(11)/100/,POSTED(12)/32/,POSTED(13)/116 */,POSTED(14)/111/,POSTED(15)/32/,POSTED(16)/0/ DATA ERRMSG(1)/67/,ERRMSG(2)/97/,ERRMSG(3)/110/,ERRMSG(4)/110/,ERR *MSG(5)/111/,ERRMSG(6)/116/,ERRMSG(7)/32/,ERRMSG(8)/115/,ERRMSG(9)/ *101/,ERRMSG(10)/110/,ERRMSG(11)/100/,ERRMSG(12)/32/,ERRMSG(13)/109 */,ERRMSG(14)/97/,ERRMSG(15)/105/,ERRMSG(16)/108/,ERRMSG(17)/32/,ER *RMSG(18)/116/,ERRMSG(19)/111/,ERRMSG(20)/32/,ERRMSG(21)/0/ INP = OPEN(MSG, 1) IF(.NOT.(INP .NE. -3))GOTO 23025 CALL MARKL(INP, TOPFIL) INT = OPEN(MLIST, 1) IF(.NOT.(INT .NE. -3))GOTO 23027 N=GETLIN(BUF,INT) 23029 IF(.NOT.(N .NE. -1))GOTO 23031 BUF(N) = 0 JUNK = LOOKUP(BUF, FILE) CALL CONCAT(FILE, MYMAIL, FILE) CALL SEEK(TOPFIL, INP) OUT = CREATE(FILE, 4) IF(.NOT.(OUT .EQ. -3))GOTO 23032 CALL PUTLIN(ERRMSG, 3) CALL REMARK(BUF) GOTO 23033 23032 CONTINUE CALL FCOPY(INP, OUT) CALL CLOSE(OUT) CALL PUTLIN(POSTED, 3) CALL REMARK(BUF) 23033 CONTINUE 23030 N=GETLIN(BUF,INT) GOTO 23029 23031 CONTINUE CALL CLOSE(INT) 23027 CONTINUE CALL CLOSE(INP) 23025 CONTINUE RETURN END SUBROUTINE DOMLST(FILE, KEY, UNIT) INTEGER KEY, UNIT, INT, I INTEGER OPEN, GETLIN, INDEX, GETWRD LOGICAL*1 FILE(100), TOKEN(60) COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 ERRMSG(34) DATA ERRMSG(1)/69/,ERRMSG(2)/114/,ERRMSG(3)/114/,ERRMSG(4)/111/,ER *RMSG(5)/114/,ERRMSG(6)/32/,ERRMSG(7)/111/,ERRMSG(8)/112/,ERRMSG(9) */101/,ERRMSG(10)/110/,ERRMSG(11)/105/,ERRMSG(12)/110/,ERRMSG(13)/1 *03/,ERRMSG(14)/32/,ERRMSG(15)/109/,ERRMSG(16)/97/,ERRMSG(17)/105/, *ERRMSG(18)/108/,ERRMSG(19)/105/,ERRMSG(20)/110/,ERRMSG(21)/103/,ER *RMSG(22)/32/,ERRMSG(23)/108/,ERRMSG(24)/105/,ERRMSG(25)/115/,ERRMS *G(26)/116/,ERRMSG(27)/32/,ERRMSG(28)/102/,ERRMSG(29)/105/,ERRMSG(3 *0)/108/,ERRMSG(31)/101/,ERRMSG(32)/58/,ERRMSG(33)/32/,ERRMSG(34)/0 */ INT = OPEN(FILE, 1) IF(.NOT.(INT .NE. -3))GOTO 23034 23036 IF(.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23037 I = INDEX(BUF, 35) IF(.NOT.(I .GT. 0))GOTO 23038 BUF(I) = 0 23038 CONTINUE I = 1 IF(.NOT.(GETWRD(BUF, I, TOKEN) .GT. 0))GOTO 23040 CALL ADDUSR(TOKEN, UNIT) 23040 CONTINUE IF(.NOT.(KEY .EQ. 1))GOTO 23042 23044 IF(.NOT.(GETWRD(BUF, I, TOKEN) .GT. 0))GOTO 23045 CALL ADDUSR(TOKEN, UNIT) GOTO 23044 23045 CONTINUE 23042 CONTINUE GOTO 23036 23037 CONTINUE CALL CLOSE(INT) GOTO 23035 23034 CONTINUE CALL PUTLIN(ERRMSG, 3) CALL REMARK(FILE) 23035 CONTINUE RETURN END SUBROUTINE ADDUSR(USER, UNIT) INTEGER UNIT, N INTEGER LOOKUP, TTY, PROMPT LOGICAL*1 USER(60), TEMP(40), UTEMP(60) LOGICAL*1 CLOWER COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 LOGICAL*1 ERRMSG(20) LOGICAL*1 QPSTR(65) LOGICAL*1 RPSTR(22) DATA ERRMSG(1)/73/,ERRMSG(2)/110/,ERRMSG(3)/118/,ERRMSG(4)/97/,ERR *MSG(5)/108/,ERRMSG(6)/105/,ERRMSG(7)/100/,ERRMSG(8)/32/,ERRMSG(9)/ *117/,ERRMSG(10)/115/,ERRMSG(11)/101/,ERRMSG(12)/114/,ERRMSG(13)/32 */,ERRMSG(14)/110/,ERRMSG(15)/97/,ERRMSG(16)/109/,ERRMSG(17)/101/,E *RRMSG(18)/58/,ERRMSG(19)/32/,ERRMSG(20)/0/ DATA QPSTR(1)/68/,QPSTR(2)/111/,QPSTR(3)/32/,QPSTR(4)/121/,QPSTR(5 *)/111/,QPSTR(6)/117/,QPSTR(7)/32/,QPSTR(8)/119/,QPSTR(9)/105/,QPST *R(10)/115/,QPSTR(11)/104/,QPSTR(12)/32/,QPSTR(13)/116/,QPSTR(14)/1 *11/,QPSTR(15)/32/,QPSTR(16)/102/,QPSTR(17)/91/,QPSTR(18)/111/,QPST *R(19)/114/,QPSTR(20)/103/,QPSTR(21)/101/,QPSTR(22)/116/,QPSTR(23)/ *32/,QPSTR(24)/105/,QPSTR(25)/116/,QPSTR(26)/93/,QPSTR(27)/44/,QPST *R(28)/32/,QPSTR(29)/114/,QPSTR(30)/91/,QPSTR(31)/101/,QPSTR(32)/11 *2/,QPSTR(33)/108/,QPSTR(34)/97/,QPSTR(35)/99/,QPSTR(36)/101/,QPSTR *(37)/32/,QPSTR(38)/105/,QPSTR(39)/116/,QPSTR(40)/93/,QPSTR(41)/32/ *,QPSTR(42)/111/,QPSTR(43)/114/,QPSTR(44)/32/,QPSTR(45)/108/,QPSTR( *46)/91/,QPSTR(47)/105/,QPSTR(48)/115/,QPSTR(49)/116/,QPSTR(50)/32/ *,QPSTR(51)/118/,QPSTR(52)/97/,QPSTR(53)/108/,QPSTR(54)/105/,QPSTR( *55)/100/,QPSTR(56)/32/,QPSTR(57)/117/,QPSTR(58)/115/,QPSTR(59)/101 */,QPSTR(60)/114/,QPSTR(61)/115/,QPSTR(62)/93/,QPSTR(63)/63/,QPSTR( *64)/32/,QPSTR(65)/0/ DATA RPSTR(1)/82/,RPSTR(2)/101/,RPSTR(3)/112/,RPSTR(4)/108/,RPSTR( *5)/97/,RPSTR(6)/99/,RPSTR(7)/101/,RPSTR(8)/109/,RPSTR(9)/101/,RPST *R(10)/110/,RPSTR(11)/116/,RPSTR(12)/32/,RPSTR(13)/97/,RPSTR(14)/10 *0/,RPSTR(15)/100/,RPSTR(16)/114/,RPSTR(17)/101/,RPSTR(18)/115/,RPS *TR(19)/115/,RPSTR(20)/58/,RPSTR(21)/32/,RPSTR(22)/0/ CALL SCOPY(USER, 1, UTEMP, 1) 23046 CONTINUE IF(.NOT.(LOOKUP(UTEMP, TEMP) .EQ. 1))GOTO 23049 NUSERS = NUSERS + 1 CALL PUTLIN(UTEMP, UNIT) CALL PUTCH(10, UNIT) GOTO 23048 23049 CONTINUE CALL PUTLIN(ERRMSG, 3) CALL REMARK(UTEMP) IF(.NOT.(TTY(1) .EQ. 1))GOTO 23051 N = PROMPT(QPSTR, UTEMP, 1) I23053=(CLOWER(UTEMP(1))) GOTO 23053 23055 CONTINUE N=PROMPT(RPSTR,UTEMP,1) UTEMP(N)=0 GOTO 23054 23056 CONTINUE CALL USRLST UTEMP(1) = 0 GOTO 23054 23057 CONTINUE RETURN 23053 CONTINUE IF(I23053.EQ.108)GOTO 23056 IF(I23053.EQ.114)GOTO 23055 GOTO 23057 23054 CONTINUE 23051 CONTINUE 23050 CONTINUE 23047 GOTO 23046 23048 CONTINUE RETURN END SUBROUTINE PBINIT COMMON / CPB / BP, BF(400) INTEGER BP LOGICAL*1 BF BP = 0 RETURN END SUBROUTINE SNDADR(INFILE, OUTFIL, PSTR) LOGICAL*1 INFILE(100), OUTFIL(100), PSTR(100), TOKEN(60) INTEGER INT, OUT INTEGER OPEN, CREATE, GADTOK, EQUAL, TTY LOGICAL*1 ALL(4) DATA ALL(1)/97/,ALL(2)/108/,ALL(3)/108/,ALL(4)/0/ IF(.NOT.(INFILE(1) .EQ. 0))GOTO 23058 IF(.NOT.(TTY(1) .EQ. 1))GOTO 23060 INT = 1 GOTO 23061 23060 CONTINUE INT = -3 23061 CONTINUE GOTO 23059 23058 CONTINUE INT = OPEN(INFILE, 1) 23059 CONTINUE IF(.NOT.(INT .EQ. -3))GOTO 23062 RETURN 23062 CONTINUE OUT = CREATE(OUTFIL, 2) IF(.NOT.(OUT .NE. -3))GOTO 23064 CALL PBINIT 23066 IF(.NOT.(GADTOK(PSTR, TOKEN, INT) .NE. -1))GOTO 23067 IF(.NOT.(TOKEN(1) .EQ. 60))GOTO 23068 CALL SCOPY(TOKEN, 2, TOKEN, 1) CALL DOMLST(TOKEN, 1, OUT) GOTO 23069 23068 CONTINUE IF(.NOT.(EQUAL(TOKEN, ALL) .EQ. 1))GOTO 23070 CALL ADRFIL(TOKEN) CALL DOMLST(TOKEN, 2, OUT) GOTO 23071 23070 CONTINUE CALL ADDUSR(TOKEN, OUT) 23071 CONTINUE 23069 CONTINUE GOTO 23066 23067 CONTINUE CALL CLOSE(OUT) 23064 CONTINUE IF(.NOT.(INT .NE. 1))GOTO 23072 CALL CLOSE(INT) 23072 CONTINUE RETURN END SUBROUTINE MMERGE INTEGER OUT, INT INTEGER CREATE, OPEN COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 LOGICAL*1 ERRMSG(21) DATA ERRMSG(1)/69/,ERRMSG(2)/114/,ERRMSG(3)/114/,ERRMSG(4)/111/,ER *RMSG(5)/114/,ERRMSG(6)/32/,ERRMSG(7)/111/,ERRMSG(8)/112/,ERRMSG(9) */101/,ERRMSG(10)/110/,ERRMSG(11)/105/,ERRMSG(12)/110/,ERRMSG(13)/1 *03/,ERRMSG(14)/32/,ERRMSG(15)/116/,ERRMSG(16)/101/,ERRMSG(17)/109/ *,ERRMSG(18)/112/,ERRMSG(19)/48/,ERRMSG(20)/46/,ERRMSG(21)/0/ OUT = CREATE(TEMP0, 2) IF(.NOT.(OUT .EQ. -3))GOTO 23074 CALL SNDERR(ERRMSG) 23074 CONTINUE CALL PSTMRK(OUT) INT = OPEN(TEMP3, 1) IF(.NOT.(INT .NE. -3))GOTO 23076 CALL FCOPY(INT, OUT) CALL CLOSE(INT) 23076 CONTINUE CALL CLOSE(OUT) RETURN END SUBROUTINE PSTMRK(INT) INTEGER INT LOGICAL*1 IDATE(10), ITIME(10), USER(60), HDRPAT(4) COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(400), MSGFIL(40), *REPLY(400) LOGICAL*1 TOFILE LOGICAL*1 CCFILE LOGICAL*1 SUBJCT LOGICAL*1 MSGFIL LOGICAL*1 REPLY COMMON / SNDSCR / NUSERS, TEMP0(40), TEMP1(40), TEMP2(40), TEMP3(4 *0) INTEGER NUSERS LOGICAL*1 TEMP0 LOGICAL*1 TEMP1 LOGICAL*1 TEMP2 LOGICAL*1 TEMP3 COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 DATES(10) LOGICAL*1 DASHST(4) LOGICAL*1 TIMZON(4) LOGICAL*1 FROMS(10) LOGICAL*1 SUBJS(10) LOGICAL*1 REPLS(14) LOGICAL*1 TOS(9) LOGICAL*1 CCS(9) DATA DATES(1)/68/,DATES(2)/97/,DATES(3)/116/,DATES(4)/101/,DATES(5 *)/58/,DATES(6)/32/,DATES(7)/32/,DATES(8)/32/,DATES(9)/32/,DATES(10 *)/0/ DATA DASHST(1)/32/,DASHST(2)/45/,DASHST(3)/32/,DASHST(4)/0/ DATA TIMZON(1)/80/,TIMZON(2)/83/,TIMZON(3)/84/,TIMZON(4)/0/ DATA FROMS(1)/70/,FROMS(2)/114/,FROMS(3)/111/,FROMS(4)/109/,FROMS( *5)/58/,FROMS(6)/32/,FROMS(7)/32/,FROMS(8)/32/,FROMS(9)/32/,FROMS(1 *0)/0/ DATA SUBJS(1)/83/,SUBJS(2)/117/,SUBJS(3)/98/,SUBJS(4)/106/,SUBJS(5 *)/101/,SUBJS(6)/99/,SUBJS(7)/116/,SUBJS(8)/58/,SUBJS(9)/32/,SUBJS( *10)/0/ DATA REPLS(1)/73/,REPLS(2)/110/,REPLS(3)/45/,REPLS(4)/114/,REPLS(5 *)/101/,REPLS(6)/112/,REPLS(7)/108/,REPLS(8)/121/,REPLS(9)/45/,REPL *S(10)/116/,REPLS(11)/111/,REPLS(12)/58/,REPLS(13)/32/,REPLS(14)/0/ DATA TOS(1)/84/,TOS(2)/111/,TOS(3)/58/,TOS(4)/32/,TOS(5)/32/,TOS(6 *)/32/,TOS(7)/32/,TOS(8)/32/,TOS(9)/0/ DATA CCS(1)/67/,CCS(2)/99/,CCS(3)/58/,CCS(4)/32/,CCS(5)/32/,CCS(6) */32/,CCS(7)/32/,CCS(8)/32/,CCS(9)/0/ DATA HDRPAT/1, 1, 10, 0/ CALL MAILID(USER, BUF) CALL GDATE(IDATE) CALL GTIME(ITIME) CALL PUTLIN(HDRPAT, INT) CALL PUTLIN(DATES, INT) CALL PUTLIN(IDATE, INT) CALL PUTCH(32, INT) CALL PUTLIN(ITIME, INT) CALL PUTLIN(DASHST, INT) CALL PUTLIN(TIMZON, INT) CALL PUTCH(10, INT) CALL PUTLIN(FROMS, INT) CALL PUTLIN(USER, INT) CALL PUTCH(10, INT) CALL PUTLIN(SUBJS, INT) CALL PUTLIN(SUBJCT, INT) CALL PUTCH(10, INT) IF(.NOT.(REPLY(1) .NE. 0))GOTO 23078 CALL PUTLIN(REPLS, INT) CALL PUTLIN(REPLY, INT) CALL PUTCH(10, INT) 23078 CONTINUE CALL DOTCST(TEMP1, TOS, INT, BUF) CALL DOTCST(TEMP2, CCS, INT, BUF) CALL PUTCH(10, INT) RETURN END INTEGER FUNCTION GADTOK(PSTR, TOKEN, INT) INTEGER I, INT INTEGER PROMPT, LENGTH, EQUAL LOGICAL*1 PSTR(100), TOKEN(60) COMMON / CPB / BP, BF(400) INTEGER BP LOGICAL*1 BF LOGICAL*1 HELP(3) DATA HELP(1)/63/,HELP(2)/10/,HELP(3)/0/ 23080 CONTINUE 23083 IF(.NOT.(BP .EQ. 0))GOTO 23084 IF(.NOT.(PROMPT(PSTR, BF, INT) .EQ. -1))GOTO 23085 GADTOK=(-1) RETURN 23085 CONTINUE IF(.NOT.(EQUAL(BF, HELP) .EQ. 1))GOTO 23087 CALL ADHELP BP = 0 GOTO 23088 23087 CONTINUE BP = 1 23088 CONTINUE GOTO 23083 23084 CONTINUE IF(.NOT.(BF(BP) .EQ. 10))GOTO 23089 GADTOK=(-1) RETURN 23089 CONTINUE CALL SKIPBL(BF, BP) I=1 23091 CONTINUE IF(.NOT.(BF(BP) .EQ. 44 .OR. BF(BP) .EQ. 10))GOTO 23094 GOTO 23093 23094 CONTINUE TOKEN(I) = BF(BP) BP = BP + 1 23092 I=I+1 GOTO 23091 23093 CONTINUE TOKEN(I) = 0 IF(.NOT.(BF(BP) .EQ. 44))GOTO 23096 BP = BP + 1 IF(.NOT.(BF(BP) .EQ. 10))GOTO 23098 BP = 0 23098 CONTINUE 23096 CONTINUE CALL SQZBLK(TOKEN) I = LENGTH(TOKEN) IF(.NOT.(I .GT. 0))GOTO 23100 GADTOK=(I) RETURN 23100 CONTINUE 23081 GOTO 23080 23082 CONTINUE END SUBROUTINE GENMSG(INFILE, OUTFIL) LOGICAL*1 INFILE(100), OUTFIL(100), FILE(40) LOGICAL*1 CLOWER INTEGER OUT, EDIT, INT, JUNK INTEGER CREATE, OPEN, TTY, PROMPT, GETLIN, FSIZE COMMON / SCRBUF / BUF(400) LOGICAL*1 BUF LOGICAL*1 ERRMSG(34) LOGICAL*1 PSTR(50) LOGICAL*1 SDE(4) LOGICAL*1 INPS(35) LOGICAL*1 EOFS(3) DATA ERRMSG(1)/69/,ERRMSG(2)/114/,ERRMSG(3)/114/,ERRMSG(4)/111/,ER *RMSG(5)/114/,ERRMSG(6)/32/,ERRMSG(7)/103/,ERRMSG(8)/101/,ERRMSG(9) */110/,ERRMSG(10)/101/,ERRMSG(11)/114/,ERRMSG(12)/97/,ERRMSG(13)/11 *6/,ERRMSG(14)/105/,ERRMSG(15)/110/,ERRMSG(16)/103/,ERRMSG(17)/32/, *ERRMSG(18)/109/,ERRMSG(19)/101/,ERRMSG(20)/115/,ERRMSG(21)/115/,ER *RMSG(22)/97/,ERRMSG(23)/103/,ERRMSG(24)/101/,ERRMSG(25)/32/,ERRMSG *(26)/116/,ERRMSG(27)/111/,ERRMSG(28)/32/,ERRMSG(29)/115/,ERRMSG(30 *)/101/,ERRMSG(31)/110/,ERRMSG(32)/100/,ERRMSG(33)/46/,ERRMSG(34)/0 */ DATA PSTR(1)/68/,PSTR(2)/111/,PSTR(3)/32/,PSTR(4)/121/,PSTR(5)/111 */,PSTR(6)/117/,PSTR(7)/32/,PSTR(8)/119/,PSTR(9)/97/,PSTR(10)/110/, *PSTR(11)/116/,PSTR(12)/32/,PSTR(13)/116/,PSTR(14)/111/,PSTR(15)/32 */,PSTR(16)/117/,PSTR(17)/115/,PSTR(18)/101/,PSTR(19)/32/,PSTR(20)/ *101/,PSTR(21)/100/,PSTR(22)/32/,PSTR(23)/116/,PSTR(24)/111/,PSTR(2 *5)/32/,PSTR(26)/99/,PSTR(27)/114/,PSTR(28)/101/,PSTR(29)/97/,PSTR( *30)/116/,PSTR(31)/101/,PSTR(32)/32/,PSTR(33)/121/,PSTR(34)/111/,PS *TR(35)/117/,PSTR(36)/114/,PSTR(37)/32/,PSTR(38)/109/,PSTR(39)/97/, *PSTR(40)/105/,PSTR(41)/108/,PSTR(42)/63/,PSTR(43)/32/,PSTR(44)/91/ *,PSTR(45)/121/,PSTR(46)/47/,PSTR(47)/110/,PSTR(48)/93/,PSTR(49)/32 */,PSTR(50)/0/ DATA SDE(1)/115/,SDE(2)/100/,SDE(3)/101/,SDE(4)/0/ DATA INPS(1)/73/,INPS(2)/110/,INPS(3)/112/,INPS(4)/117/,INPS(5)/11 *6/,INPS(6)/32/,INPS(7)/109/,INPS(8)/101/,INPS(9)/115/,INPS(10)/115 */,INPS(11)/97/,INPS(12)/103/,INPS(13)/101/,INPS(14)/58/,INPS(15)/3 *2/,INPS(16)/40/,INPS(17)/116/,INPS(18)/121/,INPS(19)/112/,INPS(20) */101/,INPS(21)/32/,INPS(22)/113/,INPS(23)/32/,INPS(24)/116/,INPS(2 *5)/111/,INPS(26)/32/,INPS(27)/113/,INPS(28)/117/,INPS(29)/105/,INP *S(30)/116/,INPS(31)/32/,INPS(32)/111/,INPS(33)/114/,INPS(34)/32/,I *NPS(35)/0/ DATA EOFS(1)/94/,EOFS(2)/90/,EOFS(3)/0/ OUT = CREATE(OUTFIL, 2) IF(.NOT.(OUT .EQ. -3))GOTO 23102 CALL SNDERR(ERRMSG) 23102 CONTINUE EDIT = 0 IF(.NOT.(INFILE(1) .NE. 0))GOTO 23104 INT = OPEN(INFILE, 1) GOTO 23105 23104 CONTINUE INT = 1 23105 CONTINUE IF(.NOT.(INT .EQ. 1 .AND. TTY(INT) .EQ. 1))GOTO 23106 JUNK = PROMPT(PSTR, BUF, 1) IF(.NOT.(CLOWER(BUF(1)) .EQ. 121))GOTO 23108 EDIT = 1 CALL SCRATF(SDE, FILE) CALL REMARK(44HYou are now entering ed to create your mail.) CALL REMARK(43HPlease wait for ed to prompt for a command.) CALL EDITIT(FILE, BUF) INT = OPEN(FILE, 1) GOTO 23109 23108 CONTINUE CALL PUTLIN(INPS, 3) CALL PUTLIN(EOFS, 3) CALL REMARK(10H to send).) 23109 CONTINUE 23106 CONTINUE IF(.NOT.(INT .EQ. -3))GOTO 23110 CALL CLOSE(OUT) CALL SNDERR(ERRMSG) 23110 CONTINUE 23112 IF(.NOT.(GETLIN(BUF,INT) .NE. -1))GOTO 23113 IF(.NOT.(CLOWER(BUF(1)) .EQ. 113 .AND. BUF(2) .EQ. 10 .AND. EDIT . *EQ. 0 .AND. INT .EQ. 1))GOTO 23114 CALL CLOSE(OUT) CALL REMOVE(OUTFIL) OUT = CREATE(OUTFIL, 2) GOTO 23113 23114 CONTINUE CALL PUTLIN(BUF, OUT) 23115 CONTINUE GOTO 23112 23113 CONTINUE CALL CLOSE(OUT) IF(.NOT.(FSIZE(OUTFIL) .EQ. 0))GOTO 23116 CALL SNDERR(ERRMSG) 23116 CONTINUE IF(.NOT.(INT .NE. 1))GOTO 23118 CALL CLOSE(INT) 23118 CONTINUE IF(.NOT.(EDIT .EQ. 1))GOTO 23120 CALL REMOVE(FILE) 23120 CONTINUE RETURN END SUBROUTINE SQZBLK(TOKEN) LOGICAL*1 TOKEN(100) INTEGER I, J J = 1 I=1 23122 IF(.NOT.(TOKEN(I) .NE. 0))GOTO 23124 IF(.NOT.(TOKEN(I) .NE. 32 .AND. TOKEN(I) .NE. 9))GOTO 23125 TOKEN(J) = TOKEN(I) J = J + 1 23125 CONTINUE 23123 I=I+1 GOTO 23122 23124 CONTINUE TOKEN(J) = 0 RETURN END SUBROUTINE EDITIT(FILE, BUF) LOGICAL*1 FILE(40), BUF(100), PROC(40), PID(7) INTEGER I, SSPAWN, LOCCOM LOGICAL*1 ED(3) DATA ED(1)/101/,ED(2)/100/,ED(3)/0/ CALL IMPATH(BUF) IF(.NOT.(LOCCOM(ED, BUF, PROC) .NE. 60))GOTO 23127 CALL ERROR(28HCannot locate ed image file.) 23127 CONTINUE I = 1 CALL STCOPY(ED, 1, BUF, I) CALL CHCOPY(32, BUF, I) CALL SCOPY(FILE, 1, BUF, I) IF(.NOT.(SSPAWN(PROC, BUF, PID, 119) .NE. 0))GOTO 23129 CALL ERROR(21HError in spawning ed!) 23129 CONTINUE RETURN END SUBROUTINE ADHELP CALL REMARK(54HValid responses to the To and Cc prompts are sequen *ces) CALL REMARK(53Hof usernames separated by commas. If it is necessa *ry) CALL REMARK(54Hto continue the list of users on the next line, sim *ply) CALL REMARK(48Htype a comma before hitting the carriage return.) CALL PUTCH(10, 3) CALL REMARK(54HIf the username 'all' is specified, all known users * on) CALL REMARK(54Hthe system will be included. A username preceded b *y a) CALL REMARK(54Hless than symbol (<) is taken to be the name of a f *ile) CALL REMARK(54Hcontaining usernames separated by blanks and tabs ( *old) CALL REMARK(54Hmail style mailing lists), and each user found ther *ein) CALL REMARK(17Hwill be included.) CALL PUTCH(10, 3) RETURN END SUBROUTINE DOTCST(FILE, PSTR, OUT, USER) INTEGER OUT, IN, I, J, N INTEGER OPEN, LENGTH, GETLIN LOGICAL*1 USER(400), FILE(100), PSTR(100) LOGICAL*1 BLS(9) DATA BLS(1)/32/,BLS(2)/32/,BLS(3)/32/,BLS(4)/32/,BLS(5)/32/,BLS(6) */32/,BLS(7)/32/,BLS(8)/32/,BLS(9)/0/ IN = OPEN(FILE, 1) IF(.NOT.(IN .EQ. -3))GOTO 23131 RETURN 23131 CONTINUE CALL PUTLIN(PSTR, OUT) J = 9 I=GETLIN(USER,IN) 23133 IF(.NOT.(I .NE. -1))GOTO 23135 USER(I) = 0 N = J + LENGTH(USER) + 1 IF(.NOT.(N .GT. 80))GOTO 23136 CALL PUTCH(44, OUT) CALL PUTCH(10, OUT) CALL PUTLIN(BLS, OUT) J = 9 23136 CONTINUE IF(.NOT.(J .GT. 9))GOTO 23138 CALL PUTCH(44, OUT) 23138 CONTINUE CALL PUTCH(32, OUT) CALL PUTLIN(USER, OUT) J = J + LENGTH(USER) + 2 23134 I=GETLIN(USER,IN) GOTO 23133 23135 CONTINUE CALL PUTCH(10, OUT) CALL CLOSE(IN) RETURN END SUBROUTINE USRLST LOGICAL*1 BUF(400), OBUF(400) INTEGER INT, I, NXTCOL INTEGER GETLIN, OPEN CALL ADRFIL(BUF) INT = OPEN(BUF, 1) CALL INPACK(NXTCOL, 80, OBUF, 3) 23140 IF(.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23141 I=1 23142 IF(.NOT.(BUF(I) .NE. 32 .AND. BUF(I) .NE. 9))GOTO 23144 23143 I=I+1 GOTO 23142 23144 CONTINUE BUF(I) = 0 CALL DOPACK(BUF, NXTCOL, 80, OBUF, 3) GOTO 23140 23141 CONTINUE CALL FLPACK(NXTCOL, 80, OBUF, 3) CALL CLOSE(INT) RETURN END