EXTERNALROUTINESPEC DEFINE(STRING (63)S)
EXTERNALROUTINE COMPRESSEM(STRING (63)S)
!***********************************************************************
!* COMPRESSES A FILE OF ERROR MESSAGE INTO TWO CONSTARRAYS AND *
!* GENERATES A ROUTINE TO REGURGITATE THEM IN ENGLISH *
!***********************************************************************
INTEGER CPSTRM,INSTRM,LPSTRM
BYTEINTEGERARRAY WORD(0:1000)
INTEGERARRAY LETT(0:256)
INTEGER I, J, K, N, NUM, NEXT, NMAX
STRING (31) FILE1, FILE2, FILE3
STRING (71)TEMP
STRING (71)FNSPEC MESS(INTEGER N)
ROUTINESPEC LIT(INTEGERNAME P)
ROUTINESPEC CARDS OUT
UNLESS S->FILE1.(",").FILE2.(",").FILE3 THEN C
PRINTSTRING("PARAMS??") AND RETURN
DEFINE("ST49,".FILE1)
INSTRM=49
SELECT INPUT(INSTRM)
DEFINE("ST50,".FILE2)
CPSTRM=50
DEFINE("ST51,".FILE3)
LPSTRM=51
SELECT OUTPUT(LPSTRM)
CYCLE I=0,1,1000; WORD(I)=0
REPEAT
LETT(0)=0
NEXT=1; NUM=1; NMAX=0
RMESS:READ(N); NMAX=N IF N>NMAX
NEWLINE; WRITE(N,5)
IF N=0 THEN ->OUTPUT
J=1; WORD(NUM)=N
RSYM: READ SYMBOL(I)
->SC IF I=';' OR I=NL
->RSYM UNLESS I=''''
LIT(I)
IF J=5 THEN START
PRINTSTRING(" MESSAGE TOO LONG")
MONITOR
STOP
FINISH
WORD(NUM+J)=I; J=J+1; ->RSYM
SC: NUM=NUM+5; ->RMESS
OUTPUT:
NEWLINES(2)
CYCLE I=1,1,NMAX
TEMP=MESS(I)
IF TEMP#"" THEN START
NEWLINE; WRITE(I,5)
PRINTSTRING(TEMP)
FINISH
REPEAT
CARDS OUT
SELECT OUTPUT(0)
PRINTSTRING("ROUTINE MESSAGE GENERATED
"); STOP
STRING (71)FN MESS(INTEGER N)
STRING (70)OMESS
INTEGER I, J, K, M, Q, S
OMESS=" ("
CYCLE I=1,5,NUM-5
->FOUND IF N=WORD(I)
REPEAT
RESULT =""
FOUND: CYCLE J=1,1,4
K=WORD(I+J)
IF K=0 THEN EXIT
OMESS=OMESS." " UNLESS J=1
UNTIL M&1=0 CYCLE
M=LETT(K); S=26
UNTIL S<0 CYCLE
Q=M>>S&31
IF Q=31 THEN Q=-32
IF Q¬=0 THEN OMESS=OMESS.TOSTRING(Q+64)
S=S-5
REPEAT
K=K+1
REPEAT
REPEAT
OMESS=OMESS.")"
RESULT =OMESS
END
ROUTINE LIT(INTEGERNAME P)
INTEGER I, J, K, L, N, SH
N=0; J=0
SH=26; L=0
AGN: READ SYMBOL(I)
->Q IF I=''''
IF 'A'<=I<='Z' THEN I=I-64
IF I=32 THEN I=31
N=N+1; J=J!I<<SH
SH=SH-5; ->AGN UNLESS SH<0
J=J!1 UNLESS NEXT SYMBOL=''''
LETT(NEXT+L)=J
J=0; SH=26; L=L+1; ->AGN
Q: IF SH#26 THEN LETT(NEXT+L)=J AND L=L+1
I=0
WHILE I<=NEXT-1 CYCLE
CYCLE J=0,1,L-1
->FAIL UNLESS LETT(I+J)=LETT(NEXT+J)
REPEAT
->FOUND
FAIL: I=I+1
REPEAT
P=NEXT; NEXT=NEXT+L
PRINTSTRING(" WORD ENTERED"); RETURN
FOUND:P=I; PRINTSTRING(" WORD FOUND ")
END
ROUTINE PHEX(INTEGER N)
INTEGER I, J
PRINTSTRING("X'")
CYCLE J=28,-4,0
I=N>>J&15
IF I>=10 THEN I=I+7
PRINT SYMBOL(I+'0')
REPEAT ; PRINTSTRING("'")
END
ROUTINE CARDS OUT
STRING (73)M
INTEGER I, J
SELECT OUTPUT(CPSTRM)
PRINTSTRING("
%ROUTINE MESSAGE(%INTEGER N)
!")
CYCLE I=1,1,71
PRINTSYMBOL('*')
REPEAT
PRINTSTRING("
!* OUTPUTS AN ERROR MESSAGE STORED IN A COMPRESSED FORMAT *
")
CYCLE I=1,1,NMAX
M=MESS(I)
IF M#"" THEN START
PRINTSTRING("!* ")
WRITE(I,3)
PRINTSTRING(M)
SPACES(61-LENGTH(M))
PRINTSTRING("*
")
FINISH
REPEAT
PRINTSTRING("!")
CYCLE I=1,1,71
PRINT SYMBOL('*')
REPEAT
NEXT=NEXT-1; NUM=NUM-1
PRINTSTRING("
%CONST")
IF NEXT<=255 THEN PRINTSTRING("BYTE")
PRINTSTRING("INTEGERARRAY WORD(0:")
WRITE(NUM,2); PRINTSTRING(")=0,%C")
NEWLINE; SPACES(9)
CYCLE I=1,1,NUM
WRITE(WORD(I),3); PRINTSTRING(",") UNLESS I=NUM
IF I&7=0 THEN START
NEWLINE; SPACES(9)
FINISH
REPEAT
PRINTSTRING("
%CONSTINTEGERARRAY LETT(0:")
WRITE(NEXT,2)
PRINTSTRING(")=0,%C")
NEWLINE; SPACES(8)
CYCLE I=1,1,NEXT
PHEX(LETT(I)); PRINTSTRING(",") UNLESS I=NEXT
IF I&3=0 THEN NEWLINE AND SPACES(8)
REPEAT
PRINTSTRING("
%INTEGER I,J,K,M,Q,S
PRINTSTRING("" ("")
I=-4
%UNTIL N=WORD(I) %OR I=" C
)
WRITE(NUM-4,1)
PRINTSTRING(" %THEN I=I+5")
PRINTSTRING("
%CYCLE J=1,1,4
K=WORD(I+J)")
PRINTSTRING("
%IF K=0 %THEN %EXIT
SPACE %UNLESS J=1
%UNTIL M&1=0 %CYCLE
M=LETT(K); S=26
%UNTIL S<0 %CYCLE
Q=M>>S&31; " C
)
PRINTSTRING("
%IF Q=31 %THEN Q=-32
%IF Q¬=0 %THEN PRINT SYMBOL(Q+64)
S=S-5
%REPEAT
K=K+1
%REPEAT
%REPEAT
PRINTSTRING("") "")
%END" C
)
SELECT OUTPUT(LPSTRM)
END
END
ENDOFFILE