      SUBROUTINE MAIN
      COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(512), MSGFIL(40), 
     *REPLY(512)
      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 QUERY(55Husage:  sndmsg [-tfile] [-cfile] [-ssubject] [-rrepl
     *y].)
      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 ADDUSR(USER, UNIT)
      INTEGER UNIT, N
      INTEGER TBLOOK, ISATTY, PROMPT
      LOGICAL*1 USER(60), TEMP(40), UTEMP(60), C
      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)
23002 CONTINUE
      IF (.NOT.(TBLOOK(UTEMP, TEMP) .EQ. 1))GOTO 23005
      NUSERS = NUSERS + 1
      CALL PUTLIN(UTEMP, UNIT)
      CALL PUTCH(10, UNIT)
      GOTO 23004
23005 CONTINUE
      CALL PUTLIN(ERRMSG, 3)
      CALL REMARK(UTEMP)
      IF (.NOT.(ISATTY(1) .EQ. 1))GOTO 23007
      N = PROMPT(QPSTR, UTEMP, 1)
      C = CLOWER(UTEMP(1))
      IF (.NOT.(C .EQ. 114))GOTO 23009
      N=PROMPT(RPSTR,UTEMP,1)
      UTEMP(N)=0 
      GOTO 23010
23009 CONTINUE
      IF (.NOT.(C .EQ. 108))GOTO 23011
      CALL USRLST
      UTEMP(1) = 0 
      GOTO 23012
23011 CONTINUE
      RETURN
23012 CONTINUE
23010 CONTINUE
23007 CONTINUE
23006 CONTINUE
23003 GOTO 23002
23004 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 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 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 DOMLST(FILE, KEY, UNIT)
      INTEGER KEY, UNIT, INT, I
      INTEGER OPEN, GETLIN, INDEX, GETWRD
      LOGICAL*1 FILE(100), TOKEN(60)
      COMMON / SCRBUF / BUF(512)
      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 23013
