home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cug / softt-12.lbr / OS.RQT / OS.RAT
Encoding:
Text File  |  1984-07-05  |  5.4 KB  |  195 lines

  1. #-h-  os.r         5069  local  09/24/80  13:32:39
  2. # os --- convert text with backspaces to line printer spacing
  3.  
  4.    define (DEFAULT_PAGE_SIZE,66)
  5.    define (MAXLINE,134)
  6.    define (MAXLINE2,268)   # MAXLINE * 2
  7.    define (MAXLINE3,402)   # MAXLINE * 3
  8.    define (MAXLINE4,536)   # MAXLINE * 4
  9.    define (MAXLINE5,670)   # MAXLINE * 5
  10.    define (MAXLINE6,804)   # MAXLINE * 6
  11.  
  12.    character c, arg (MAXARG), ibuf (MAXLINE), obuf (MAXLINE6)
  13.    integer i, j, ibp, obp, newlines, overprint, topbuf,
  14.          page_size, line_ctr
  15.    integer ctoi, getarg, getlin
  16.  
  17.    procedure dump_buffer forward
  18.    procedure trim_buffer (offset) forward
  19.    procedure clear_buffer (offset) forward
  20.  
  21.    if (getarg (1, arg, MAXARG) == EOF || arg (1) ~= '-'c)
  22.       page_size = DEFAULT_PAGE_SIZE
  23.    else {
  24.       i = 2
  25.       page_size = ctoi (arg, i)
  26.       if (arg (i) ~= EOS)
  27.          call error ("usage: os [-<page length>]"p)
  28.       }
  29.  
  30.    line_ctr = page_size
  31.    newlines = 1
  32.    overprint = NO
  33.    topbuf = 0
  34.    ibp = 0
  35.    ibuf (1) = EOS
  36.    do i = 1, MAXLINE6
  37.       obuf (i) = ' 'c
  38.  
  39.    repeat {    # for each logical input line
  40.       obp = 0
  41.       repeat {    # for each character in that line
  42.          ibp += 1
  43.          c = ibuf (ibp)
  44.          while (c == EOS) {   # end of string, but not end of line
  45.             if (getlin (ibuf, STDIN, MAXLINE) == EOF)
  46.                break 3
  47.             ibp = 1
  48.             c = ibuf (1)
  49.             }
  50.          select (or (c, NUL))
  51.             when (NEWLINE)       # end of line reached
  52.                break
  53.             when (FF) {
  54.                dump_buffer
  55.                line_ctr = page_size
  56.                }
  57.             when (BS)
  58.                obp -= 1
  59.             when (' 'c)
  60.                obp += 1
  61.          else {
  62.             obp += 1
  63.             if (0 < obp && obp < MAXLINE) {
  64.                select
  65.                   when (obuf (obp) == ' 'c) {
  66.                      obuf (obp) = c
  67.                      i = 1
  68.                      }
  69.                   when (obuf (obp + MAXLINE) == ' 'c) {
  70.                      obuf (obp + MAXLINE) = c
  71.                      i = 2
  72.                      }
  73.                   when (obuf (obp + MAXLINE2) == ' 'c) {
  74.                      obuf (obp + MAXLINE2) = c
  75.                      i = 3
  76.                      }
  77.                   when (obuf (obp + MAXLINE3) == ' 'c) {
  78.                      obuf (obp + MAXLINE3) = c
  79.                      i = 4
  80.                      }
  81.                   when (obuf (obp + MAXLINE4) == ' 'c) {
  82.                      obuf (obp + MAXLINE4) = c
  83.                      i = 5
  84.                      }
  85.                   when (obuf (obp + MAXLINE5) == ' 'c) {
  86.                      obuf (obp + MAXLINE5) = c
  87.                      i = 6
  88.                      }
  89.                ifany {
  90.                   if (topbuf < i)
  91.                      topbuf = i
  92.                   }
  93.                else {
  94.                   dump_buffer
  95.                   overprint = YES
  96.                   obuf (obp) = c
  97.                   topbuf = 1
  98.                   }
  99.                }
  100.             }
  101.          }
  102.       dump_buffer
  103.       }
  104.  
  105.    stop
  106.  
  107.  
  108.  
  109. # dump_buffer --- output buffers to STDOUT and clear
  110.  
  111.    procedure dump_buffer {
  112.  
  113.       local i, j, k
  114.       integer i, j, k
  115.  
  116.       trim_buffer (0)
  117.  
  118.       if (overprint == NO) {           # starting a new line
  119.          line_ctr += 1
  120.          if (line_ctr > page_size) {
  121.             if (newlines > 0) {        # at least 1 blank line at bottom
  122.                call putch ('1'c, STDOUT)
  123.                call putch (NEWLINE, STDOUT)
  124.                newlines = 0
  125.                overprint = YES         # so next line is 1st on page
  126.                }
  127.             # else we're already at top of page
  128.             line_ctr = 1
  129.             }
  130.          if (obuf (1) == NEWLINE)      # outputting a blank line
  131.             newlines += 1
  132.          }
  133.  
  134.       if (obuf (1) ~= NEWLINE) {       # a non-blank line to print
  135.          for ( ; newlines > 0; newlines -= 1) {
  136.             call putch (' 'c, STDOUT)  # dump outstanding blank lines
  137.             call putch (NEWLINE, STDOUT)
  138.             }
  139.          if (overprint == NO)
  140.             call putch (' 'c, STDOUT)
  141.          else
  142.             call putch ('+'c, STDOUT)
  143.          call putlin (obuf, STDOUT)    # write first buffer segment
  144.          for ({i = 1; k = MAXLINE}; i < topbuf;
  145.                {i += 1; k += MAXLINE}) {
  146.             trim_buffer (k)
  147.             call putch ('+'c, STDOUT)
  148.             call putlin (obuf (k + 1), STDOUT)
  149.             clear_buffer (k)
  150.             }
  151.          }
  152.       clear_buffer (0)
  153.       topbuf = 0
  154.       overprint = NO
  155.  
  156.       }
  157.  
  158.  
  159.  
  160. # trim_buffer --- strip trailing blanks and terminate a buffer
  161.  
  162.    procedure trim_buffer (offset) {
  163.    integer offset
  164.  
  165.       local i
  166.       integer i
  167.  
  168.       for (i = offset + MAXLINE - 2; i > offset; i -= 1)
  169.          if (obuf (i) ~= ' 'c)
  170.             break
  171.       obuf (i + 1) = NEWLINE
  172.       obuf (i + 2) = EOS
  173.  
  174.       }
  175.  
  176.  
  177.  
  178. # clear_buffer --- clear buffer to all blanks
  179.  
  180.    procedure clear_buffer (offset) {
  181.    integer offset
  182.  
  183.       local i
  184.       integer i
  185.  
  186.       for (i = offset + MAXLINE; i > offset; i -= 1)
  187.          obuf (i) = ' 'c
  188.  
  189.       }
  190.  
  191.  
  192.    end
  193. #-t-
  194. #-t-  os                         6132  local   01/05/81  16:48:30
  195.