!********************************************************************** !** !** A P M C L E A N - An implementation of VAX Clean for the APMs !** !** 7/3/84 AJS - First Implementation - no cross directory ops !** MDP - Added Hexdump & Vecce !** 20/4/84 AJS - Added IE properly & added wildcard filenames !** 24/7/84 JGH - Fixed a bug were valid permissions were flagged as invalid! !** !** %conststring(8) version = "24/07/84" %include "inc:util.imp" %include "inc:fs.imp" %include "inc:fsutil.imp" %include "ie:ie.inc" %include "inc:ecce.imp" %include "inc:vtlib.imp" %Owninteger eod=0 %Ownstring(63) fsp %Ownstring(6) user %owninteger depth = 0 %Routine Skip Blanks (%string(*)%name it) %return %if length(it) = 0 it = substring(it,2,length(it)) %while charno(it,1) = 32 %and it#"" %end %Routine Truncate Blanks (%string(*)%name it) %return %if length(it) = 0 length(it) = length(it)-1 %while charno(it,length(it)) =' ' %and length(it)#0 %End %Routine Print Filename (%string(12) f) spaces (15-length(f)) printstring (f) space %end %Routine Type File (%string(63) file,%Integer n) %integer sym,m=0 %on 0,3,4,9 %start close input select input (0) %if event_event = 9 %and event_sub = 3 %start printline (event_message) %return %finish newline newline %return %Finish open input (2,file) %while m # n %cycle read symbol (sym) print symbol (sym) m = m + 1 %if sym = nl %repeat close input select input (0) %end !ECCExx: Implementation of ECCE for 2900/EMAS, VAX/VMS and APM ! Revised specification (1981/82) including video support. ! Hamish Dewar Edinburgh University Computer Science Department ! %constinteger MAXNAME=127 %routine Ecce (%string (255) Param Line) %integer i,same %string(255) heading %ownrecord(edfile) MAIN=0,SEC=0 %ownstring(maxname) OUTNAME ! %routine SET PARAMETERS(%string(255) ecce in) %if ecce in -> ecce in .("/"). out name %start main_name = ecce in %else main_name = ecce in main_name = "" %if main_name = ".N" outname = main_name %finish outname = "" %if outname = ".N" %end; !SET PARAMETERS %on 0 %start select input (0) select output (0) {} pop frame; pop frame {} set mode(0) !! pop window; pop window !! set video mode (0) printsymbol (27) ; printsymbol ('>') newline %return %finish Set parameters (param line) same = 0; same = 1 %if outname = main_name main_flag = 32768; !plus extra connect edfile(main) -> stop %if main_flag # 0 %if outname # "" %start %if main_name # "" %start heading = "Editing ".main_name heading = heading." to ".outname %if same = 0 %finish %else %start heading = "Creating ".outname %finish %finish %else %start main_change = -1 heading = "Showing ".main_name %finish main_lim1 = main_start1; sec_lim1 = sec_start1 main_fp = main_start2; main_change = 16_7FFFFFFF edi(main,sec,heading) !MAIN_FLAG is negative if edit abandoned !MAIN_CHANGE is untouched (neg or zero) if no changes %if main_flag < 0 %or (main_change = 16_7FFFFFFF %and same # 0) %start print string(" File unchanged") main_change = -1 %finish %if main_change >= 0 %start; !file to be written sec_name = main_name; main_name = outname disconnect edfile(main) printstring(sec_name." edited to ".main_name) %finish newline stop: %end %routine Call IE (%string (80) fname) %string (255) Profile = "" %integer sl, sc %on 0, 3, 4, 9, abort %start Reset Terminal select input (0); select output (0) printline("IE fails ".event_message) %return %finish terminal serial number = default terminal journal file = default journal Set Up Terminal sl = 1 sc = 1 IE Editor (fname, fname, 0, 23, sl, sc, default profile, %c default keyboard, reset heap ! confirm) !! *move heapnow,d6 Reset Terminal select input (0) ; select output (0) New Line %end %routine Count Lines (%string(63) file) %integer sym,m=0 %on 0,3,4,9 %Start close input select input (0) %if event_event=9 %and event_sub=3 %start printline (event_message) %return %finish %unless event_event = 0 %Start Printstring ("File is ") Write (m,0) printline (" lines long") %Finish %return %Finish open input (2,file) %cycle read symbol (sym) m = m + 1 %if sym = nl %repeat %End %routine Dump file (%string (255) File, %integer Lines) %byte %array Line (0:1023) %integer Line Length, Line Number = 0 %integer Sym, Offset = 0 %routine Dump Line %integer Start, T Start, T End %integer I, Sym Line Number = Line Number + 1 Print String ("Line ") Write (Line Number, 0) New Line Start = 0 %cycle T Start = Start %if Line Length > 16 %start T End = T Start + 15 Start = Start + 16 Line Length = Line Length - 16 %else T End = Start + Line Length - 1 Line Length = 0 %finish Phex (Offset) Print String (": ") Offset = Offset + (T End - T Start + 1) %for I = T Start, 1, T End %cycle P Hex2 (Line (I)) Space %repeat Spaces (48 - 3 * (T End - T Start + 1)) Print String ("| ") %for I = T Start, 1, T End %cycle Sym = Line (I) Sym = Sym & 16_7f %if Sym < ' ' %or Sym = 16_7f %then Sym = '_' Print Symbol (Sym) %repeat New Line %repeat %until Line Length = 0 %end %on 0,3,4,9 %start %if event_event=9 %and event_sub = 3 %start printstring (event_message) newline %else %if event_event = 0 newline %Finish -> End Dump %finish Open Input (2, File) Select Input (2) %while Lines # 0 %cycle Line Length = 0 %cycle Read Symbol (Sym) Line (Line Length) = Sym Line Length = Line Length + 1 %if Line Length = 1024 %start Read symbol (Sym) %until Sym = 'Nl' %finish %repeat %until Sym = Nl Dump Line Lines = Lines - 1 %repeat End Dump: Close Input Select Input (0) Print String ("File ".File." Dumped, ".I to S(Line Number,0)." Lines") New Line %end %Routine Print Help ! printline ("A to append the file to another file") printline ("C to copy the file into another file") printline ("D to delete the file") printline ("E to quit the program") printline ("F to change temporarily to a new filespec") printline ("H to type this information") printline ("I to display file details") printline ("IE to edit the current file using IE") printline ("K to count the number of lines in the file") ! printline ("L to list the remaining files in the current directory") printline ("N to rename the file to newfile") printline ("P to change the file protection") printline ("Q to quit the program") printline ("R to restart from the top") printline ("T to type out the first n lines of the file") printline ("V to edit the current file using VECCE") printline ("X to hexdump the first n records of the file") printline (" to go on to the next file") %End %Routine Open Directory %on 3,4,9 %start eod = 1 select input (0) %return %finish Open Input (1,user.":directory") %end %Routine Get Next File %on 3,4,9 %start eod = 1 select input (0) %return %finish Select Input (1) Read Line (fsp) Select Input (0) %End %routine parm Complain printstring ("Missing parameter");newline %End %Integerfn toint (%String(80) s) %on 3 %start %result = -1 %finish %result = Stoi (s) %end %Routine Do A File (%String(63) thisfile) %string (255) Fcomms %string(80) line,com %string(63) fname1,fname2 %byte c,fp %integer n1 %switch sw ('A':'Z') %Integerfn Get Integer %integer i %if fp = 0 %start %if length (line) > 1 %start i = toint(substring(line,2,length(line))) %else i = 999999 %finish %else i = toint (fname1) %finish %result = i %end %on 3,4,9 %start %if event_sub = 3 %Start printline (event_message) -> again %finish newline %stop %finish again: %Cycle to Lower(thisfile) prompt("") print filename (thisfile) Read Line (line) Skip Blanks (line) to Upper(line) %return %if line = "" %if line -> line.(" ").fname1 %start skipblanks (fname1) truncateblanks (fname1) %if fname1 -> fname1.(" ").fname2 %start ; %finish fp = 1 %Else fp = 0 %Finish fp = 0 %if fname1="" c=charno(line,1) -> sw (c) %if 'A'<=c<='Z' sw(*): Printstring ("Unrecognised command ") printsymbol (c) Newline Newline -> Help sw('C'): Parm Complain %and %Continue %if fp = 0 to lower(fname1) copy (thisfile,fname1) printline ("Copied ".thisfile." to ".fname1) %return sw('D'): %if charno (line,length(line)) = '!' %Start Delete (thisfile) printline ("Deleted ".thisfile) %Else printline ("Use D!") %continue %Finish %return sw('E'): -> sw ('Q') sw('F'): Parm Complain %and %Continue %if fp = 0 %if exists (fname1) %start depth = depth + 1 Do a File (fname1) depth = depth - 1 %Continue %Else printline ("File ".fname1." does not exist") %Finish %Continue sw('H'): Help: Print Help %Continue sw('I'): %if Length (Line) = 2 %and Charno (Line, 2) = 'E' %start Call IE (this file) %else %if length (Line) = 1 length (FComms) = fcommr ('N'<<8, This File, Charno (FComms, 1), 255) Print Line (FComms) %else printline ("Not Implemented.") %finish %continue sw('K'): Count Lines (thisfile) %Continue sw('N'): Parm Complain %and %continue %if fp = 0 to lower(fname1) rename (thisfile,fname1) printline ("Renamed ".thisfile." to ".fname1) %return sw('P'): Parm Complain %and %Continue %if fp = 0 to Upper(Fname1) %unless 1 <= length(fname1) <= 3 %start printline ("Faulty permission") %Continue %Finish permit (thisfile,fname1) %Continue sw('Q'): eod = 1 %Return sw('R'): %If depth = 0 %start printline ("Restarting from top") Open Directory %return %else printline ("Can't restart within recursive call") %finish %Continue sw('T'): n1 = get integer %if n1 < 0 %start printline ("Invalid integer specified") %Else n1 = 999999 %if n1=0 type file (thisfile,n1) %finish %continue sw('V'): Ecce (thisfile) %continue sw('X'): n1 = get integer %if n1 <0 %start printline ("Invalid integer specified") %else n1=999999 %if n1=0 dump file (thisfile,n1) %Finish %continue %Repeat %end %routine welcome printline ("APM Clean Version ".version." Current directory :".current directory) %end %routine begin %string (63) wild,home %integer m = 0 %on 0,1,2,3,4,5,6,7,8,9,10,11 %start set directory (home) %unless event_event=9 %and event_sub=3 %stop %finish wild = Cli Param home = current directory to Upper(wild) Skip Blanks (wild) %if Wild -> user .(":"). wild %start open directory Printstring ("No such user ".user) %and newline %and %stop %if eod = 1 set directory (user) %else user = home open directory %finish wild = "**" %if wild = "" Get Next File %While Eod = 0 %Cycle Do a file (fsp) %and m = 1 %if matches (fsp,wild) Get Next File %repeat printstring ("No files matched") %and newline %if m=0 set directory (home) %end %Begin begin %Endofprogram