23015 IF (.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23016
      I = INDEX(BUF, 35)
      IF (.NOT.(I .GT. 0))GOTO 23017
      BUF(I) = 0
23017 CONTINUE
      I = 1
      IF (.NOT.(GETWRD(BUF, I, TOKEN) .GT. 0))GOTO 23019
      CALL ADDUSR(TOKEN, UNIT)
23019 CONTINUE
      IF (.NOT.(KEY .EQ. 1))GOTO 23021
23023 IF (.NOT.(GETWRD(BUF, I, TOKEN) .GT. 0))GOTO 23024
      CALL ADDUSR(TOKEN, UNIT)
      GOTO 23023
23024 CONTINUE
23021 CONTINUE
      GOTO 23015
23016 CONTINUE
      CALL CLOSE(INT)
      GOTO 23014
23013 CONTINUE
      CALL PUTLIN(ERRMSG, 3)
      CALL REMARK(FILE)
23014 CONTINUE
      RETURN
      END
      SUBROUTINE DOTCST(FILE, PSTR, OUT, USER)
      INTEGER OUT, IN, I, J, N
      INTEGER OPEN, LENGTH, GETLIN
      LOGICAL*1 USER(512), 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 23025
      RETURN
23025 CONTINUE
      CALL PUTLIN(PSTR, OUT)
      J = 9
      I=GETLIN(USER,IN)
23027 IF (.NOT.(I .NE. -1))GOTO 23029
      USER(I) = 0
      N = J + LENGTH(USER) + 1
      IF (.NOT.(N .GT. 80))GOTO 23030
      CALL PUTCH(44, OUT)
      CALL PUTCH(10, OUT)
      CALL PUTLIN(BLS, OUT)
      J = 9
23030 CONTINUE
      IF (.NOT.(J .GT. 9))GOTO 23032
      CALL PUTCH(44, OUT)
23032 CONTINUE
      CALL PUTCH(32, OUT)
      CALL PUTLIN(USER, OUT)
      J = J + LENGTH(USER) + 2
23028 I=GETLIN(USER,IN)
      GOTO 23027
23029 CONTINUE
      CALL PUTCH(10, OUT)
      CALL CLOSE(IN)
      RETURN
      END
      SUBROUTINE EDITIT(FILE, BUF)
      LOGICAL*1 FILE(40), BUF(100), PROC(40), PID(7)
      INTEGER I, SSPAWN, LOCCOM
      LOGICAL*1 SUFFIX(7)
      LOGICAL*1 ED(3)
      DATA SUFFIX(1)/46/,SUFFIX(2)/116/,SUFFIX(3)/115/,SUFFIX(4)/107/,SU
     *FFIX(5)/0/,SUFFIX(6)/10/,SUFFIX(7)/0/
      DATA ED(1)/101/,ED(2)/100/,ED(3)/0/
      CALL IMPATH(BUF)
      IF (.NOT.(LOCCOM(ED, BUF, SUFFIX, PROC) .NE. 60))GOTO 23034
      CALL ERROR(28HCannot locate ed image file.)
23034 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 23036
      CALL ERROR(21HError in spawning ed!)
23036 CONTINUE
      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(512)
      INTEGER BP
      LOGICAL*1 BF
      LOGICAL*1 HELP(3)
      DATA HELP(1)/63/,HELP(2)/10/,HELP(3)/0/
23038 CONTINUE
23041 IF (.NOT.(BP .EQ. 0))GOTO 23042
      IF (.NOT.(PROMPT(PSTR, BF, INT) .EQ. -1))GOTO 23043
      GADTOK=(-1)
      RETURN
23043 CONTINUE
      IF (.NOT.(EQUAL(BF, HELP) .EQ. 1))GOTO 23045
      CALL ADHELP
      BP = 0
      GOTO 23046
23045 CONTINUE
      BP = 1
23046 CONTINUE
      GOTO 23041
23042 CONTINUE
      IF (.NOT.(BF(BP) .EQ. 10))GOTO 23047
      GADTOK=(-1)
      RETURN
23047 CONTINUE
      CALL SKIPBL(BF, BP)
      I=1
23049 CONTINUE
      IF (.NOT.(BF(BP) .EQ. 44 .OR. BF(BP) .EQ. 10))GOTO 23052
      GOTO 23051
23052 CONTINUE
      TOKEN(I) = BF(BP)
      BP = BP + 1
23050 I=I+1
      GOTO 23049
23051 CONTINUE
      TOKEN(I) = 0
      IF (.NOT.(BF(BP) .EQ. 44))GOTO 23054
      BP = BP + 1
      IF (.NOT.(BF(BP) .EQ. 10))GOTO 23056
      BP = 0
23056 CONTINUE
23054 CONTINUE
      CALL SQZBLK(TOKEN)
      I = LENGTH(TOKEN)
      IF (.NOT.(I .GT. 0))GOTO 23058
      GADTOK=(I)
      RETURN
23058 CONTINUE
23039 GOTO 23038
23040 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, ISATTY, PROMPT, GETLIN, FSIZE
      COMMON / SCRBUF / BUF(512)
      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 23060
      CALL SNDERR(ERRMSG)
23060 CONTINUE
      EDIT = 0
      IF (.NOT.(INFILE(1) .NE. 0))GOTO 23062
      INT = OPEN(INFILE, 1)
      GOTO 23063
23062 CONTINUE
      INT = 1
23063 CONTINUE
      IF (.NOT.(INT .EQ. 1 .AND. ISATTY(INT) .EQ. 1))GOTO 23064
      JUNK = PROMPT(PSTR, BUF, 1)
      IF (.NOT.(CLOWER(BUF(1)) .EQ. 121))GOTO 23066
      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 23067
23066 CONTINUE
      CALL PUTLIN(INPS, 3)
      CALL PUTLIN(EOFS, 3)
      CALL REMARK(10H to send).)
