edit.red 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. COMMENT MODULE EDIT;
  2. %PUT('EDIT,'IMPORTS,'(IO)); %needs CLOSE;
  3. FLUID '(BASE);
  4. GLOBAL '(FILE!* PAGE!* LINE!* EDIT!* FLG!*);
  5. COMMENT EDIT!* indicates that an edit fork has just been left,
  6. FLG!* that CMD or EDIT has been called;
  7. GLOBAL '(CRST!* CRLFST!* EDITFORK!* SYSTEM!* !$EOL!$);
  8. CRST!* := LIST(IF SYSTEM!* = 1 THEN !$EOL!$ ELSE INTERN ASCII 13,'!");
  9. CRLFST!* := LIST(INTERN ASCII 13,INTERN ASCII 10,'!");
  10. EDITFORK!* :=
  11. IF SYSTEM!* = 1 THEN "<SUBSYS>SOS.SAV" ELSE "SYS:EDIT.EXE";
  12. FLUID '(BASE);
  13. SYMBOLIC PROCEDURE CREATE U; CALLEDITOR(U,NIL,NIL,2);
  14. SYMBOLIC PROCEDURE CALLEDITOR(FILE,PAGE,LINE,CREATEF);
  15. BEGIN SCALAR BASE;
  16. BASE := 10.;
  17. IF NULL FILE THEN GO RET;
  18. IF NULL LINE THEN GO NL;
  19. IF PAGE THEN PAGE := '!/ . EXPLODE2 PAGE;
  20. LINE := IF ATOM LINE THEN EXPLODE2 LINE
  21. ELSE '!^ . '!+ . EXPLODE2 CAR LINE;
  22. IF SYSTEM!* = 1 THEN LINE := NCONC(!$EOL!$ . 'P . NCONC(LINE,PAGE),CRST!*)
  23. ELSE LINE := COMPRESS('!" . 'P . NCONC(LINE,NCONC(PAGE,CRST!*)));
  24. NL:
  25. IF SYSTEM!* = 1 THEN FILE := IF CREATEF=1 THEN APPEND('(!" !/ R ! ),FILE)
  26. ELSE '!" . FILE
  27. ELSE FILE := APPEND(IF CREATEF=1 THEN '(!" E D I T ! !/ R ! )
  28. ELSE IF CREATEF=2 THEN '(!" C R E A T E ! )
  29. ELSE '(!" E D I T ! ),
  30. NCONC(FILE,CRLFST!*));
  31. FILE := COMPRESS FILE . LINE;
  32. RET:
  33. RETURN XEQKEEP('EDITFORK!*,EDITFORK!*,FILE)
  34. END;
  35. SYMBOLIC PROCEDURE EDITLINE;
  36. BEGIN INTEGER VAL; SCALAR XECHO;
  37. EDIT!* := NIL;
  38. IF IFL!*
  39. THEN <<LPRIW("*****","Editing can only be done from terminal");
  40. RETURN NIL>>
  41. ELSE IF NOT FILEP(FILE!* := MKFIL FILE!*)
  42. THEN <<LPRIW("*****","Unknown file name");
  43. RETURN IFL!* := NIL>>;
  44. IFL!* := FILE!* . OPEN(FILE!*,'INPUT);
  45. RDS CDR IFL!*;
  46. IPL!* := IFL!* . IPL!*;
  47. XECHO := !*ECHO; !*ECHO := NIL;
  48. !%FPAGE PAGE!*;
  49. LOOP: !%NEXTTYI();
  50. VAL := CDR PGLINE();
  51. IF PAIRP VAL THEN VAL := CAR VAL;
  52. IF VAL<LINE!* THEN <<SKIPTO !$EOL!$; GO TO LOOP>>;
  53. !*ECHO := XECHO;
  54. IF VAL>LINE!* THEN REDERR "Line not found";
  55. IF !*ECHO THEN TYO !%NEXTTYI();
  56. %If !*RAISE is on this will be upper case;
  57. END;
  58. SYMBOLIC PROCEDURE EDITSTAT;
  59. BEGIN SCALAR X,Y,Z;
  60. X := RLIS();
  61. Y := CDR X;
  62. X := NULL(CAR X EQ 'EDIT);
  63. IF NULL CDR Y
  64. THEN IF X THEN REDERR "Invalid argument for CMD"
  65. ELSE IF STRINGP CAR Y OR IDP CAR Y AND FILEP CAR Y
  66. THEN RETURN LIST('CALLEDITOR,MKQUOTE EXPLODE2 CAR Y,
  67. NIL,NIL,0)
  68. ELSE RETURN LIST('EDIT0,MKQUOTE Y,NIL);
  69. Y := CAR Y . REMCOM CDR Y;
  70. IF NULL CDR Y
  71. THEN IF X THEN REDERR "Invalid argument for CMD"
  72. ELSE RETURN LIST('CALLEDITOR,
  73. MKQUOTE EXPLODE2 CAR Y,NIL,NIL,0)
  74. ELSE RETURN LIST('EDIT0,MKQUOTE Y,X)
  75. END;
  76. SYMBOLIC PROCEDURE REMCOM U;
  77. IF NULL U THEN NIL
  78. ELSE IF CAR U EQ '!, THEN REMCOM CDR U
  79. ELSE CAR U . REMCOM CDR U;
  80. SYMBOLIC PROCEDURE EDIT0(U,V);
  81. %U is function name or file description.
  82. %V is T if CMD, NIL if EDIT;
  83. <<FLG!* := T;
  84. IF NULL CDR U THEN IF V THEN REDERR "Invalid argument for CMD"
  85. ELSE EDIT11(CAR U,NIL,T)
  86. % ELSE IF IDP CADR U THEN EDIT11(CAR U,CADR U,T)
  87. ELSE EDIT2(CAR U,IF CDDR U THEN CADDR U ELSE 1,CADR U,T,V)>>;
  88. SYMBOLIC PROCEDURE EDIT11(U,W,V);
  89. %U is name of function being edited
  90. %V is T if called;
  91. BEGIN SCALAR LOC;
  92. LOC:=IF NULL V THEN U
  93. ELSE IF NULL W THEN GET(U,'LOCN)
  94. ELSE IF (LOC:=ATSOC(GET(U,'LOCNF),W)) THEN CDR LOC;
  95. IF NOT LOC THEN RETURN EDITDEF1 U;
  96. EDIT2(CAR LOC,CADR LOC,CDDR LOC,V,NIL)
  97. END;
  98. SYMBOLIC PROCEDURE EDIT2(FILE,PAGE,LINE,CALLED,NOCHANGE);
  99. BEGIN %!*DEFN := NIL; ?;
  100. IF NOT FIXP PAGE THEN TYPERR(PAGE,"integer")
  101. ELSE IF NOT FIXP LINE THEN TYPERR(LINE,"integer");
  102. FILE!* := FILE;
  103. PAGE!* := PAGE;
  104. LINE!* := LINE;
  105. EDIT!* := T;
  106. RETURN IF NOCHANGE THEN BEGIN1()
  107. ELSE CALLEDITOR(EXPLODE2 FILE,PAGE,LINE,0)
  108. END;
  109. %SYMBOLIC PROCEDURE FILEMK U;
  110. % Convert a file specification from lisp format to a string.
  111. % This is essentially the inverse of MKFILE;
  112. % BEGIN SCALAR DEV,NAME,FLG,FLG2;
  113. % IF NULL U THEN RETURN NIL
  114. % ELSE IF ATOM U THEN NAME := EXPLODE2 U
  115. % ELSE FOR EACH X IN U DO
  116. % IF X EQ 'DIR!: THEN FLG := T
  117. % ELSE IF ATOM X THEN
  118. % IF FLG THEN <<FLG := NIL;
  119. % DEV := '!< . NCONC(EXPLODE2 X,LIST '!>)>>
  120. % ELSE IF X EQ 'DSK!: THEN DEV:=NIL
  121. % ELSE IF !%DEVP X THEN DEV := EXPLODE2 X
  122. % ELSE NAME := EXPLODE2 X
  123. % ELSE IF ATOM CDR X THEN
  124. % NAME := NCONC(EXPLODE2 CAR X,'!. . EXPLODE2 CDR X)
  125. % ELSE <<FLG2 := T;
  126. % DEV := '![ . NCONC(EXPLODE2 CAR X,
  127. % '!, . NCONC(EXPLODE2 CADR X,LIST '!]))>>;
  128. % U := IF FLG2 THEN NCONC(NAME,DEV) ELSE NCONC(DEV,NAME);
  129. % RETURN COMPRESS('!" . NCONC(U,'(!")))
  130. % END;
  131. SYMBOLIC PROCEDURE EDIT1(U,V);
  132. <<CLOSE CDR IFL!*; IPL!*:=CDR IPL!*;
  133. RDS IF IPL!* THEN CDR (IFL!*:=CAR IPL!*) ELSE IFL!*:=NIL;
  134. EDIT11(U,NIL,V)>>;
  135. END;