123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- COMMENT MODULE EDIT;
- %PUT('EDIT,'IMPORTS,'(IO)); %needs CLOSE;
- FLUID '(BASE);
- GLOBAL '(FILE!* PAGE!* LINE!* EDIT!* FLG!*);
- COMMENT EDIT!* indicates that an edit fork has just been left,
- FLG!* that CMD or EDIT has been called;
- GLOBAL '(CRST!* CRLFST!* EDITFORK!* SYSTEM!* !$EOL!$);
- CRST!* := LIST(IF SYSTEM!* = 1 THEN !$EOL!$ ELSE INTERN ASCII 13,'!");
- CRLFST!* := LIST(INTERN ASCII 13,INTERN ASCII 10,'!");
- EDITFORK!* :=
- IF SYSTEM!* = 1 THEN "<SUBSYS>SOS.SAV" ELSE "SYS:EDIT.EXE";
- FLUID '(BASE);
- SYMBOLIC PROCEDURE CREATE U; CALLEDITOR(U,NIL,NIL,2);
- SYMBOLIC PROCEDURE CALLEDITOR(FILE,PAGE,LINE,CREATEF);
- BEGIN SCALAR BASE;
- BASE := 10.;
- IF NULL FILE THEN GO RET;
- IF NULL LINE THEN GO NL;
- IF PAGE THEN PAGE := '!/ . EXPLODE2 PAGE;
- LINE := IF ATOM LINE THEN EXPLODE2 LINE
- ELSE '!^ . '!+ . EXPLODE2 CAR LINE;
- IF SYSTEM!* = 1 THEN LINE := NCONC(!$EOL!$ . 'P . NCONC(LINE,PAGE),CRST!*)
- ELSE LINE := COMPRESS('!" . 'P . NCONC(LINE,NCONC(PAGE,CRST!*)));
- NL:
- IF SYSTEM!* = 1 THEN FILE := IF CREATEF=1 THEN APPEND('(!" !/ R ! ),FILE)
- ELSE '!" . FILE
- ELSE FILE := APPEND(IF CREATEF=1 THEN '(!" E D I T ! !/ R ! )
- ELSE IF CREATEF=2 THEN '(!" C R E A T E ! )
- ELSE '(!" E D I T ! ),
- NCONC(FILE,CRLFST!*));
- FILE := COMPRESS FILE . LINE;
- RET:
- RETURN XEQKEEP('EDITFORK!*,EDITFORK!*,FILE)
- END;
- SYMBOLIC PROCEDURE EDITLINE;
- BEGIN INTEGER VAL; SCALAR XECHO;
- EDIT!* := NIL;
- IF IFL!*
- THEN <<LPRIW("*****","Editing can only be done from terminal");
- RETURN NIL>>
- ELSE IF NOT FILEP(FILE!* := MKFIL FILE!*)
- THEN <<LPRIW("*****","Unknown file name");
- RETURN IFL!* := NIL>>;
- IFL!* := FILE!* . OPEN(FILE!*,'INPUT);
- RDS CDR IFL!*;
- IPL!* := IFL!* . IPL!*;
- XECHO := !*ECHO; !*ECHO := NIL;
- !%FPAGE PAGE!*;
- LOOP: !%NEXTTYI();
- VAL := CDR PGLINE();
- IF PAIRP VAL THEN VAL := CAR VAL;
- IF VAL<LINE!* THEN <<SKIPTO !$EOL!$; GO TO LOOP>>;
- !*ECHO := XECHO;
- IF VAL>LINE!* THEN REDERR "Line not found";
- IF !*ECHO THEN TYO !%NEXTTYI();
- %If !*RAISE is on this will be upper case;
- END;
- SYMBOLIC PROCEDURE EDITSTAT;
- BEGIN SCALAR X,Y,Z;
- X := RLIS();
- Y := CDR X;
- X := NULL(CAR X EQ 'EDIT);
- IF NULL CDR Y
- THEN IF X THEN REDERR "Invalid argument for CMD"
- ELSE IF STRINGP CAR Y OR IDP CAR Y AND FILEP CAR Y
- THEN RETURN LIST('CALLEDITOR,MKQUOTE EXPLODE2 CAR Y,
- NIL,NIL,0)
- ELSE RETURN LIST('EDIT0,MKQUOTE Y,NIL);
- Y := CAR Y . REMCOM CDR Y;
- IF NULL CDR Y
- THEN IF X THEN REDERR "Invalid argument for CMD"
- ELSE RETURN LIST('CALLEDITOR,
- MKQUOTE EXPLODE2 CAR Y,NIL,NIL,0)
- ELSE RETURN LIST('EDIT0,MKQUOTE Y,X)
- END;
- SYMBOLIC PROCEDURE REMCOM U;
- IF NULL U THEN NIL
- ELSE IF CAR U EQ '!, THEN REMCOM CDR U
- ELSE CAR U . REMCOM CDR U;
- SYMBOLIC PROCEDURE EDIT0(U,V);
- %U is function name or file description.
- %V is T if CMD, NIL if EDIT;
- <<FLG!* := T;
- IF NULL CDR U THEN IF V THEN REDERR "Invalid argument for CMD"
- ELSE EDIT11(CAR U,NIL,T)
- % ELSE IF IDP CADR U THEN EDIT11(CAR U,CADR U,T)
- ELSE EDIT2(CAR U,IF CDDR U THEN CADDR U ELSE 1,CADR U,T,V)>>;
- SYMBOLIC PROCEDURE EDIT11(U,W,V);
- %U is name of function being edited
- %V is T if called;
- BEGIN SCALAR LOC;
- LOC:=IF NULL V THEN U
- ELSE IF NULL W THEN GET(U,'LOCN)
- ELSE IF (LOC:=ATSOC(GET(U,'LOCNF),W)) THEN CDR LOC;
- IF NOT LOC THEN RETURN EDITDEF1 U;
- EDIT2(CAR LOC,CADR LOC,CDDR LOC,V,NIL)
- END;
- SYMBOLIC PROCEDURE EDIT2(FILE,PAGE,LINE,CALLED,NOCHANGE);
- BEGIN %!*DEFN := NIL; ?;
- IF NOT FIXP PAGE THEN TYPERR(PAGE,"integer")
- ELSE IF NOT FIXP LINE THEN TYPERR(LINE,"integer");
- FILE!* := FILE;
- PAGE!* := PAGE;
- LINE!* := LINE;
- EDIT!* := T;
- RETURN IF NOCHANGE THEN BEGIN1()
- ELSE CALLEDITOR(EXPLODE2 FILE,PAGE,LINE,0)
- END;
- %SYMBOLIC PROCEDURE FILEMK U;
- % Convert a file specification from lisp format to a string.
- % This is essentially the inverse of MKFILE;
- % BEGIN SCALAR DEV,NAME,FLG,FLG2;
- % IF NULL U THEN RETURN NIL
- % ELSE IF ATOM U THEN NAME := EXPLODE2 U
- % ELSE FOR EACH X IN U DO
- % IF X EQ 'DIR!: THEN FLG := T
- % ELSE IF ATOM X THEN
- % IF FLG THEN <<FLG := NIL;
- % DEV := '!< . NCONC(EXPLODE2 X,LIST '!>)>>
- % ELSE IF X EQ 'DSK!: THEN DEV:=NIL
- % ELSE IF !%DEVP X THEN DEV := EXPLODE2 X
- % ELSE NAME := EXPLODE2 X
- % ELSE IF ATOM CDR X THEN
- % NAME := NCONC(EXPLODE2 CAR X,'!. . EXPLODE2 CDR X)
- % ELSE <<FLG2 := T;
- % DEV := '![ . NCONC(EXPLODE2 CAR X,
- % '!, . NCONC(EXPLODE2 CADR X,LIST '!]))>>;
- % U := IF FLG2 THEN NCONC(NAME,DEV) ELSE NCONC(DEV,NAME);
- % RETURN COMPRESS('!" . NCONC(U,'(!")))
- % END;
- SYMBOLIC PROCEDURE EDIT1(U,V);
- <<CLOSE CDR IFL!*; IPL!*:=CDR IPL!*;
- RDS IF IPL!* THEN CDR (IFL!*:=CAR IPL!*) ELSE IFL!*:=NIL;
- EDIT11(U,NIL,V)>>;
- END;
|