123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- COMMENT This file provides support for calling the EXEC and the system
- editor under TOPS-20 or TENEX;
- SYMBOLIC;
- GLOBAL '(PROGEXT!* PSYSDEV!* CRLFST!* EXECFORK!* EXECFILE!* SYSTEM!*
- !$EOL!$);
- PROGEXT!* := IF SYSTEM!*>0 THEN '(V A S !.) ELSE '(E X E !.);
- PSYSDEV!* := IF SYSTEM!*>0 THEN '(!< S U B S Y S !>) ELSE '(S Y S !:);
- CRLFST!* := IF SYSTEM!*<0 THEN LIST(INTERN ASCII 13,INTERN ASCII 10,'!")
- ELSE LIST(!$EOL!$,'!");
- EXECFORK!* := EXECFILE!* := IF SYSTEM!*<0 THEN "<SYSTEM>EXEC.EXE"
- ELSE "<SYSTEM>EXEC.SAV";
- SYMBOLIC PROCEDURE PINSTAT;
- BEGIN SCALAR X,Y,Z;
- Z := CURSYM!*;
- IF DELCP(X := NXTSYM!*) THEN GO TO DUN;
- Y := REVERSIP EXPLODEC NXTSYM!*;
- IF DELCP(X := CRCHAR!*) THEN GO TO DUN;
- Y := CRCHAR!* . Y;
- CRCHAR!* := '! ;
- WHILE NOT DELCP(X := READCHQ()) DO Y := X . Y;
- DUN:
- NXTSYM!* := X;
- TTYPE!* := 3;
- SCAN();
- RETURN LIST(Z,IF Y THEN MKQUOTE REVERSIP Y ELSE NIL)
- END;
- SYMBOLIC PROCEDURE READCHQ;
- IF !*INT AND NULL IFL!* THEN READCH1() ELSE READCH();
- REMPROP('EXEC,'STAT);
- REMPROP('PUSH,'STAT);
- REMFLAG('(EXEC PUSH),'GO);
- SYMBOLIC PROCEDURE PUSH U; EXEC U; %we might as well support both;
- SYMBOLIC PROCEDURE EXEC U;
- BEGIN SCALAR V,X,Y,Z;
- IF NULL U THEN RETURN XEQKEEP('EXECFORK!*,EXECFILE!*,NIL);
- V := U;
- A: IF CAR U EQ '!: OR CAR U EQ '!< THEN Y := T
- ELSE IF CAR U EQ '!. THEN Z := T
- ELSE IF SEPRP CAR U THEN GO TO B;
- X := CAR U . X;
- IF (U := CDR U) THEN GO TO A;
- B: X := REVERSIP('!" . IF Z THEN X ELSE APPEND(PROGEXT!*,X));
- X := COMPRESS('!" . IF Y THEN X ELSE APPEND(PSYSDEV!*,X));
- RETURN XEQKILL(X,LIST COMPRESS('!" . APPEND(V,CRLFST!*)))
- END;
- PUT('EXEC,'STAT,'PINSTAT);
- PUT('PUSH,'STAT,'PINSTAT);
- %FLAG('(EXEC PUSH),'GO);
- SYMBOLIC PROCEDURE XEQKILL(FILENAME,ARG);
- %handles infrequent calls by creating and killing each fork;
- <<!%XEQ(FILENAME,T,T,NIL,ARG); TERPRI();
- PRIN2T "Returned to REDUCE ..."; NIL>>;
- SYMBOLIC EXPR PROCEDURE XEQKEEP(FORKN,FILE,ARG);
- %This retains the lower fork for speedy subsequent calls to the same
- %program (e.g., PUSH or EDIT), and the ---FILE check will set up the
- %fork again after a SAVE;
- BEGIN SCALAR A;
- A:=ERRORSET(LIST('!%XEQ,FORKN,T,NIL,NIL,MKQUOTE ARG),NIL,NIL);
- SET(FORKN,IF ATOM A THEN !%XEQ(FILE,T,NIL,NIL,ARG) ELSE CAR A);
- TERPRI();
- PRIN2T "Returned to REDUCE ..."
- END;
- %SYMBOLIC PROCEDURE KFORK U;
- % PAIRP ERRORSET(LIST('JSYS,153,MKQUOTE U,0,0,1),NIL,NIL);
- %DATE!*:=JSYS(144,'(BUF),-1,604241920,1);
- %The following function is called by BEGIN. It checks that terminal
- % linelength in REDUCE is shorter than the width of the controlling
- % terminal.
- % Commented out as it is to sensitive to operating system differences.
- %SYMBOLIC PROCEDURE CHKLEN;
- % BEGIN SCALAR A,B;
- % A := ERRORSET('(JSYS 63 65 24 0 3),NIL,NIL); %Try MTOPR first,
- % A := IF PAIRP A THEN CAR A
- % ELSE BOOLE(1,LSH(JSYS(71,65,0,0,2),-18),127); % else use RFMOD
- % IF A<10 THEN RETURN;
- % B := LINELENGTH NIL;
- % IF A LEQ B THEN LINELENGTH(A-1);
- % RETURN B
- % END;
- END;
|