// Type.bcpl - Type a text file
// last modified January 31, 1978
// Copyright Xerox Corporation 1979
//Run BLDR with "BLDR/f Type GP template
get "Streams.d"
external //statics declared elsewhere
[ keys; dsp ]
external //procedures declared elsewhere
[
SetupReadParam; ReadParam; Wss; Ws; Wo; PutTemplate; Zero; GetFixed
Gets; Puts; Opens; Endofs; GetBitPos; Closes; FileLength; Resets; FilePos; SetFilePos
CreateDisplayStream; ShowDisplayStream; Putbacks; ResetLine
]
static
[
Warnings; Errors; screen; Nlines; Pointers; Position; Switch; char
TabSet=0; BravoFormat=true; LineCnt; Cnt=false
]
manifest [ ContC=3; Space=#40; TAB=#11; ESC = #33; DEL = #177; black=1; white=0 ]
structure StreamCB [ fdcb word; ldcb word; @DCB ]
manifest lStreamCB = size StreamCB/16
let TypeProc() be
[
let xPointers = vec 2000
Pointers = xPointers
let DCB = @#420
let fontHeight = DCB>>DCB.height*2
Nlines = (750/fontHeight) - 6
let v = vec 30000
screen = CreateDisplayStream(Nlines,v,30000)
ShowDisplayStream(screen,DSbelow)
let Bar = CreatDisplayArea(0,4,0,black)//black line under system window
ShowDisplayStream(Bar,DSbelow)
Bar = CreatDisplayArea(0,2,0,white)//white space between system window and bar
ShowDisplayStream(Bar,DSbelow)
Bar = CreatDisplayArea(0,4,0,white)//white at the verry bottom of the screen
ShowDisplayStream(Bar,DSbelow,screen)
Bar = CreatDisplayArea(0,4,0,black)//black line under print out window
ShowDisplayStream(Bar,DSbelow,screen)
Ws("*n*n*n Type.run of January 31, 1978*n")
let FileName = vec 40
let Done,Command = nil,nil
let SwitchVec = vec 20; Switch = SwitchVec
Switch!1 = 0
SetupReadParam(0,0,0,SwitchVec)
for i = 1 to Switch!0 do
[
if (Switch!i ge $0) & (Switch!i le $9) then TabSet = Switch!i
if (Switch!i & #137) eq $Z then BravoFormat = false
if (Switch!i & #137) eq $L then Cnt = 1
if (Switch!i & #137) eq $C then Cnt = 2
]
//Now start the file loop
[
let Ptr = vec 4
let file = ReadParam($I,-1,FileName)
if file eq true then break
let ReportLength = true
LineCnt = 1
PutTemplate(dsp,"*n File: $S",FileName)
Position = Pointers
char = $*n
[ Done = PrintLines(file)
if ReportLength then
[ FilePos(file,Position)
let Length = FileLength(file,Ptr); SetFilePos(file,Position!0,Position!1)
PutTemplate(dsp," (Length = $ED bytes)",Ptr); ReportLength = false
]
if Done then
[ [ if Endofs(keys) then break; Gets(keys) ] repeat
Wss(screen,"*n*nEnd of File- type any character when done")
]
Command = Gets(keys)
if Command eq $↑ then
[ Position = Position-6; if Position ls Pointers then Position = Pointers
SetFilePos(file,Position!0,Position!1); LineCnt = Position!2
Wss(screen,"*n*n*n*n*n*n*n*n"); char = $*n; Done = false
]
if (Command eq DEL) % (Command eq ContC) then break
if (Command eq ESC) % Done then
[ Wss(screen,"*n*n*n*n*n~~~~~~~~~~~~~~~~*n"); break ]
] repeat
Closes(file)
if (Command eq DEL) % (Command eq ContC) then break
] repeat
]
and PrintLines(file) = valof
[
let buff = vec 2
let LineOvfl = false
FilePos(file,Position);Position!2 = LineCnt; Position = Position+3
let lines = 0
let oldPosn,Posn = 0,0
[
if Endofs(file) then resultis true
if LineOvfl % (char eq $*n) then
[
if char eq $*n then switchon Cnt into
[
case 1: PutTemplate(screen,"$3UD:",LineCnt); endcase
case 2: FilePos(file,buff); PutTemplate(screen," $4EO:",buff); endcase
default: Wss(screen, " ")
]
if LineOvfl then Wss(screen, "~~")
if (lines ge Nlines-4) then if (lines ge Nlines-3) % (char eq $*n) then
[ Wss(screen,">"); char = 0; resultis false ]
Wss(screen," ")
]
if not LineOvfl then char = Gets(file)
if BravoFormat & (char eq ($Z%)) then
[ if Endofs(file) then resultis true
char=Gets(file);if char eq $*n then break
] repeat
test char eq TAB ifnot Puts(screen,char) ifso switchon TabSet into
[
case $9: Puts(screen,Space) //put 9 spaces
case $8: Puts(screen,Space) //put 8 spaces
case $7: Puts(screen,Space) //put 7 spaces
case $6: Puts(screen,Space) //put 6 spaces
case $5: Puts(screen,Space) //put 5 spaces
case $4: Puts(screen,Space) //put 4 spaces
case $3: Puts(screen,Space) //put 3 spaces
case $2: Puts(screen,Space) //put 2 spaces
case $1: Puts(screen,Space) //put 1 spaces
case $0: endcase //put 0 spaces
default: Puts(screen,TAB) //put a real tab character
]
oldPosn = Posn; Posn = GetBitPos(screen)
LineOvfl = (Posn ls oldPosn) & (char ne $*n)? true,false
if LineOvfl then ResetLine(screen)
if LineOvfl % (char eq $*n) then lines = lines+1
if char eq $*n then LineCnt = LineCnt+1
] repeat
]
and CreatDisplayArea(buff,nlines,width,background,indent,resolution; numargs nargs) = valof
[
if nargs ls 5 then indent = 0
if nargs ls 4 then background = 0
if nargs ls 3 then width = 0
if nargs ls 4 then nlines = 2
if nargs ls 5 then resolution = 0
let stream = (GetFixed(lStreamCB+1) + 1) & #177776
Zero(stream,lStreamCB); Zero(buff,nlines*width)
stream>>StreamCB.fdcb = lv stream>>StreamCB.next
stream>>StreamCB.ldcb = lv stream>>StreamCB.next
stream>>StreamCB.width = width
stream>>StreamCB.indentation = indent
stream>>StreamCB.background = background
stream>>StreamCB.resolution = resolution
stream>>StreamCB.bitmap = buff
stream>>StreamCB.height = nlines/2
resultis stream
]