EXTERNALROUTINE  VIEWTELL(STRING (255)S)
      EXTERNALINTEGERFNSPEC  C 
DCONNECT(STRING (6)USER, STRING (11)FILE, INTEGER  FSYS, MODE, APF, C 
      INTEGERNAME  SEG, GAP)
      EXTERNALINTEGERFNSPEC  C 
DDISCONNECT(STRING (6)USER, STRING (11)FILE, INTEGER  FSYS,DSTRY)
      EXTERNALINTEGERFNSPEC  C 
NWFILEAD(STRING (11)FILE, INTEGER  PGS)
      SYSTEMROUTINESPEC  C 
MOVE(INTEGER  LEN, FROM, TO)
      RECORDFORMAT  C 
UINFF (STRING (6) USER, STRING (31) JOBDOCFILE, C 
      INTEGER  MARK, FSYS, PROCNO, ISUFF, REASON, BATCHID, SESSICLIM, C 
      SCIDENSAD, SCIDENS, STARTCNSL, AIOSTAT, SCT DATE, C 
      SYNC1 DEST, SYNC2 DEST, ASYNC DEST, AACCT REC, AIC REVS, C 
      STRING (15)JOBNAME, STRING (31)BASEFILE, INTEGER  PREVIC, C 
      INTEGER  ITADDRO, ITADDR1, ITADDR2, ITADDR3, ITADDR4, C 
      STREAM ID, DIDENT, SCARCITY, PREEMPTAT, STRING (11)SPOOLRFILE, C 
      INTEGER  FUNDS, SESSLEN, PRIORITY, TAPES, DISCS, UEND)
EXTERNALROUTINESPEC  VIEW(STRING (63) S)
ROUTINESPEC  GET LAST MSG(INTEGER  B,INTEGERNAME  PP)
INTEGER  A, J, SEG, GAP
RECORD (UINFF) NAME  UINF
HALFINTEGER  VSTART
INTEGER  BASE,PTR,LEN,NEWPTR,SUCCESS,WRAP,RSTART,TOP
INTEGER  ST,FI,DIFF,REST,LASTPTR
STRING (4) VFINISH
OWNINTEGER  BELL=X'07'
   WRAP=0
   SUCCESS=0
   VSTART=M'!<'
   VFINISH="
!>
"
   ST=ADDR(VSTART)
   FI=ADDR(VFINISH)+1
      UINF == RECORD(9<<18)
      S = UINF_USER IF  S = ""
      SEG = 0
      GAP = 0
      J = DCONNECT(S, "#MSG", -1, 11, 0, SEG, GAP)
      UNLESS  0 # J # 34 START 
         A =NWFILEAD("T#OUT", 1)
         UNLESS  A = 0 START 
            MOVE(4096, SEG<<18, A)
            INTEGER(A+12) = 3; ! CH FILE
            PRINTSTRING("T#OUT WRITTEN")
            NEWLINE
         FINISH  ELSE  START 
            PRINTSTRING("NWFILEAD FAILED")
            WRITE(A,1); NEWLINE
         FINISH 
         BASE=NWFILEAD("SS#RETELL",2)
         IF  BASE=0 THEN  START 
            PRINTSTRING("NWFILEAD FAILED ")
            WRITE(BASE,1); NEWLINE
            RETURN 
            FINISH 
         INTEGER(BASE+12)=3
         NEWPTR=32
         TOP=INTEGER(A+8)
         PTR=INTEGER(A+24)
         RSTART=PTR
         CYCLE 
            LASTPTR=PTR
            GET LAST MSG(A,PTR)
            EXIT  IF  SUCCESS=1
            MOVE(2,ST,BASE+NEWPTR)
            NEWPTR=NEWPTR+2
            UNLESS  WRAP=2 THEN  START 
               LEN=LASTPTR-PTR
               MOVE(LEN,A+PTR,BASE+NEWPTR)
            FINISH  ELSE  START 
               DIFF=TOP-PTR
               MOVE(DIFF,A+PTR,BASE+NEWPTR)
              REST=LASTPTR-32
               MOVE(REST,A+32,BASE+NEWPTR+DIFF)
               LEN=DIFF+REST
               FINISH 
            MOVE(4,FI,BASE+NEWPTR+LEN)
            NEWPTR=NEWPTR+LEN+4
         REPEAT 
         IF  SUCCESS=1 THEN  START 
            PRINTSTRING("SS#RETELL WRITTEN SUCCESSFULLY")
            NEWLINE
            INTEGER(BASE)=NEWPTR
            VIEW("SS#RETELL")
            FINISH 
         J = DDISCONNECT(S, "#MSG", -1, 0) IF  J = 0
      FINISH 
      PRINTSTRING("J =") AND  WRITE(J, 1) IF  34 # J # 0
      NEWLINE
ROUTINE  GET LAST MSG(INTEGER  B,INTEGERNAME  PP)
INTEGER  P,SAVE,X
   P=PP
   IF  WRAP=2 THEN  WRAP=1
   CYCLE 
      CYCLE 
         P=P-1
         IF  P<=31 THEN  P=TOP-1 AND  WRAP=2
         IF  WRAP>0 AND  P<RSTART THEN  SUCCESS=1 AND  RETURN 
      REPEAT  UNTIL  BYTEINTEGER (B+P)='*'
      IF  BYTEINTEGER (B+P-1)='*' THEN  START 
         P=P-1
         PP=P
         IF  BYTEINTEGER(B+P+8)#BELL THEN  CONTINUE 
         X=B+P+1
         SAVE=BYTEINTEGER(X)
         BYTEINTEGER(X)=6
         IF  STRING(X)="MAILER" ORC 
             STRING(X)="VOLUMS" ORC 
             STRING(X)=S THEN  START 
            BYTEINTEGER(X)=SAVE
            LASTPTR=P
            IF  WRAP=2 THEN  WRAP=1
            CONTINUE 
         FINISH 
         BYTEINTEGER(X)=SAVE
         EXIT 
         FINISH 
   REPEAT 
END 
END 
ENDOFFILE