// BNCG1.bcpl - BCPL Compiler -- Nova Code Generator, Impure stream processor // Copyright Xerox Corporation 1980 // Last modified on Wed 01 Nov 72 0141.31 by jec. get "bncgx" let ScanImpures() be [ let Op = nil ///*DCS* More complex lookup let N, Nameptr = nil, nil let v = vec NAMELENGTH if PassTwo do WB(llabelt) Next: Op = Readop() if Op eq ENDSTATIC do [ return ] N = ReadL() ///*DCS* new Nameptr = LookForSym(N) Unpackstring(Nameptr, v) let val, valtype, ext, com = 0, 0, 0, 0 switchon Op into [ default: CGreport(-1) case ZEXT: com = 1 case EXT: goto Out case ZINT: com = 1 case INT: goto Val case ZLOC: com = 1 case LOC: ext = 1 goto Val ] Val: Op = Readop() val = Nval(ReadN()) vlabelt = vlabelt + 1 switchon Op into [ case STATIC: valtype = 1 goto Out case ENTRY: valtype = 2 goto Out case LENTRY: valtype = 3 goto Out default: CGreport(-1) ] Out: let t = (valtype lshift 5) + (com lshift 4) + ext let n = vec NAMELENGTH/2 let k = STRval(v, n) if PassTwo do WB(t) if PassTwo do WB(val) for i = 0 to k do if PassTwo do WB(n!i) unless SWCode goto Next WW(com eq 0 ? $*s, $z) test valtype eq 0 then WriteS("EXT") or test ext eq 0 then WriteS("INT") or WriteS("LOC") WW($*t) WriteO(vlabelt) WW($*t) ///*DCS* changed WriteName(N) if valtype ne 0 do [ WW($*t) ///*DCS* changed if Length(Nameptr) ls 8 do WW($*t) test valtype eq 1 then WriteOct(val) or [ WriteS("LAB"); WriteOct(eaddrvec!val) ] ] WW($*n) goto Next ]