home *** CD-ROM | disk | FTP | other *** search
- #-h- os.r 5069 local 09/24/80 13:32:39
- # os --- convert text with backspaces to line printer spacing
-
- define (DEFAULT_PAGE_SIZE,66)
- define (MAXLINE,134)
- define (MAXLINE2,268) # MAXLINE * 2
- define (MAXLINE3,402) # MAXLINE * 3
- define (MAXLINE4,536) # MAXLINE * 4
- define (MAXLINE5,670) # MAXLINE * 5
- define (MAXLINE6,804) # MAXLINE * 6
-
- character c, arg (MAXARG), ibuf (MAXLINE), obuf (MAXLINE6)
- integer i, j, ibp, obp, newlines, overprint, topbuf,
- page_size, line_ctr
- integer ctoi, getarg, getlin
-
- procedure dump_buffer forward
- procedure trim_buffer (offset) forward
- procedure clear_buffer (offset) forward
-
- if (getarg (1, arg, MAXARG) == EOF || arg (1) ~= '-'c)
- page_size = DEFAULT_PAGE_SIZE
- else {
- i = 2
- page_size = ctoi (arg, i)
- if (arg (i) ~= EOS)
- call error ("usage: os [-<page length>]"p)
- }
-
- line_ctr = page_size
- newlines = 1
- overprint = NO
- topbuf = 0
- ibp = 0
- ibuf (1) = EOS
- do i = 1, MAXLINE6
- obuf (i) = ' 'c
-
- repeat { # for each logical input line
- obp = 0
- repeat { # for each character in that line
- ibp += 1
- c = ibuf (ibp)
- while (c == EOS) { # end of string, but not end of line
- if (getlin (ibuf, STDIN, MAXLINE) == EOF)
- break 3
- ibp = 1
- c = ibuf (1)
- }
- select (or (c, NUL))
- when (NEWLINE) # end of line reached
- break
- when (FF) {
- dump_buffer
- line_ctr = page_size
- }
- when (BS)
- obp -= 1
- when (' 'c)
- obp += 1
- else {
- obp += 1
- if (0 < obp && obp < MAXLINE) {
- select
- when (obuf (obp) == ' 'c) {
- obuf (obp) = c
- i = 1
- }
- when (obuf (obp + MAXLINE) == ' 'c) {
- obuf (obp + MAXLINE) = c
- i = 2
- }
- when (obuf (obp + MAXLINE2) == ' 'c) {
- obuf (obp + MAXLINE2) = c
- i = 3
- }
- when (obuf (obp + MAXLINE3) == ' 'c) {
- obuf (obp + MAXLINE3) = c
- i = 4
- }
- when (obuf (obp + MAXLINE4) == ' 'c) {
- obuf (obp + MAXLINE4) = c
- i = 5
- }
- when (obuf (obp + MAXLINE5) == ' 'c) {
- obuf (obp + MAXLINE5) = c
- i = 6
- }
- ifany {
- if (topbuf < i)
- topbuf = i
- }
- else {
- dump_buffer
- overprint = YES
- obuf (obp) = c
- topbuf = 1
- }
- }
- }
- }
- dump_buffer
- }
-
- stop
-
-
-
- # dump_buffer --- output buffers to STDOUT and clear
-
- procedure dump_buffer {
-
- local i, j, k
- integer i, j, k
-
- trim_buffer (0)
-
- if (overprint == NO) { # starting a new line
- line_ctr += 1
- if (line_ctr > page_size) {
- if (newlines > 0) { # at least 1 blank line at bottom
- call putch ('1'c, STDOUT)
- call putch (NEWLINE, STDOUT)
- newlines = 0
- overprint = YES # so next line is 1st on page
- }
- # else we're already at top of page
- line_ctr = 1
- }
- if (obuf (1) == NEWLINE) # outputting a blank line
- newlines += 1
- }
-
- if (obuf (1) ~= NEWLINE) { # a non-blank line to print
- for ( ; newlines > 0; newlines -= 1) {
- call putch (' 'c, STDOUT) # dump outstanding blank lines
- call putch (NEWLINE, STDOUT)
- }
- if (overprint == NO)
- call putch (' 'c, STDOUT)
- else
- call putch ('+'c, STDOUT)
- call putlin (obuf, STDOUT) # write first buffer segment
- for ({i = 1; k = MAXLINE}; i < topbuf;
- {i += 1; k += MAXLINE}) {
- trim_buffer (k)
- call putch ('+'c, STDOUT)
- call putlin (obuf (k + 1), STDOUT)
- clear_buffer (k)
- }
- }
- clear_buffer (0)
- topbuf = 0
- overprint = NO
-
- }
-
-
-
- # trim_buffer --- strip trailing blanks and terminate a buffer
-
- procedure trim_buffer (offset) {
- integer offset
-
- local i
- integer i
-
- for (i = offset + MAXLINE - 2; i > offset; i -= 1)
- if (obuf (i) ~= ' 'c)
- break
- obuf (i + 1) = NEWLINE
- obuf (i + 2) = EOS
-
- }
-
-
-
- # clear_buffer --- clear buffer to all blanks
-
- procedure clear_buffer (offset) {
- integer offset
-
- local i
- integer i
-
- for (i = offset + MAXLINE; i > offset; i -= 1)
- obuf (i) = ' 'c
-
- }
-
-
- end
- #-t-
- #-t- os 6132 local 01/05/81 16:48:30