// RaidPrint.bcpl. Raid printing routines for Lisp objects. // Changed August 26, 1981 by Bill van Melle // Allegro change August 4, 1981 4:27 PM by Beau Sheil // Last change July 20, 1981 8:01 PM by Beau Sheil // Last change May 9, 1981 12:29 AM by Beau Sheil // Last change April 14, 1981 8:07 PM by Beau Sheil // Tone change March 17, 1981 5:21 PM by Beau Sheil get "Raid.decl" external [ // procedures & statics defined Lprint; PrintName; PrintPtr; Wo; Wn; Wb; uradix; uprintlevel; ulistlength // statics used dsp; keys; @lvNIL; @lvVPtr; @VPtr0; @VPtr1 // procedures used RaidReset; Negate; Divide; Usc; Min; CRLF; ReadKeys; Wc; Ws EqNIL; VP; Gets; UCase @BGetBasePtr; @XGetBasePtr; @XGetBase32; IGetBase @SGetBase; @XSetBR; @RRead; @BGetBase; @XGetBase; @XGetBase1 GetLmarg; SetLmarg; GetBitPos ] manifest maxdigits = 32 static [ uradix = 8; uprintlevel = 5; ulistlength = 8 ] let Lprint(w ;numargs n) be // only recursion is from PrintList [ let savedLM = GetLmarg(dsp) // second arg is used to suppress CRLF and hence LMarg adjusmtment if n eq 1 then SetLmarg(dsp, GetBitPos(dsp)) switchon Type(w) into [ case ATOMTYPE: if selecton w>>AtomNumber-2 into [ // One char atoms have atom numbers = 2+their char code case $. : case $( : case $) : case $*s : true default : false ] then Wc($%) // % indicates special atoms PrintName(w>>AtomNumber) endcase case LISTTYPE: PrintList(w, uprintlevel) endcase case SMALLTYPE: PrintNum(w>>VA.vahi eq SMALLPOSspace ? 0, -1, w>>VA.valo, uradix) if (uradix eq 8) then Wc($Q) endcase case INTEGERTYPE: XGetBase32(w) PrintNum(VPtr0, VPtr1, uradix) if (uradix eq 8) then Wc($Q) endcase case FLTPTTYPE: Ws("FLOATP with bits: ") XGetBase32(w) PrintNum(VPtr0, VPtr1, 8); Wc($Q) // always octal endcase case STRINGPTRTYPE: Wc($"); PrintStr(w); Wc($"); endcase case ARRAYPTRTYPE: PrintArray(w); endcase default: //print pointer PrintPtr(w!0, w!1) if (Type(w) ne 0)&(VP(w) ge FirstMDSPage) then [ Ws(" ->"); PrintPtr(XGetBase(w), XGetBase1(w)) ] ] //ends switchon if n eq 1 then [ CRLF(); SetLmarg(dsp, savedLM) ] ] and PrintArray(lvAPtr) be [ XSetBR(lvAPtr) let w = RRead(offset Styp/16) // Flags and type are stored in the same word of the descriptor Wc($[); Wc(w<>ConsCell.Qfield // indirect cell. Take 1 level of do XGetBase32(lvVPtr) // indirection, to the correct cell lvVPtr>>ConsCell.Qfield = 0 // Turn off the CDR bits ] resultis lvVPtr ] and CDR(lvX) = valof // lvX is known to be LISTP # lvVPtr [ compiletest CDRCODING ifso [ XGetBase32(lvX) // 32 bits into VPPtr0 and 1 unless lvVPtr>>ConsCell.Qfield // indirect cell. Save its address do [ MoveAddr(lvX, lvVPtr) // for later offset, then indirect XGetBase32(lvVPtr) ] // to it let D = lvVPtr>>ConsCell.dfield unless D then resultis lvNIL let F = lvVPtr>>ConsCell.ibit MoveAddr(lvVPtr, lvX) // address is in same page as lvX lvVPtr>>VA.wordN = D lshift 1 unless F do XGetBasePtr(lvVPtr) // indirection for CDR ] ifnot [ MoveAddr(lvVPtr, lvX) // address is in same page as lvX lvVPtr>>VA.valo = lvVPtr>>VA.valo + 2 XGetBasePtr(lvVPtr) ] resultis lvVPtr ] and PrintName(name) be // takes an atom number [ BGetBasePtr(PNPspace, PNPbase + (name lshift 1)) // pname ptr into VPtr PrintChars(lvVPtr, 1, XGetBase(lvVPtr)<>VA.segment ls PNPspace do resultis 0 let MDSbyte = VP(ptr) rshift 1 let W = BGetBase(MDSTYPEspace, MDSTYPEbase + MDSbyte rshift 1) resultis ((MDSbyte&1) eq 0 ? W<