123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- %
- % IBMIZE -- Extract underline and boldface info. from a
- % lineprinter file (and convert for the IBM)
- %
- % Control chararacters handled: TAB, NL, FF, CR
- % Other control characters assumed to be printing.
- % Tab stops assumed every 8 columns.
- % 9/14/82 Added handling of empty lines at end of page.
- % Somewhat ugly change.
- % The pgstream represents the state of output. Pgline
- % is the current line within the page, beginning at 1.
- % Emptycount keeps track of saved up lines with no visible
- % contents. These will be output if a nonempty line arrives
- % before end of page.
- pgstream = record[pgline: int, s: stream, emptycount: int]
- ac = array[char]
- % Line with possible underscore and/or boldface
- u_b_line = record[line: array[char],
- underscore: array[bool],
- bold: array[bool]]
- LINE_LENGTH = 150 % maximum printing length of output line
- main = proc ()
- sin: stream := get_io("read", "Input file: ", "lpt")
- except others: return end
- sout: stream := get_io("write", "Output file: ", "ibm")
- except others: return end
- process_file(sin, pgstream${s: sout, pgline: 1, emptycount: 0})
- stream$close(sin)
- stream$close(sout)
- end main
- % process_file(sin: stream, lout: pgstream)
- % Reads from sin until end of file, process each line to make
- % overstriking work, and keeps track of the position on the current
- % page, inserting form feeds as it deems necessary.
- process_file = proc (sin: stream, lout: pgstream)
- oline: u_b_line :=
- u_b_line${line: ac$fill(0, LINE_LENGTH, ' '),
- underscore: array[bool]$fill(0, LINE_LENGTH, false),
- bold: array[bool]$fill(0, LINE_LENGTH, false)}
- sout: stream := lout.s
- while true do
- process_line(sin, lout, oline)
- end except others: end
- %% stream$putc(sout,'\p')
- end process_file
- process_line = proc (sin: stream, lout: pgstream, oline: u_b_line)
- signals (done)
- sout: stream := lout.s
- line: string := get_line(sin)
- except others: signal done end
-
- %% Insert FF if needed.
- %% if lout.pgline > 60 cand ~ char$equal(string$fetch(line,1),'\p')
- %% then
- %% stream$putc (sout, '\p')
- %% lout.pgline := 1
- %% lout.emptycount := 0
- %% end
-
- for i: int in int$from_to(0,LINE_LENGTH - 1) do
- oline.line[i] := ' '
- oline.underscore[i] := false
- oline.bold[i] := false
- end
- col: int := 0
- for c: char in string$chars (line) do
- %% Special handling for non-printing chars and '_'
- if c = ' ' then col := col + 1
- elseif c = '\r' then col := 0
- elseif c = '\n' then lout.pgline := lout.pgline + 1
- elseif c = '\b' then col := col - 1
- elseif c = '\t' then col := col + 8 - (col // 8)
- elseif c = '\p' then
- col := 0
- lout.pgline := 1
- elseif c = '_' then
- oline.underscore[col] := true
- col := col + 1
- else
- oc: char := oline.line[col]
- if oc = ' ' then
- oline.line[col] := c
- elseif oc = c then
- oline.bold[col] := true
- end
- col := col + 1
- end
- end
-
- emptyp: bool := true
- for i: int in int$from_to(0,LINE_LENGTH - 1) do
- if oline.line[i] ~= ' ' cor
- oline.underscore[i] then
- emptyp := false
- break;
- end
- end
- if emptyp then
- lout.emptycount := lout.emptycount + 1
- else
- %% Put out any saved-up empty lines first
- for i:int in int$from_to(1,lout.emptycount) do
- stream$putc(sout,'\n')
- end
- lout.emptycount := 0
- %% Print out everything involved in the line.
- output_line(oline, sout)
- end
-
- %% Print the formfeed that came with (terminating) the line.
- if char$equal('\p',string$fetch(line,string$size(line))) then
- stream$putc(sout,'\p')
- %% Throw away any empty lines just preceding \p
- lout.emptycount := 0
- elseif ~emptyp then
- stream$putc(sout,'\n')
- end
- end process_line
- % output_line(oline, sout: stream)
- output_line = proc(oline: u_b_line, sout: stream)
- high: int := line_high(oline)
- for i: int in int$from_to (0, high) do
- stream$putc(sout, oline.line[i])
- if oline.underscore[i] then
- stream$putc(sout, '\b')
- stream$putc(sout, '_')
- end
- end
- %% stream$putc (sout, '\n')
- end output_line
- % line_high (line: u_b_line) returns (int)
- % Returns the index in the line of the last printing character.
- % If none exists, returns the minimum index minus 1.
- line_high = proc(oline: u_b_line) returns (int)
- for i: int in
- int$from_to_by(ac$high(oline.line), ac$low(oline.line), -1)
- do
- if oline.line[i] ~= ' '
- cor oline.underscore[i]
- then return(i) end
- end
- return(ac$low(oline.line) - 1)
- end line_high
- % get_line (sin: stream) returns (string) signals (end_of_file)
- % Reads from the stream characters through the first \n or \p.
- % If end of file is reached before any characters are entered,
- % end of file is signalled, otherwise not.
- % All characters read are returned.
- get_line = proc (sin: stream) returns (string) signals (end_of_file)
- a: ac := ac$new ()
- while true do
- c: char := stream$getc_image (sin)
- except others:
- if ac$size (a) = 0 then signal end_of_file end
- break
- end
- ac$addh (a, c)
- if c = '\n' cor c = '\p' then break end
- end
- %% if ac$top (a) = '\r' then ac$remh (a) end except when bounds: end
- return (string$ac2s (a))
- end get_line
- %%% Defines: get_line line_high main output_line process_file process_line
- %%% Edited: 14 September 1982 10:41:36
- %%% Uses: get_io
- %%% Written: 14 September 1982 10:45:04
|