SYSTEMROUTINE EDIT
SYSTEMROUTINESPEC MOVE(INTEGER LEN, FROM, TO)
SYSTEMROUTINESPEC SIM2(INTEGER EP, R1, R2, INTEGERNAME R3)
BYTEINTEGERARRAY EDITS, INPUT(0:160)
OWNSTRING (3) ARRAY ACTION(0:7)="ALT", "DEL", "E", "INS", C
"R", "TC", "TS", "T"
OWNBYTEINTEGERARRAY ACTIONSWITCH(0:7)=65, 68, 69, 73, 82, C
85, 86, 84
OWNINTEGERARRAY ACTIONTYPE(0:25)=0, -1(2), 1, 2, -1(3), 3, C
-1(8), 4, -1, 5, -1(6)
CONSTSTRING (1) ARRAY DELIM(0:4)=",", "/", "=", "?", "
"
OWNBYTEINTEGERARRAY DELIMCHRS(0:3)=44, 47, 61, 63
CONSTSTRING (1)NL="
"
INTEGER LEN, IN, OUT, CTL, LINE, ADRINPUT, ADREDITS, M, I, LENI
INTEGER INSET, FLAG, POSITION, TYPEFLG, ENDSET, ERR, INREAD
INTEGER INLINE, SWITCHSET, EDITR, FROM, TO, PRINTBUFF, C
EDITREAD, TEXT, STR, TEXTSET, COPYSW
INTEGER REPFROM, REPTO, REPCOUNT
STRING (255)EDITCOM, PAR1, PARAM1, PARAM2, REST, C, D, ST, C
OUTPUTSTR, RESTOFLINE
STRING (1)LASTDELIM
SWITCH SW(65:90)
OWNSTRING (35) ARRAY MESS(1:7)='INVALID EDIT COMMAND',
'POSITIONING BACKWARDS INVALID',
'RANGE INCORRECT',
'INPUT ENDED',
'INVALID PARAMETERS TO EDIT COMMAND',
'STRING NOT FOUND',
'EDIT STREAM EXHAUSTED'
!*
!*
!**************************************************************
!*
!
! ROUTINE WRITEOUTPUT99
!*
!**************************************************************
!*
!*
ROUTINE WRITEOUTPUT99
SELECTOUTPUT(99)
SIM2(1, ADREDITS, LEN, FLAG)
SELECTOUTPUT(OUT)
END
!*
!*
!***************************************************************
!*
!ROUTINE WRITEOUTPUT
!*
!****************************************************************
!*
!*
ROUTINE WRITEOUTPUT(INTEGER I)
IF I=1 THENSTART
IF INREAD=1 THENSTART
IF OUTPUTSTR='' THEN SIM2(1, ADRINPUT+1, LENI-1, C
FLAG) ELSE PRINTSTRING C
(OUTPUTSTR.RESTOFLINE) AND OUTPUTSTR=''
INREAD=0
FINISHELSE SIM2(1, ADRINPUT, LENI, FLAG)
FINISHELSE SIM2(1, ADREDITS, LEN, FLAG)
END
!*
!*
!**************************************************************
!*
! ROUTINE GETINPUT
!*
!*****************************************************************
!*
!*
ROUTINE GETINPUT(INTEGER I)
IF I=1 THENSTART
IF INSET=0 THEN SELECTINPUT(IN) AND INSET=1
IF INREAD=0 THEN SIM2(0, ADRINPUT+1, 0, LENI) AND C
LINE=LINE+1
FINISHELSESTART
IF INSET=1 THEN SELECTINPUT(CTL) AND INSET=0
SIM2(0, ADREDITS+1, 0, LEN)
FINISH
END
!*
!*
!**************************************************************
!*
! FUNCTION COPY
!*
!**************************************************************
!*
!*
INTEGERFN COPY(INTEGER UPTO)
READ: GETINPUT(1)
IF INPUT(1)=25 THENRESULT =4
WRITEOUTPUT(1)
IF LINE>=UPTO THENRESULT =0
->READ
END
!*
!*
!**************************************************************
!*
! FUNCTION DELETE
!*
!**************************************************************
!*
!*
INTEGERFN DELETE(INTEGER FROM, TO)
INTEGER LOOP
LOOP=FROM
READ: GETINPUT(1)
LOOP=LOOP+1
IF INPUT(1)=25 AND TO=-1 THENRESULT =0
IF INPUT(4)=25 THENRESULT =1
IF LOOP>TO AND TO#-1 THENRESULT =0 ELSE ->READ
END
!*
!*
!**************************************************************
!*
! FUNCTION GETRANGE
!*
!**************************************************************
!*
!*
INTEGERFN GETRANGE(INTEGERNAME FROM, TO)
INTEGER I, J, L, K, ADR, PSET, NUMBER, TRANGE, NO
STRING (255)A, B, SP
NUMBER=0
TRANGE=0
PSET=0
TO=0
FROM=0
I=1
J=1
A=PARAM1
B=''
IF PARAM1->A.("-").B THENSTART
I=2
IF B->SP.("+").B THEN PSET=1
->GETNO
FINISH
IF PARAM1->B.("+").A THEN TRANGE=1
GETNO: IF J=1 THEN ADR=ADDR(A) ELSE ADR=ADDR(B)
IF J=1 THEN K=LENGTH(A) ELSE K=LENGTH(B)
IF K<=0 THENRESULT =3
CYCLE L=1, 1, K
NO=BYTEINTEGER(ADR+L)
IF X'30'<=NO<=X'39' THEN NUMBER=NUMBER*10+NO-'0' AND C
->REP
IF NO=X'20' THEN ->REP
IF NO='E' THENSTART
RESULT =3 IF TRANGE=1
TO=-1
IF I=1 THEN FROM=-1
RESULT =0
FINISH
RESULT =3
REP: REPEAT
IF J=1 THEN FROM=NUMBER ELSE TO=NUMBER
J=J+1
IF I=1 AND TO#-1 THEN TO=FROM
IF TRANGE=1 THENSTART
IF COPYSW>81 THEN FROM=FROM+LINE-1 ELSE FROM=FROM+LINE
FINISH
IF I=1 THENRESULT =0
IF J<3 THEN ->GETNO
IF PSET=1 THEN TO=FROM+TO
RESULT =0
END
!*
!*
!**************************************************************
!*
!FUNCTION SPLIT
!*
!**************************************************************
!*
!*
INTEGERFN SPLIT(INTEGER TYPE)
!TYPE=4 FOR R
!TYPE#4 OTHERWISE
INTEGER I, CHR
STRING (255)REST
REM: IF PAR1->(" ").PAR1 THEN POSITION=POSITION+1 AND ->REM
IF TYPE=4 THEN ->R
IF 5<=TYPE<=6 THEN ->T
CHR=BYTEINTEGER(ADDR(PAR1)+1)
IF TYPE=7 AND (CHR='/' OR CHR='?' OR CHR='=') THEN ->T
CYCLE I=0, 1, 4
IF PAR1->PARAM1.(DELIM(I)) THENSTART
IF DELIM(I)=NL THEN POSITION=1 ELSE C
POSITION=POSITION+LENGTH(PARAM1)+1
RESULT =0
FINISH
REPEAT
RESULT =5
R: CYCLE I=1, 1, 3
IF PAR1->(DELIM(I)).PARAM1.(DELIM(I)).PARAM2.(DELIM(I) C
).REST THENSTART
POSITION=POSITION+3+LENGTH(PARAM1)+LENGTH(PARAM2)
IF POSITION>=LEN THEN POSITION=1
RESULT =0
FINISH
REPEAT
RESULT =5
T: CYCLE I=1, 1, 3
IF PAR1->(DELIM(I)).PARAM1.(DELIM(I)).REST THENSTART
TEXTSET=TYPE-5
POSITION=POSITION+2+LENGTH(PARAM1)
IF POSITION>=LEN THEN POSITION=1
RESULT =0
FINISH
REPEAT
RESULT =5
END
!*
!*
!***************************************************************
!*
!FUNCTION GET EDIT COMMAND
!*
!**************************************************************
!*
!*
INTEGERFN GET EDIT COMMAND(INTEGERNAME SWITCHSET)
INTEGER I, J, TYP
PARAM1=''
PARAM2=''
PAR1=''
IF REPCOUNT>0 THENSTART
MOVE(LEN-POSITION+1, ADREDITS+POSITION, ADDR(EDITCOM)+1)
BYTEINTEGER(ADDR(EDITCOM))=LEN-POSITION+1
IF EDITCOM->(")").EDITCOM THENSTART
REPCOUNT=REPCOUNT-1
IF REPCOUNT=0 THEN POSITION=REPTO AND ->ENDREPTN
REPTO=POSITION+1
POSITION=REPFROM
FINISH
->NO EDIT READ
FINISH
IF POSITION>1 THEN ->NO EDIT READ
IF EDITREAD=1 THEN EDITREAD=0 AND ->NO EDIT READ
SELECT: GETINPUT(0)
IF EDITS(1)=25 THENRESULT =7
CYCLE I=LEN-1, -1, 1
IF EDITS(I)=32 THEN LEN=LEN-1 ELSE EDITS(LEN)=10 C
ANDEXIT
REPEAT
WRITEOUTPUT99
NO EDIT READ:MOVE(LEN-POSITION+1, ADREDITS+POSITION, ADDR(EDITCOM)+1)
BYTEINTEGER(ADDR(EDITCOM))=LEN+1-POSITION
SPACES: IF EDITCOM->(" ").EDITCOM THEN POSITION=POSITION+1 AND C
->SPACES
ENDREPTN:IF EDITCOM=NL THEN POSITION=1 AND ->SELECT
CYCLE J=1, 1, 3
CYCLE I=0, 1, 3
IF EDITCOM->(DELIM(I)).EDITCOM THENSTART
POSITION=POSITION+1
UNLESS I=0 THEN LASTDELIM=DELIM(I)
->REP
FINISH
REPEAT
->START EDIT COM
REP: REPEAT
START EDIT COM:IF EDITCOM->(" ").EDITCOM THEN POSITION=POSITION+1 C
AND ->START EDIT COM
I=BYTEINTEGER(ADDR(EDITCOM)+1)-65
UNLESS I>=0 AND I<26 THENSTART
IF EDITCOM->("*").PARAM1.("(").EDITCOM THENSTART
POSITION=POSITION+2+LENGTH(PARAM1)
ERR=GETRANGE(REPCOUNT, TO)
UNLESS ERR=0 THENRESULT =ERR
REPFROM=POSITION
->START EDIT COM
FINISHELSERESULT =1
FINISH
TYP=ACTIONTYPE(I)
IF TYP=-1 THENRESULT =1
CYCLE I=TYP, 1, 7
IF EDITCOM->(ACTION(I)).PAR1 THENSTART
POSITION=POSITION+LENGTH(ACTION(I))
J=SPLIT(I)
UNLESS J=0 THENRESULT =5
COPYSW=SWITCHSET
SWITCHSET=ACTIONSWITCH(I) ANDRESULT =0
FINISH
REPEAT
RESULT =1
END
!*
!*
!**************************************************************
!*
!*
RESTOFLINE=''
OUTPUTSTR=''
REPCOUNT=0
LASTDELIM=''
SWITCHSET=0
TEXTSET=0
INREAD=0
TEXT=0
PRINTBUFF=0
EDITREAD=0
EDITR=0
IN=101
OUT=102
CTL=108
ENDSET=0
POSITION=1
LINE=1
TYPEFLG=0
ADRINPUT=ADDR(INPUT(0))
ADREDITS=ADDR(EDITS(0))
INPUT(0)=10
EDITS(0)=10
SELECTINPUT(CTL) AND INSET=0
SELECTOUTPUT(OUT)
!*
!*
GET COMMAND:ERR=GET EDIT COMMAND(SWITCHSET)
UNLESS ERR=0 THEN ->ERROR
->SW(SWITCHSET)
!*
!*
!**************************************************************
!*
!*
SW(69): !E END
COPY NEXT:GETINPUT(1)
IF INPUT(1)=25 AND ENDSET=1 THEN ENDSET=0 AND ->ALT
JUMP: IF INPUT(1)=25 THEN ->END
WRITEOUTPUT(1)
->COPY NEXT
!*
!*
!**************************************************************
!*
!*
SW(68): !DEL,D DELETE
ERR=GETRANGE(FROM, TO)
UNLESS ERR=0 THEN ->ERROR
IF LINE=FROM THEN ->DEL
IF LINE>FROM THEN ERR=2 AND ->ERROR
IF LINE<FROM THEN ERR=COPY(FROM)
UNLESS ERR=0 THEN ->ERROR
DEL: ERR=DELETE(FROM, TO)
UNLESS ERR=0 THEN ->ERROR
IF TYPEFLG=1 THEN TYPEFLG=0 AND ->ALT
->GET COMMAND
!*
!*
!**************************************************************
!*
!*
SW(84): ! T TRANSCRIBE
IF TEXTSET=2 THEN TEXTSET=0 AND ->TEXT
ERR=GETRANGE(FROM, TO)
UNLESS ERR=0 THEN ->ERROR
IF FROM=-1 THEN ENDSET=1 AND ->SW(69)
COPYSW=0
IF LINE=FROM AND INREAD=0 THENSTART
IF TYPEFLG=1 THEN TYPEFLG=0 AND ->ALT ELSE ->GETCOMMAND
FINISH
IF LINE>FROM THEN ERR=2 AND ->ERROR
IF LINE<=FROM THEN ERR=COPY(FROM)
UNLESS ERR=0 THEN ->ERROR
IF TYPEFLG=1 THEN TYPEFLG=0 AND ->ALT
->GET COMMAND
TEXT: IF PARAM1='' THEN ERR=5 AND ->ERROR
TEXT1: GETINPUT(1)
IF INPUT(1)=25 THEN ERR=4 AND ->ERROR
INPUT(0)=LENI
IF STRING(ADDR(INPUT(0)))->(PARAM1).REST THEN INREAD=1 C
AND INPUT(0)=10 AND ->GETCOMMAND ELSE INPUT(0)=10 AND C
WRITEOUTPUT(1) AND ->TEXT1
!*
!*
!**************************************************************
!*
!*
SW(85): !TC
TC: IF PARAM1='' THEN ERR=5 AND ->ERROR
RDTEXT: GETINPUT(1)
IF INPUT(1)=25 THEN ERR=4 AND ->ERROR
INPUT(0)=LENI
IF STRING(ADDR(INPUT(0)))->ST.(PARAM1).REST THEN INREAD=1 C
AND INPUT(0)=10 AND ->GET COMMAND ELSE INPUT(0)=10 C
AND WRITEOUTPUT(1) AND ->RDTEXT
!*
!*
!**************************************************************
!*
!*
SW(86): !TS
TS: IF PARAM1='' THEN ERR=5 AND ->ERROR
RDTEXT2: GETINPUT(1)
IF INPUT(1)=25 THEN ERR=4 AND ->ERROR
INPUT(0)=LENI
IF STRING(ADDR(INPUT(0)))->ST.(PARAM1).REST THENSTART
INPUT(0)=10
SP: IF ST->(" ").ST THEN ->SP
IF ST='' THEN INREAD=1 AND ->GET COMMAND
FINISH
INPUT(0)=10
WRITEOUTPUT(1)
->RDTEXT2
!*
!*
!**************************************************************
!*
!*
SW(82): !R REPLACE
INLINE=0
M=0
REST=''
GETINPUT(1)
IF INPUT(1)=25 THEN ERR=4 AND ->ERROR
MAKESTRING:IF PARAM1='' THEN ERR=5 AND ->ERROR
MOVE(LENI, ADRINPUT+1, ADDR(C)+1)
BYTEINTEGER(ADDR(C))=LENI
SPLITSTRING:IF C->D.(PARAM1).RESTOFLINE THEN C
OUTPUTSTR=OUTPUTSTR.D.PARAM2 ELSE ERR=6 AND ->ERROR
LENI=LENGTH(RESTOFLINE)
MOVE(LENI, ADDR(RESTOFLINE)+1, ADRINPUT+1)
INREAD=1
-> GET COMMAND
!*
!*
!**************************************************************
!*
!*
SW(65): !ALT ALTER
TYPEFLG=1
->SW(68)
ALT: GETINPUT(0)
CYCLE I=LEN-1, -1, 1
IF EDITS(I)=32 THEN LEN=LEN-1 ELSE EDITS(LEN)=10 C
ANDEXIT
REPEAT
WRITEOUTPUT99
STR=EDITS(1)
IF STR=BYTEINTEGER(ADDR(LASTDELIM)+1) THENSTART
IF LEN>2 THEN EDITREAD=1
->GET COMMAND
FINISH
IF EDITS(1)=25 THEN ERR=7 AND ->ERROR
WRITEOUTPUT(0)
->ALT
!*
!*
!**************************************************************
!*
!*
SW(73): !INS INSERT
TYPEFLG=1
->SW(84)
!*
!*
!**************************************************************
!*
!*
!*
!*
ERROR: SELECTOUTPUT(99)
PRINTSTRING(MESS(ERR))
NEWLINE
SELECTOUTPUT(OUT)
ENDSET=0
->SW(69)
END: SELECTOUTPUT(99)
PRINTSTRING('EDIT COMPLETED
')
END
ENDOFFILE