23067 CONTINUE
23064 CONTINUE
      IF (.NOT.(INT .EQ. -3))GOTO 23068
      CALL CLOSE(OUT)
      CALL SNDERR(ERRMSG)
23068 CONTINUE
23070 IF (.NOT.(GETLIN(BUF,INT) .NE. -1))GOTO 23071
      IF (.NOT.(CLOWER(BUF(1)) .EQ. 113 .AND. BUF(2) .EQ. 10 .AND. EDIT 
     *.EQ. 0 .AND. INT .EQ. 1))GOTO 23072
      CALL CLOSE(OUT)
      CALL REMOVE(OUTFIL)
      OUT = CREATE(OUTFIL, 2)
      GOTO 23071
23072 CONTINUE
      CALL PUTLIN(BUF, OUT)
23073 CONTINUE
      GOTO 23070
23071 CONTINUE
      CALL CLOSE(OUT)
      IF (.NOT.(FSIZE(OUTFIL) .EQ. 0))GOTO 23074
      CALL SNDERR(ERRMSG)
23074 CONTINUE
      IF (.NOT.(INT .NE. 1))GOTO 23076
      CALL CLOSE(INT)
23076 CONTINUE
      IF (.NOT.(EDIT .EQ. 1))GOTO 23078
      CALL REMOVE(FILE)
23078 CONTINUE
      RETURN
      END
      SUBROUTINE GETSBJ(SUBJCT)
      LOGICAL*1 SUBJCT(512)
      INTEGER N
      INTEGER PROMPT, ISATTY
      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. ISATTY(1) .EQ. 1))GOTO 23080
      N = PROMPT(PSTR, SUBJCT, 1)
      IF (.NOT.(N .GT. 0))GOTO 23082
      SUBJCT(N) = 0
      GOTO 23083
23082 CONTINUE
      SUBJCT(1) = 0
23083 CONTINUE
23080 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 23084
      CALL SNDERR(ERRMSG)
23084 CONTINUE
      CALL PSTMRK(OUT)
      INT = OPEN(TEMP3, 1)
      IF (.NOT.(INT .NE. -3))GOTO 23086
      CALL FCOPY(INT, OUT)
      CALL CLOSE(INT)
23086 CONTINUE
      CALL CLOSE(OUT)
      RETURN
      END
      SUBROUTINE PBINIT
      COMMON / CPB / BP, BF(512)
      INTEGER BP
      LOGICAL*1 BF
      BP = 0
      RETURN
      END
      SUBROUTINE PSTMRK(INT)
      INTEGER INT, NOW(7)
      LOGICAL*1 IDATE(10), ITIME(10), USER(60), HDRPAT(4)
      COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(512), MSGFIL(40), 
     *REPLY(512)
      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(512)
      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)
      CALL GETNOW(NOW)
      CALL FMTDAT(IDATE, ITIME, NOW, 1)
      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 23088
      CALL PUTLIN(REPLS, INT)
      CALL PUTLIN(REPLY, INT)
      CALL PUTCH(10, INT)
23088 CONTINUE
      CALL DOTCST(TEMP1, TOS, INT, BUF)
      CALL DOTCST(TEMP2, CCS, INT, BUF)
      CALL PUTCH(10, INT)
      RETURN
      END
      SUBROUTINE SDMAIL(MSG, MLIST)
      INTEGER INP, INT, N, JUNK, OUT, TOPFIL(2)
      INTEGER OPEN, GETLIN, TBLOOK, CREATE
      LOGICAL*1 MSG(100), MLIST(100), FILE(40)
      COMMON / SCRBUF / BUF(512)
      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 23090
      CALL MARKL(INP, TOPFIL)
      INT = OPEN(MLIST, 1)
      IF (.NOT.(INT .NE. -3))GOTO 23092
      N=GETLIN(BUF,INT)
