// (C) Copyright 1979 Tripos Research Group // University of Cambridge // Computer Laboratory /* This version has some commands builtin */ SECTION "CLI" GET "LIBHDR" GLOBAL $( CREATEDIRCOMM:180; LOADCOMM:181 ; TYPEHEXCOMM:182 $) GET "CLIHDR" GET "IOHDR" MANIFEST $( namemax = 25 promptmax = 15 filemax = 10 $) LET START(parm.pkt) BE $( LET prompt = VEC promptmax LET commandname = VEC namemax LET commandfile = VEC filemax LET globbase = @globsize LET error = FALSE cli.prompt := prompt cli.commandname := commandname cli.commandfile := commandfile cli.init(parm.pkt)(result2) $( LET ch = ? $( LET item = ? cli.interactive := NOT cli.background & cli.currentinput=cli.standardinput selectinput(cli.currentinput) ch := unrdch() -> rdch(), 0 TEST cli.interactive THEN UNLESS ch=';' THEN $( LET mins = rootnode!rtn.mins selectoutput(cli.standardoutput) writef(cli.prompt,taskid,mins/60,mins REM 60) wrch('*E') selectoutput(cli.currentoutput) $) ELSE $( IF testflags(2) THEN $( error := TRUE writes("****BREAK - CLI*N") $) IF error BREAK $) error := FALSE item := rditem(cli.commandname, namemax) ch := 0 UNLESS item=0 THEN $( error := TRUE TEST item=1 THEN $( LET coptr = 0 LET builtin = findbuiltin(cli.commandname) cli.module := loadseg(cli.commandname) IF cli.module=0 THEN $( LET dir = currentdir currentdir := cli.commanddir cli.module := loadseg(cli.commandname) currentdir := dir $) UNLESS cli.module=0 | globin(cli.module)=0 DO $( COPTR := CREATECO(START, CLI.DEFAULTSTACK) GOTO NB $) UNLESS builtin=0 DO coptr := createco(builtin, cli.defaultstack) NB: TEST coptr=0 THEN $( cli.result2 := result2 writef("Can't load %S*N", cli.commandname) $) ELSE $( testflags(1) callco(coptr,0) cli.result2 := returncode=0 -> 0, result2 start := cli.undefglobval /************************/ FOR i = ug to 179 //***** temp DO globbase!i := cli.undefglobval globin(tcb!tcb.seglist!1) globin(tcb!tcb.seglist!2) cli.returncode := returncode returncode := 0 IF cli.returncode<cli.faillevel THEN error := FALSE deleteco(coptr) selectinput(cli.currentinput) selectoutput(cli.currentoutput) ch := unrdch() -> 0, '*N' IF error & NOT cli.interactive THEN writef("%S failed returncode %N*N", cli.commandname, cli.returncode) $) unless cli.module=0 do unloadseg(cli.module) cli.module := 0 $) ELSE writes("Error in command name*N") $) UNTIL ch='*N' | ch='*E' | ch=';' | ch=endstreamch DO ch := rdch() $) REPEATUNTIL ch=endstreamch TEST cli.currentinput=cli.standardinput THEN $( IF cli.background BREAK cli.standardinput!scb.end := -1 cli.standardinput!scb.arg1 := 1 $) ELSE $( endread() deleteobj(cli.commandfile) cli.currentinput := cli.standardinput cli.faillevel := cli.initialfaillevel $) $) REPEAT endread() endwrite() UNLESS cli.currentoutput=cli.standardoutput THEN $( selectoutput(cli.standardoutput) endwrite() $) freeobj(currentdir) freeobj(cli.commanddir) deletetask(taskid) $) AND findbuiltin(s) = VALOF $( SWITCHON findarg("createdir,load,typehex", s) INTO $( DEFAULT: RESULTIS 0 CASE 0: RESULTIS createdircomm CASE 1: RESULTIS loadcomm CASE 2: RESULTIS typehexcomm $) $) . // (C) Copyright 1979 Tripos Research Group // University of Cambridge // Computer Laboratory SECTION "CreateDir" GET "LIBHDR" GLOBAL $( createdircomm:180 $) LET createdircomm() BE $( LET v = VEC 50 LET rc, res2 = 0, 0 TEST rdargs("/A", v, 50)=0 THEN $( res2 := result2 writes("Bad args*N") rc := 20 $) ELSE $( LET obj = createdir(v!0) freeobj(obj) TEST obj=0 THEN $( res2 := result2 writef("Can't create directory %S*N", v!0) rc := 10 $) ELSE $( LET cur = currentdir currentdir := locateDIR(v!0) freeobj(createdir("-")) deleteOBJ("-") freeobj(currentdir) currentdir := cur $) $) result2 := res2 stop(rc) $) . SECTION "LOAD" GET "LIBHDR" GLOBAL $( LOADCOMM:181 $) LET LOADCOMM() BE $( LET V = VEC 50 LET N, W, R, S = ?, ?, ?, ? LET NN = 0 LET OOUT = OUTPUT() IF RDARGS("NUM,FILE", V, 50)=0 DO $( WRITES("BAD ARGS*N") STOP(20) $) N := STRTONUM(V!0) UNLESS N>0 DO $( WRITES("N SHOULD BE > 0*N") STOP(20) $) W := GETVEC(N) IF W=0 DO $( WRITES("NOT ENOUGH STORE LEFT*N") STOP(20) $) HOLD(TASK.CONSOLEHANDLER) WHILE READW(@R) DO $( IF NN>N BREAK W!NN := R NN := NN+1 $) WHILE GCH(@R) DO $( LET C = ? $) RELEASE(TASK.CONSOLEHANDLER) S := FINDOUTPUT(V!1) IF S=0 DO $( WRITES("CAN'T CREATE FILE") FREEVEC(W) STOP(20) $) SELECTOUTPUT(S) R := WRITEWORDS(W, NN) ENDWRITE(S) SELECTOUTPUT(OOUT) WRITEF("R = %X4*N", R) FREEVEC(W) $) AND strtonum(s) = VALOF $( LET a = 0 FOR i = 1 TO s%0 DO $( LET ch = s%i TEST '0'<=ch<='9' THEN a := 10*a + ch - '0' ELSE RESULTIS 0 $) RESULTIS a $) AND READW(AR) = VALOF $( LET BL = ? LET BH = ? UNLESS GETB(@BL) RESULTIS FALSE UNLESS GETB(@BH) RESULTIS FALSE !AR := (BH<<8) | BL RESULTIS TRUE $) AND GETB(AB) = VALOF $( LET NL = ? LET NH = ? UNLESS GCH(@NH) RESULTIS FALSE UNLESS GCH(@NL) RESULTIS FALSE !AB := (NH<<4) | NL RESULTIS TRUE $) AND GCH(AN) = VALOF $( LET C = SCH() UNTIL C='$' | ('0'<=C<='9') | ('A'<=C<='F') DO C := SCH() IF C='$' RESULTIS FALSE !AN := C<='9' -> C-'0', C-'A'+10 RESULTIS TRUE $) AND SCH() = SENDPKT(-1,-3,?,?,?) & #X7F . // (C) Copyright 1979 Tripos Research Group // University of Cambridge // Computer Laboratory SECTION "TYPEHEX" get "libhdr" GLOBAL $( TYPEHEXCOMM:182 $) let typehexcomm() be $( let args = vec 50 let instream = 0 let outstream= 0 let cycle = 0 let word = ? let wdcount=0 if rdargs("FROM/A,TO/K", args, 50)=0 do $( writes("bad arguments for TYPEHEX*n") stop(10) $) instream := findinput(args!0) if instream=0 do $( writef("can't open %s*n", args!0) stop(10) $) selectinput(instream) unless args!1=0 do $( outstream := findoutput(args!1) if outstream=0 do $( writef("can't open %s*n", args!1) endread() stop(10) $) selectoutput(outstream) $) while abs(readwords(@word,1))=1 do $( writef("%X4",word) if testflags(1) then $( writes("*N******BREAK*N") goto out $) wdcount:=wdcount+1 wrch(wdcount rem 16 = 0 ->'*N','*S') $) unless wdcount rem 16 = 0 do wrch('*N') out: endread() unless outstream=0 do endwrite() $)