//R E A D P R E S S // program to read press file, and report contents back to user // ReadPress/F puts output on file as well (ReadPress.Lst) //Bldr readpress readops gp // Copyright Xerox Corporation 1979 //outgoing procedures (for readops) external [ GetByte;GetWord;OddByte;GetReset;DLEven Show;Shown;Showch;ShowFloat;Error DoubleCop; DoubleSub; MulFull; DoubleShr ] //incoming procedures external [ SetupReadParam;ReadParam //from gp //PrintFloat PrintFloat //Readops ReadObject;ReadPart ] // OS procedures external [ OpenFile ReadBlock SetFilePos FileLength Puts Gets Closes CreateDisplayStream ShowDisplayStream GetFixed Wns Wss DoubleAdd keys ] //outgoing statics external [ PressFile ] static [ PressFile MyDsp;LinesPrinted;PWord;PByte ListFile ] //internal manifest and structure declarations manifest [ NUMLINES=40 Presspassword=27183 // Press password ] // Structures structure str: [ n byte ch↑1,255 byte ] structure [ lh byte rh byte ] // DDV used to access PRddir -- PR file document directory structure DDV: //used to access PRddir -- PR file document directory [ passwd word // password=27183 nrecs word // total no of records in PR file nparts word // no of parts pdstart word // where part directory begins pdrecs word // no of records backp word // back pointer spare1 word spare2 word fcopy word // first copy to print lcopy word // last copy to print ] manifest DDVlen=size DDV/16 // PD used to read page directory info structure PD: //used to read page directory info [ type word pstart word precs word infile bit 1 // true or false according to // whether part is still in input file dirty bit 1 // to indicate if page is dirty padding bit 14 ] manifest PDlen=size PD/16 structure PDV: //for storing stuff about part directory [ npages word // count of pages pageno word // page in vector recno word // record now in buf tbl word // table of page data buf word // address of 256-word buffer ] manifest PDVlen=size PD/16 structure FE: //used to read Font Directory entries [ length word // length of entry set bit 8 fno bit 8 destm bit 8 // first char code destn bit 8 // last fam word 10 // name string face bit 8 source bit 8 // first char siz word rotn word ] manifest FElen=size FE/16 structure ET: //used to access Entity Trailer [ type bit 8 // entity type fontset bit 8 // font set dstart1 word // byte address of data, high-order dstart2 word // low-order dlength1 word // byte length of data, high-order dlength2 word // low-order xe word // origin x ye word // y xleft word // lh corner ybottom word width word height word length word // length in words of entity ] manifest [ ETlen=size ET/16 ] manifest [ lmarg=1024 bmarg=1024 ScreenXMax=608 ScreenYMax=808 ] structure SV: [ code word bwidth word nsl word mode word dotsize word pw word ph word window word pb word db word pl word dl word follow word ] manifest SVlen=size SV/16 let start() be [ let str=vec 30; let sw=vec 26 SetupReadParam(str, sw) if sw!0 ne 0 & ((sw!1 eq $F)%(sw!1 eq $f)) then [ ListFile=OpenFile("ReadPress.Lst",0,1) ] PressFile=ReadParam("IW","Press file name -- ") let MyDspSize=30*14*30 MyDsp=CreateDisplayStream(NUMLINES,GetFixed(MyDspSize),MyDspSize) ShowDisplayStream(MyDsp) LinesPrinted=0 let end=vec 1 FileLength(PressFile,end) if (end!1̉) ne 0 then Error("Illegal Press file: file does not end on page boundary") let doc=vec 1 let page=vec 1;page!0=0;page!1=256*2 DoubleCop(doc,end) DoubleSub(doc,page) Show("Document directory:*n") SetFilePos(PressFile,doc) let docDir=vec 256 ReadBlock(PressFile,docDir,256) Show(" Password ") let pass=docDir!0 test pass eq Presspassword then Show("OK*N") or [ Show("illegal (=");Shown(pass);Show(")*n")] let numRecs=docDir!1 Show(" Number of records: ");Shown(numRecs) for i=1 to 9 do DoubleShr(doc) let realRecLen=doc!1+1 if realRecLen ne numRecs then //Wrong [ Show(" WRONG! Correct number is ");Shown(realRecLen)] let numParts=docDir!2 Show("*n Number of parts: ");Shown(numParts) let partStart=docDir!3 Show("*n Part directory starts in record ");Shown(partStart) let partLen=docDir!4 Show("*n Part directory length (in records) ");Shown(partLen) Show("*n First copy ");Shown(docDir!8) Show("*n Last copy ");Shown(docDir!9) Show("*n File name: ");Show(docDir+#200) Show("*n Creator's name: ");Show(docDir+#232) Show("*n Creation date: ");Show(docDir+#252) Show("*n") let partStartv=vec 1 MulFull(partStart,512,partStartv) SetFilePos(PressFile,partStartv) let parts=GetFixed(4*numParts) ReadBlock(PressFile,parts,4*numParts) for i=0 to (numParts-1)*4 by 4 do if parts!i eq 1 then ReadFont(parts+i) for i=1 to numParts do [ SetFilePos(PressFile,partStartv) ReadPart(i) ] test ListFile then Closes(ListFile) or [ Show("*n*nHit any character to finish*n") Gets(keys) ] ] and ReadFont(PartDir) be [ let fontDir=vec 1 MulFull(PartDir!1,512,fontDir) SetFilePos(PressFile,fontDir) let entrylen=Gets(PressFile) GetReset() Show("*nFont Directory*n") until entrylen eq 0 do [ Show("*n Set: ");Shown(GetByte()) Show("*n Font-no: ");Shown(GetByte()) Show("*n m: ");Shown(GetByte()) let n=GetByte() Show("*n n: ");Shown(n) let fam=vec 10 fam!0=Gets(PressFile) test n eq #377 & fam!0 eq 0 then //special format ReadObject(entrylen-4) or [ ReadBlock(PressFile,fam+1,9) Show("*n Family name: ");Show(fam) Show("*n Face: ");Shown(GetByte()) Show("*n Source: ");Shown(GetByte()) Show("*n Size: ");Shown(Gets(PressFile)) Show("*n Rotation: ");Shown(Gets(PressFile)) Show("*n") ] entrylen=Gets(PressFile) ] ] and GetReset() be PByte=0 and OddByte() = (PByte ne 0) and GetByte() = valof [ if PByte eq 0 then [ PWord=Gets(PressFile) PByte=1 resultis PWord<<lh ] PByte=0 resultis PWord<<rh ] and GetWord() = (GetByte() lshift 8)+GetByte() and DoubleCop(a, b) be [ a!0=b!0; a!1=b!1 ] and DoubleSub(a, b) be [ let c=vec 2 c!0=not b!0; c!1=not b!1 DoubleAdd(c, table [ 0;1 ] ) DoubleAdd(a, c) ] and DoubleShr(a) be [ a!1=(a!1 rshift 1)+(a!0 lshift 15) a!0=a!0 rshift 1 ] and MulFull(a, b, lvres) be [ let m=vec 1; m!0=0; m!1=a DoubleCop(lvres, table [ 0;0 ] ) while b ne 0 do [ if (b&1) ne 0 then DoubleAdd(lvres, m) DoubleAdd(m, m) b=b rshift 1 ] ] and Show(s,count;numargs n) be [ if n eq 1 then count=s>>str.n for i=1 to count do [ let ch=s>>str.ch↑i Puts(MyDsp, ch) if ListFile then Puts(ListFile, ch) if ch eq $*n & ListFile eq 0 then [ LinesPrinted=LinesPrinted+1 if LinesPrinted ge (NUMLINES-1) then [ Wss(MyDsp,"More?") let ch=Gets(keys) LinesPrinted=0 if (ch eq $n)%(ch eq $N) then [ if ListFile then Closes(ListFile);finish ] Wss(MyDsp," Yes*n") ] ] ] ] and ShowFloat(AC) be [ PrintFloat(MyDsp,AC) if ListFile then PrintFloat(ListFile,AC) ] and Showch(c) be [ let a=vec 1 a>>str.n=1; a>>str.ch↑1=c Show(a) ] and Shown(n, rad;numargs na) be [ if na ne 2 then rad=-10 Wns(MyDsp, n, rad) if ListFile then Wns(ListFile, n, rad) ] and Error(s) be [ Show(s) if ListFile then Closes(ListFile) Show("*n Hit any key to finish") Gets(keys) finish ] and DLEven() be [ if OddByte() then Show("*n ERROR -- DL has odd byte count for object or dots ") ]