23094 IF (.NOT.(N .NE. -1))GOTO 23096
      BUF(N) = 0
      JUNK = TBLOOK(BUF, FILE)
      CALL CONCAT(FILE, MYMAIL, FILE)
      CALL SEEK(TOPFIL, INP)
      OUT = CREATE(FILE, 4)
      IF (.NOT.(OUT .EQ. -3))GOTO 23097
      CALL PUTLIN(ERRMSG, 3)
      CALL REMARK(BUF)
      GOTO 23098
23097 CONTINUE
      CALL FCOPY(INP, OUT)
      CALL CLOSE(OUT)
      CALL PUTLIN(POSTED, 3)
      CALL REMARK(BUF)
23098 CONTINUE
23095 N=GETLIN(BUF,INT)
      GOTO 23094
23096 CONTINUE
      CALL CLOSE(INT)
23092 CONTINUE
      CALL CLOSE(INP)
23090 CONTINUE
      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, ISATTY
      LOGICAL*1 ALL(4)
      DATA ALL(1)/97/,ALL(2)/108/,ALL(3)/108/,ALL(4)/0/
      IF (.NOT.(INFILE(1) .EQ. 0))GOTO 23099
      IF (.NOT.(ISATTY(1) .EQ. 1))GOTO 23101
      INT = 1
      GOTO 23102
23101 CONTINUE
      INT = -3
23102 CONTINUE
      GOTO 23100
23099 CONTINUE
      INT = OPEN(INFILE, 1)
23100 CONTINUE
      IF (.NOT.(INT .EQ. -3))GOTO 23103
      RETURN
23103 CONTINUE
      OUT = CREATE(OUTFIL, 2)
      IF (.NOT.(OUT .NE. -3))GOTO 23105
      CALL PBINIT
23107 IF (.NOT.(GADTOK(PSTR, TOKEN, INT) .NE. -1))GOTO 23108
      CALL FOLD(TOKEN)
      IF (.NOT.(TOKEN(1) .EQ. 60))GOTO 23109
      CALL SCOPY(TOKEN, 2, TOKEN, 1)
      CALL DOMLST(TOKEN, 1, OUT)
      GOTO 23110
23109 CONTINUE
      IF (.NOT.(EQUAL(TOKEN, ALL) .EQ. 1))GOTO 23111
      CALL ADRFIL(TOKEN)
      CALL DOMLST(TOKEN, 2, OUT)
      GOTO 23112
23111 CONTINUE
      CALL ADDUSR(TOKEN, OUT)
23112 CONTINUE
23110 CONTINUE
      GOTO 23107
23108 CONTINUE
      CALL CLOSE(OUT)
23105 CONTINUE
      IF (.NOT.(INT .NE. 1))GOTO 23113
      CALL CLOSE(INT)
23113 CONTINUE
      RETURN
      END
      SUBROUTINE SNDCMD
      INTEGER I
      INTEGER GETARG, EQUAL
      LOGICAL*1 CLOWER
      COMMON / CSNDM / TOFILE(40), CCFILE(40), SUBJCT(512), MSGFIL(40), 
     *REPLY(512)
      LOGICAL*1 TOFILE
      LOGICAL*1 CCFILE
      LOGICAL*1 SUBJCT
      LOGICAL*1 MSGFIL
      LOGICAL*1 REPLY
      COMMON / SCRBUF / BUF(512)
      LOGICAL*1 BUF
      TOFILE(1) = 0
      CCFILE(1) = 0
      MSGFIL(1) = 0
      REPLY(1) = 0
      SUBJCT(1) = 0
      I=1
23115 IF (.NOT.(GETARG(I, BUF, 512) .NE. -1))GOTO 23117
      IF (.NOT.(BUF(1) .EQ. 45))GOTO 23118
      C = CLOWER(BUF(2))
      IF (.NOT.(C .EQ. 116))GOTO 23120
      CALL SCOPY(BUF, 3, TOFILE, 1)
      GOTO 23121
