// (C) Copyright 1979 Tripos Research Group
// University of Cambridge
// Computer Laboratory
// BCPL-ARGS
SECTION "ARGS"
GET "BCPL"
LET start() = VALOF
$( LET argv = VEC 80
LET args = "FROM,TO,OCODE/K,*
*MC/K,CHARCODE/K,VER/K,OPT/K"
LET ocodename = ":T.BCPL-T00-OCODE"
LET ocodelen = 0
LET cgname = "SYS:L.BCPL-CG"
LET cglen = 0
LET cg = 0
LET errarg = "Bad args*N"
LET errstr = "Run out of store*N"
LET errcde = "Error in CHARCODE table*N"
LET errfil = "Can't open %S*N"
LET oldoutput = output()
rc := 0
transchars, charcode := FALSE, 0
sourcestream, ocodestream, codestream := 0, 0, 0
verstream := oldoutput
IF rdargs(args, argv, 80)=0 DO
$( writes(errarg)
GOTO fail
$)
UNLESS argv!5=0 DO
$( verstream := findoutput(argv!5)
IF verstream=0 DO
$( writef(errfil,argv!5)
GOTO fail $)
selectoutput(verstream)
$)
UNLESS argv!4=0 DO
$( charcode := getvec(127)
IF charcode=0 DO
$( writes(errstr)
GOTO fail $)
transchars := TRUE
codestream := findinput(argv!4)
IF codestream=0 DO
$( writef(errfil,argv!4)
GOTO fail $)
selectinput(codestream)
FOR i = 0 TO 127 DO charcode!i := readoctal()
closeinput(codestream)
codestream := 0
IF rc>0 DO
$( writes(errcde)
GOTO fail $)
$)
UNLESS argv!0=0 DO
$( sourcestream := findinput(argv!0)
IF sourcestream=0 DO
$( writef(errfil,argv!0)
GOTO fail $)
$)
UNLESS argv!1=0 DO
$( codestream := findoutput(argv!1)
IF codestream=0 DO
$( writef(errfil,argv!1)
GOTO fail $)
$)
keepocode := argv!2\=0
IF keepocode DO ocodename := argv!2
ocodelen := ocodename%0
ocodefile := getvec(ocodelen/bytesperword)
IF ocodefile=0 DO
$( writes(errstr)
GOTO fail $)
FOR i = 0 TO ocodelen DO ocodefile%i := ocodename%i
UNLESS keepocode DO
$( ocodefile%10 := '0'+(taskid/10) REM 10
ocodefile%11 := '0'+taskid REM 10
$)
cglen := cgname%0
UNLESS argv!3=0 DO cglen := cglen+1+argv!3%0
cg := getvec(cglen/bytesperword)
IF cg=0 DO
$( writes(errstr)
GOTO fail $)
FOR i = 1 TO 13 DO cg%i := cgname%i
UNLESS argv!3=0 DO
$( cg%14 := '-'
FOR i = 15 TO cglen DO cg%i := argv!3%(i-14)
$)
cg%0 := cglen
UNLESS sourcestream=0 DO
$( ocodestream := findoutput(ocodefile)
IF ocodestream=0 DO
$( writef(errfil,ocodefile)
GOTO fail $)
$)
treesize := 10000
declsize := 1800
savespacesize := 4 // for 8086 version
printtree := FALSE
cgworksize := 5000
cglisting := FALSE
naming, altobj := TRUE, FALSE
callcounting, profcounting := FALSE, FALSE
stkchking, restricted := FALSE, FALSE
cg.y, cg.z := FALSE, FALSE
cg.a, cg.b := 0, 0
IF datstring(datvec)=0 DO
FOR i = 0 TO 9 DO datvec%i := " "%i
UNLESS argv!6=0 DO
$( LET opts = argv!6
LET i = 0
LET rdn(opts,lvi) = VALOF
$( LET n = 0
LET i = !lvi+1
LET ch = opts%i
WHILE i<=opts%0 & '0'<=ch<='9' DO
$( n := n*10+ch-'0'
i := i+1
ch := opts%i
$)
!lvi := i-1
RESULTIS n
$)
WHILE i<=opts%0 DO
$( SWITCHON capitalch(opts%i) INTO
$( CASE 'T': printtree := TRUE
ENDCASE
CASE 'S': savespacesize := rdn(opts,@i)
ENDCASE
CASE 'L': treesize := rdn(opts,@i)
ENDCASE
CASE 'D': declsize := rdn(opts,@i)
ENDCASE
CASE '/': BREAK
$)
i := i+1
$)
WHILE i<=opts%0 DO
$( SWITCHON capitalch(opts%i) INTO
$( CASE 'R': restricted := TRUE
ENDCASE
CASE 'L': cglisting := TRUE
ENDCASE
CASE 'O': altobj := TRUE
ENDCASE
CASE 'C': stkchking := TRUE
ENDCASE
CASE 'N': naming := FALSE
ENDCASE
CASE 'P': profcounting := TRUE
CASE 'K': callcounting := TRUE
ENDCASE
CASE 'Y': cg.y := TRUE
ENDCASE
CASE 'Z': cg.z := TRUE
ENDCASE
CASE 'A': cg.a := rdn(opts,@i)
ENDCASE
CASE 'B': cg.b := rdn(opts,@i)
ENDCASE
CASE 'W': cgworksize := rdn(opts,@i)
ENDCASE
$)
i := i+1
$)
$)
UNLESS sourcestream=0 DO
$( writef("Tree space %I5*N", treesize)
treevec := getvec(treesize)
IF treevec=0 DO
$( writes("Can't get tree space*N")
GOTO fail $)
selectinput(sourcestream)
linecount := 1
reportcount := 0
$)
RESULTIS cg
fail:
closeinput(sourcestream)
closeoutput(ocodestream)
closeoutput(codestream)
UNLESS verstream=oldoutput DO
closeoutput(verstream)
UNLESS charcode=0 DO freevec(charcode)
rc := 20
RESULTIS cg
$)
AND closeoutput(s) BE UNLESS s=0 DO
$( selectoutput(s)
endwrite() $)
AND closeinput(s) BE UNLESS s=0 DO
$( selectinput(s)
endread() $)
AND readoctal() = VALOF
$( LET n = 0
LET ch = '*S'
WHILE ch='*S' | ch='*T' | ch='*N' DO ch := rdch()
FOR i = 1 TO 3 DO
$( UNLESS '0'<=ch<='7' DO rc := 10
n := n*8+ch-'0'
ch := rdch()
$)
UNLESS ch='*S' | ch='*T' | ch='*N' DO rc := 10
unrdch()
RESULTIS n
$)