23120 CONTINUE
      IF (.NOT.(C .EQ. 99))GOTO 23122
      CALL SCOPY(BUF, 3, CCFILE, 1)
      GOTO 23123
23122 CONTINUE
      IF (.NOT.(C .EQ. 115))GOTO 23124
      CALL SCOPY(BUF, 3, SUBJCT, 1)
      GOTO 23125
23124 CONTINUE
      IF (.NOT.(C .EQ. 109))GOTO 23126
      CALL SCOPY(BUF, 3, MSGFIL, 1)
      GOTO 23127
23126 CONTINUE
      IF (.NOT.(C .EQ. 114))GOTO 23128
      CALL SCOPY(BUF, 3, REPLY, 1)
      GOTO 23129
23128 CONTINUE
      CALL BADARG(BUF)
23129 CONTINUE
23127 CONTINUE
23125 CONTINUE
23123 CONTINUE
23121 CONTINUE
      GOTO 23119
23118 CONTINUE
      CALL BADARG(BUF)
23119 CONTINUE
23116 I=I+1
      GOTO 23115
23117 CONTINUE
      RETURN
      END
      SUBROUTINE SNDERR(BUF)
      LOGICAL*1 BUF(100)
      CALL CLEANF
      CALL ERROR(BUF)
      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(512)
      LOGICAL*1 BUF
      INTEGER MEM(2000)
      LOGICAL*1 CMEM(4000)
      EQUIVALENCE (CMEM(1),MEM(1))
      COMMON/CDSMEM/MEM
      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(2000)
      CALL ADRFIL(FILE)
      INT = OPEN(FILE, 1)
      IF (.NOT.(INT .NE. -3))GOTO 23130
23132 IF (.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23133
      I = 1
      JUNK = GETWRD(BUF, I, USER)
      JUNK = GETWRD(BUF, I, FILE)
      CALL TBINST(USER, FILE)
      GOTO 23132
23133 CONTINUE
      CALL CLOSE(INT)
      GOTO 23131
23130 CONTINUE
      CALL ERROR(28HCannot open local user file.)
23131 CONTINUE
      CALL SCRATF(SM0, TEMP0)
      CALL SCRATF(SM1, TEMP1)
      CALL SCRATF(SM2, TEMP2)
      CALL SCRATF(SM3, TEMP3)
      RETURN
      END
      SUBROUTINE SQZBLK(TOKEN)
      LOGICAL*1 TOKEN(100)
      INTEGER I, J
      J = 1
      I=1
23134 IF (.NOT.(TOKEN(I) .NE. 0))GOTO 23136
      IF (.NOT.(TOKEN(I) .NE. 32 .AND. TOKEN(I) .NE. 9))GOTO 23137
      TOKEN(J) = TOKEN(I)
      J = J + 1
23137 CONTINUE
23135 I=I+1
      GOTO 23134
23136 CONTINUE
      TOKEN(J) = 0
      RETURN
      END
      SUBROUTINE USRLST
      LOGICAL*1 BUF(512), OBUF(512)
      INTEGER INT, I, NXTCOL
      INTEGER GETLIN, OPEN
      CALL ADRFIL(BUF)
      INT = OPEN(BUF, 1)
      CALL INPACK(NXTCOL, 80, OBUF, 3)
23139 IF (.NOT.(GETLIN(BUF, INT) .NE. -1))GOTO 23140
      I=1
23141 IF (.NOT.(BUF(I) .NE. 32 .AND. BUF(I) .NE. 9))GOTO 23143
23142 I=I+1
      GOTO 23141
23143 CONTINUE
      BUF(I) = 0
      CALL DOPACK(BUF, NXTCOL, 80, OBUF, 3)
      GOTO 23139
23140 CONTINUE
      CALL FLPACK(NXTCOL, 80, OBUF, 3)
      CALL CLOSE(INT)
      RETURN
      END
