home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / OS / CONIX2.LBR / CHAPTER7.DQC / CHAPTER7.DOC
Text File  |  2000-06-30  |  77KB  |  2,378 lines

  1.  
  2.  
  3.  
  4.  
  5.                  Chapter 7 - Redirection
  6.  
  7.  
  8.     Reading    program    input from a file, device, or  memory;    type-ahead
  9.     buffering;  diverting  screen output to    a file,    device,    or memory;
  10.     console    I/O redirection    options; screen    paging;'  sending  printer
  11.     output    to  a  file,  device,  memory, or via screen output; print
  12.     spooling; creating a pipeline from the output of  one  program    to
  13.     the input of another via disk or memory.
  14.  
  15.  
  16.                    - CONTENTS -
  17.     __________________________________________________________________
  18.  
  19.  
  20.       7.  Redirection...........................................   7-1
  21.  
  22.         7.1     Input File Redirection.............................   7-1
  23.  
  24.           7.1.1  Determining the End of a File..................   7-2
  25.  
  26.           7.1.2  Input Redirection Options......................   7-3
  27.  
  28.         7.1.2.1      [+] Use Default Settings..................   7-3
  29.  
  30.         7.1.2.2      [A] Auto Line    Feed........................   7-4
  31.  
  32.         7.1.2.3      [B] Boot After EOF........................   7-4
  33.  
  34.         7.1.2.4      [C] Disable Console Status................   7-4
  35.  
  36.         7.1.2.5      [D] Delete Input File    After EOF...........   7-5
  37.  
  38.         7.1.2.6      [E] Ignore the EOF Character..............   7-5
  39.  
  40.         7.1.2.7      [F] Enable Function Keys..................   7-5
  41.  
  42.         7.1.2.8      [G] Remove Glitch Characters..............   7-5
  43.  
  44.         7.1.2.9      [H] Hush Character Echo...................   7-6
  45.  
  46.         7.1.2.10  [I] Interpret    Special    Characters..........   7-6
  47.  
  48.         7.1.2.11  [K] Continue Input Read...................   7-6
  49.  
  50.         7.1.2.12  [L] Remove Line Feeds.....................   7-6
  51.  
  52.         7.1.2.13  [N] Count Lines/Characters................   7-7
  53.  
  54.         7.1.2.14  [O] Turn Off Character....................   7-7
  55.  
  56.         7.1.2.15  [P] Save Input Position...................   7-7
  57.  
  58.         7.1.2.16  [Q] Quiet Line Input Echo.................   7-7
  59.  
  60.  
  61.  
  62.                       -    i -
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.         7.1.2.17  [R] Recognize    Warm Boot...................   7-8
  71.  
  72.         7.1.2.18  [S] Skip Lines/Characters.................   7-8
  73.  
  74.         7.1.2.19  [T] Read From    TTY After EOF...............   7-8
  75.  
  76.         7.1.2.20  [U] Set Uniform Input    Delay...............   7-8
  77.  
  78.         7.1.2.21  [V] Verbose Input Echo....................   7-9
  79.  
  80.         7.1.2.22  [W] Set Input    Delay.......................   7-9
  81.  
  82.         7.1.2.23  [X] Expand Input to Screen................   7-9
  83.  
  84.           7.1.3  Programs that Resist Redirection...............   7-9
  85.  
  86.           7.1.4  Special Character Substitute...................  7-10
  87.  
  88.         7.1.4.1      Control Characters........................  7-10
  89.  
  90.         7.1.4.2      Non-interpret.............................  7-11
  91.  
  92.           7.1.5  Function Key Substitute........................  7-11
  93.  
  94.           7.1.6  Input Redirection from a Device................  7-12
  95.  
  96.         7.1.6.1      :KBD Raw Console Keyboard.................  7-12
  97.  
  98.         7.1.6.2      :NUL Null Device..........................  7-13
  99.  
  100.         7.1.6.3      :RDR Reader...............................  7-13
  101.  
  102.         7.1.6.4      :TTY Console Keyboard.....................  7-13
  103.  
  104.         7.1.6.5      :UDI User Defined Device..................  7-13
  105.  
  106.         7.1.6.6      :UIA User Defined Address.................  7-14
  107.  
  108.           7.1.7  Redirection From Memory........................  7-14
  109.  
  110.           7.1.8  Some Input    Redirection Examples................  7-15
  111.  
  112.           7.1.9  Type-Ahead    Buffering...........................  7-16
  113.  
  114.         7.2     Console Output    File Redirection....................  7-17
  115.  
  116.           7.2.1  Output Redirection    Options.....................  7-17
  117.  
  118.         7.2.1.1      [A] Auto Line    Feed........................  7-18
  119.  
  120.         7.2.1.2      [B] Boot After End of    Output..............  7-18
  121.  
  122.         7.2.1.3      [D] Append to    Binary Data File............  7-18
  123.  
  124.         7.2.1.4      [E] Disable EOF Termination...............  7-18
  125.  
  126.  
  127.  
  128.                       -    ii -
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.         7.2.1.5      [G] Remove Glitch Characters..............  7-19
  137.  
  138.         7.2.1.6      [H] Strip Hi-Bit..........................  7-19
  139.  
  140.         7.2.1.7      [I] Set Invisible Attribute...............  7-19
  141.  
  142.         7.2.1.8      [L] Remove Extra Line    Feeds...............  7-19
  143.  
  144.         7.2.1.9      [N] Count Lines/Characters................  7-19
  145.  
  146.         7.2.1.10  [O] Turn Off Character....................  7-20
  147.  
  148.         7.2.1.11  [P] Print Output Characters...............  7-20
  149.  
  150.         7.2.1.12  [S] Skip Lines/Characters.................  7-20
  151.  
  152.         7.2.1.13  [T] Terminate    File with CR/LF.............  7-20
  153.  
  154.         7.2.1.14  [X] Expand Tabs to Spaces.................  7-21
  155.  
  156.           7.2.2  Output Redirection    to a Device.................  7-21
  157.  
  158.         7.2.2.1      :CON Console Screen.......................  7-21
  159.  
  160.         7.2.2.2      :CRT Raw Console Screen...................  7-22
  161.  
  162.         7.2.2.3      :LST System Printer.......................  7-22
  163.  
  164.         7.2.2.4      :NUL Null Device..........................  7-22
  165.  
  166.         7.2.2.5      :PUN Punch Device.........................  7-22
  167.  
  168.         7.2.2.6      :UDO User Defined Device..................  7-22
  169.  
  170.         7.2.2.7      :UOA User Defined Address.................  7-22
  171.  
  172.           7.2.3  Output Redirection    to Memory...................  7-22
  173.  
  174.           7.2.4  Some Output Redirection Examples...............  7-23
  175.  
  176.           7.2.5  Auto Screen Paging.............................  7-24
  177.  
  178.         7.3     Printer Output    File Redirection....................  7-25
  179.  
  180.           7.3.1  Printer Redirection Options....................  7-25
  181.  
  182.           7.3.2  Printer Output Redirection    to a Device.........  7-26
  183.  
  184.           7.3.3  Printer Redirection To Memory..................  7-26
  185.  
  186.         7.4     Print Spooling.....................................  7-27
  187.  
  188.         7.5     Multiple Redirections..............................  7-28
  189.  
  190.         7.6     Pipe Redirection...................................  7-28
  191.  
  192.  
  193.  
  194.                      - iii -
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.           7.6.1  Memory Pipelines...............................  7-30
  203.  
  204.           7.6.2  Using Pipes and Redirection....................  7-31
  205.  
  206.           7.6.3  Pipe Redirection Filename......................  7-31
  207.  
  208.         7.7     Disabling Redirection..............................  7-32
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.                       -    iv -
  261.  
  262.  
  263.  
  264.  
  265.  
  266.     ConIX Operating    System                       Redirection
  267.  
  268.     7.  Redirection
  269.  
  270.     Did you    ever wish you could save the output of a program in a file
  271.     without    having to manually retype it yourself?    Did you    ever wish
  272.     you could get a    program    to read    its input from someplace other
  273.     than the keyboard?  If you haven't, then you've    probably never
  274.     experienced a UNIX system.  This concept is called Redirection,
  275.     and is a major foundation behind the flexibility of UNIX, and
  276.     ConIX as well.    Consider your wishes, if you had them, answered.
  277.  
  278.     By definition, Redirection is the change in direction or flow of
  279.     either the input or output stream of a program.     Programs
  280.     generally use the console keyboard for user input, and the console
  281.     screen or the printer device for output.  With ConIX, you can
  282.     redirect a program's input to read from    a file or another system
  283.     input device (like the reader).     You can also redirect a program's
  284.     console    output to a file, a system output device (like the punch),
  285.     or into    the input of another program.  Both input and output
  286.     redirection can    also utilize memory as a file.    This feature
  287.     offers a major speed improvement speed over disk-file redirection.
  288.     All these forms    of redirection are described in    detail in the
  289.     sections that follow.
  290.  
  291.  
  292.     7.1  Input File    Redirection
  293.  
  294.     The redirection    of program input to read from a    file instead of
  295.     the console keyboard is    called Input File Redirection.    When a
  296.     program    is redirected in such a    way, all that it sees is a steady
  297.     stream of characters, thinking that they are originating from the
  298.     user at    console    keyboard.  ConIX itself    feeds these characters to
  299.     the program from the specified file.
  300.  
  301.     The syntax of Input File Redirection is:
  302.  
  303.         <A:00> cmd (arg(s)) <([option(s)]) infile
  304.  
  305.     where cmd represents the command whose input is    to be redirected
  306.     from the disk file infile.  The    [options] represent certain
  307.     optional features which    the user can specify to    modify certain
  308.     default    settings related to the    input redirection process.
  309.     Commands used with redirection may be either internal to ConIX or
  310.     regular    disk-based programs.
  311.  
  312.     Take as    an example the internal    command    GETL which simply reads    a
  313.     line from the keyboard and retypes it to the screen as:
  314.  
  315.         <A:00> getl
  316.         this is    the line you typed
  317.         this is    the line you typed
  318.         <A:00>
  319.  
  320.     The first line shown above was typed by    the user and the second
  321.     repeated by GETL.  You can use GETL with its input redirected from
  322.     a file,    as:
  323.  
  324.  
  325.  
  326.                        7-1
  327.  
  328.  
  329.  
  330.  
  331.  
  332.     Redirection                    ConIX Operating System
  333.  
  334.         <A:00> getl < foo.asm
  335.         this is    the first line of FOO.ASM
  336.         <A:00>
  337.  
  338.     where GETL will    read its input line from the text file FOO.ASM
  339.     instead    of from    the console keyboard, and then output it to the
  340.     screen.     The line which    is read    is the first line of the input
  341.     file.
  342.  
  343.     NOTE:  The `<' input redirection specifier and its given input
  344.     file are internally stored on the parsed command line, thus
  345.     subtracting from the amount of space available to store    commands
  346.     and arguments (normally    255 characters).  All such redirection
  347.     specifications are preinterpreted by ConIX and not passed as
  348.     arguments to the running program.  In the above    example, there are
  349.     actually no arguments to the command GETL.  Any    spaces or tabs
  350.     around the `<' are optional.
  351.  
  352.  
  353.     7.1.1  Determining the End of a    File
  354.  
  355.     ConIX determines the end of a file by one of two methods:
  356.  
  357.     The EOF    Character
  358.  
  359.       There    is usually a character at the end of every text    file which
  360.       indicates that there exist no    more characters    in the file beyond
  361.       that point.  This is called the CP/M EOF character which is a
  362.       CTRL-Z, or 1A    hex.  It is an actual character    that is    stored
  363.       within the file.
  364.  
  365.       A text file may in no    way contain the    EOF character as part of
  366.       itself since the CTRL-Z would    be interpreted as indicating the
  367.       end of file.    Command    files, on the other hand, usually contain
  368.       this character, which    may be part of a machine language
  369.       instruction, or the program's    internal data.    It would be
  370.       severely limiting to say that    no file    can contain this
  371.       character, and it is for this    reason that there exists another
  372.       method of determining    the end    of a file.
  373.  
  374.     The Physical End-of-file
  375.  
  376.       There    is a condition internal    to CP/M    itself which prevents a
  377.       program from reading past the    last written record of a file.
  378.       This is called the physical EOF, and is generally used to
  379.       determine the    end of a file which must contain the CP/M EOF
  380.       character within it, as with command or object files.
  381.  
  382.       This method of determining the end of    a file is not as precise
  383.       as with the use of the EOF character.     This is because a
  384.       physical EOF occurs at the end of the    last disk data record of
  385.       the file.  Each record is 128    bytes long, with the true ending
  386.       byte being somewhere between byte 1 to 128 in    the last record.
  387.       Reading a file to the    physical EOF may cause up to 127 bytes of
  388.       this record which are    not really part    of file    to be included
  389.  
  390.  
  391.  
  392.                        7-2
  393.  
  394.  
  395.  
  396.  
  397.  
  398.     ConIX Operating    System                       Redirection
  399.  
  400.       after    the last true byte in the file.
  401.  
  402.       Program (.COM) files loaded by ConIX from the    command    line are
  403.       read until the physical EOF, and end at a 128    byte boundary in
  404.       memory.  The fact that any spurious characters at the    end of the
  405.       last record may be included has absolutely no    effect upon the
  406.       operation of the program.  This is because its coded machine
  407.       instructions lie before the last ``written'' byte of the file,
  408.       and the program knows    not to execute anything    immediately past
  409.       that byte.
  410.  
  411.     In the case of input redirection, ConIX    assumes    that the named
  412.     file contains text, with its end marked    by a CTRL-Z.  Command or
  413.     object files passed to a program through input redirection would
  414.     probably get cut off somewhere before their end    if this    character
  415.     would (and usually does) appear    within them.  There are    options
  416.     available which    would allow you    to redirect a file until its
  417.     physical EOF if    desired.
  418.  
  419.     In any case, once the end of file is reached, ConIX continually
  420.     sends the EOF character    if a program still requests input.  The
  421.     number of EOF characters sent is infinite and therefore, a program
  422.     which doesn't recognize    it can remain in an infinite loop, forever
  423.     receiving CTRL-Z as input.  There is another redirection option
  424.     which would prevent this from happening.  There    is also    a special
  425.     new BDOS syscall that allows a program to determine if a CTRL-Z
  426.     received is a part of the actual input data, or    was sent by ConIX
  427.     to indicate the    EOF condition.
  428.  
  429.  
  430.     7.1.2  Input Redirection Options
  431.  
  432.     There are certain options available to Input Redirection which can
  433.     affect the characters passing through the redirection stream.  If
  434.     options    are to be used,    be sure    to include the square brackets
  435.     around them, and separate each option by a comma.  The left
  436.     bracket    of the option list must    be placed directly next    to the
  437.     redirection symbol (`<') without any intermediate characters.
  438.  
  439.  
  440.     7.1.2.1     [+] Use Default Settings
  441.  
  442.         <A:00> cmd <[+opt1,opt2, . . . ,optn] inspec
  443.  
  444.     ConIX will normally reset all default options whenever an option
  445.     list is    specified to input redirection.     If a plus-sign    appears
  446.     before the options list, the options requested will be set in
  447.     addition to the    default    console    input option settings.    These
  448.     default    options    are set    automatically by ConIX whenever    a program
  449.     is running with    its input unredirected.     They are [e,f,x=0] and
  450.     will be    maintained if a    `+' is used.
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.                        7-3
  459.  
  460.  
  461.  
  462.  
  463.  
  464.     Redirection                    ConIX Operating System
  465.  
  466.     7.1.2.2     [A] Auto Line Feed
  467.  
  468.         <A:00> cmd <[a]    inspec
  469.  
  470.     When this option is specified, ConIX will automatically    append a
  471.     Line Feed character (LF) after every Carriage Return (CR)
  472.     encountered in its input stream.
  473.  
  474.  
  475.     7.1.2.3     [B] Boot After    EOF
  476.  
  477.         <A:00> cmd <[b]    inspec
  478.  
  479.     Many programs do not recognize the significance    of the EOF
  480.     character, normally sent through the redirection stream    to
  481.     indicate the end of a file.  In    many cases, all    that would be
  482.     necessary to terminate such a program is a warm    boot when the EOF
  483.     is reached.  Using the [B] option will cause a warm boot to be
  484.     provided automatically when program input reaches EOF.
  485.  
  486.  
  487.     7.1.2.4     [C] Disable Console Status
  488.  
  489.         <A:00> cmd <[c]    inspec
  490.  
  491.     Some programs internally poll the system keyboard for certain
  492.     characters while they are running.  Such characters are    generally
  493.     used to    provide    some form of control function.    For example, a
  494.     BASIC interpreter may look for a CTRL-S    to start/stop the display,
  495.     or a CTRL-C to abort program execution.     Generally, if you were    to
  496.     type any other character, it would be discarded    and the    program
  497.     will continue to wait for one of the special characters    it
  498.     recognizes as performing some action.
  499.  
  500.     It is important    to realize that    a program which    has its    input
  501.     redirected receives the    characters from    the input file as a
  502.     constant stream.  If the program, as BASIC in our example, would
  503.     be redirected, it would    see a character    waiting    every time it
  504.     polled console status.    It would then read an actual character
  505.     from the input stream, thinking    it would be a special control
  506.     function character.  Obviously it won't    be, and    the input data
  507.     would be discarded and lost forever.
  508.  
  509.     By using the [C] option, every time BASIC checked if a character
  510.     was ready, it would get    a ``no'' from ConIX.  This checking is
  511.     done by    a BDOS 6 or BDOS 11 system call, or by using the BIOS
  512.     console    status routine.     In either of these cases, the value
  513.     returned would be a 0.    Therefore, only    those characters which a
  514.     program    requests in the    form of    a direct console input call
  515.     (BDOS 1    or BIOS    console    input) will be passed to the program.  If
  516.     the program does not directly request its input    but instead uses
  517.     this polling method to read its    regular    input characters, then
  518.     this option will not yield the desired results.
  519.  
  520.  
  521.  
  522.  
  523.  
  524.                        7-4
  525.  
  526.  
  527.  
  528.  
  529.  
  530.     ConIX Operating    System                       Redirection
  531.  
  532.     7.1.2.5     [D] Delete Input File After EOF
  533.  
  534.         <A:00> cmd <[d]    inspec
  535.  
  536.     If the [D] option is specified,    the named input    redirection file
  537.     will be    deleted    after the program completes its    execution.  This
  538.     option should be used with caution because of the obvious
  539.     implications.  It is useful, however, for quick    removal    of a
  540.     temporary or intermediate file.
  541.  
  542.  
  543.     7.1.2.6     [E] Ignore the    EOF Character
  544.  
  545.         <A:00> cmd <[e]    inspec
  546.  
  547.     ConIX uses the CP/M EOF    character to indicate the end of the input
  548.     redirection file.  This    is the default since the file being
  549.     redirected is usually a    text file which    ends with the EOF
  550.     character.  It is sometimes necessary to redirect input    from files
  551.     which contain this character within them as actual data, as is
  552.     generally the case with    .COM or    object files.  In such instances,
  553.     it is necessary    to use the [E] option to prevent the file from
  554.     being cut off in the middle.
  555.  
  556.     NOTE:  Although    ConIX will read    the file to the    last written
  557.     record,    it still returns the CP/M EOF character    at the Physical
  558.     EOF.  In order for a program to    determine whether or not this is
  559.     the actual EOF indicator or just another character in the file,
  560.     you must use a special ConIX system call.  This    syscall    is
  561.     available through the standard BDOS interface to languages that
  562.     support    direct BDOS calls.
  563.  
  564.  
  565.     7.1.2.7     [F] Enable Function Keys
  566.  
  567.         <A:00> cmd <[f]    inspec
  568.  
  569.     By default, function key references within the input redirection
  570.     stream will not    be recognized or expanded.  This is primarily
  571.     because    a file may contain the special lead-in character as a part
  572.     of its data (especially    possible within    command    or object files).
  573.     Specifying the [F] option will allow any encountered function key
  574.     references to be expanded into the input stream.  The lead-in
  575.     character to be    used is    specified by the OPT +/-FK internal
  576.     command.  The function key feature is described    in detail later    on
  577.     in the chapter.
  578.  
  579.  
  580.     7.1.2.8     [G] Remove Glitch Characters
  581.  
  582.         <A:00> cmd <[g]    inspec
  583.  
  584.     If the [G] option is supplied, ConIX will filter out and discard
  585.     from the input stream all control characters in    the range of 00    -
  586.     1F hex,    with the exception of the EOF character, 1A hex.
  587.  
  588.  
  589.  
  590.                        7-5
  591.  
  592.  
  593.  
  594.  
  595.  
  596.     Redirection                    ConIX Operating System
  597.  
  598.     7.1.2.9     [H] Hush Character Echo
  599.  
  600.         <A:00> cmd <[h]    inspec
  601.  
  602.     Most programs read their input characters by using the standard
  603.     console    input (BDOS 1) system call.  It    is a function of the
  604.     operating system to echo to the    screen all characters that are
  605.     input via this syscall.     The [H] option    allows this echo to be
  606.     suppressed.  This is especially    useful for Command Language
  607.     programs which may desire privacy when reading a password or
  608.     security code from the user.
  609.  
  610.  
  611.     7.1.2.10  [I] Interpret    Special    Characters
  612.  
  613.         <A:00> cmd <[i]    inspec
  614.  
  615.     By default, special characters within the input    redirection stream
  616.     will not be interpreted    by ConIX.  (For    a description of this
  617.     feature, see the section on Special Character Substitute, below.)
  618.     This is    because    the input file may contain these characters as a
  619.     part of    itself and therefore, is probably not intended for
  620.     modification.  Setting the [I] option will allow these characters
  621.     to be interpreted.
  622.  
  623.  
  624.     7.1.2.11  [K] Continue Input Read
  625.  
  626.         <A:00> cmd <[k=&address] inspec
  627.  
  628.     The [K]    option is used to continue reading a disk or memory file
  629.     from the position saved    by the [P] option (below) at the specified
  630.     memory address.     Using these two options provides for programmed
  631.     manipulation of    records    in a file.
  632.  
  633.  
  634.     7.1.2.12  [L] Remove Line Feeds
  635.  
  636.         <A:00> cmd <[l]    inspec
  637.  
  638.     In general, lines within text files are    usually    terminated by the
  639.     Carriage Return    plus Line Feed (CR/LF) sequence.  By itself, the
  640.     Carriage Return    character (0D hex, CTRL-M) returns the cursor or
  641.     carriage to the    leftmost position of the current line.    The Line
  642.     Feed character (0A hex,    CTRL-J)    scrolls    the screen or platen to
  643.     the next line.    This sequence is necessary in order to make a file
  644.     readable on paper or on    a CRT.
  645.  
  646.     Most programs request input from the user in the form of a
  647.     sequence of characters followed    by a Carriage Return.  If we were
  648.     to feed    such a program a file which contains the CR/LF sequence    at
  649.     the end    of each    line, the LF would be extra and, in many cases,
  650.     cause undesirable effects.  By specifying the [L] option, all LF's
  651.     will be    removed    from the input stream.
  652.  
  653.  
  654.  
  655.  
  656.                        7-6
  657.  
  658.  
  659.  
  660.  
  661.  
  662.     ConIX Operating    System                       Redirection
  663.  
  664.     7.1.2.13  [N] Count Lines/Characters
  665.  
  666.         <A:00> cmd <[n=#count(c)] inspec
  667.  
  668.     The [N]    option provides    the capability of cutting off the input
  669.     stream after a specified number    of lines or characters.     ConIX
  670.     will simulate the EOF condition    once the requested count has been
  671.     achieved.  Characters will be counted if the character `c' is
  672.     placed after the decimal count number.    If `c' is omitted, and
  673.     only a number is supplied, lines will be counted.  (A line in a
  674.     file is    terminated by a    Line Feed (LF) character.)
  675.  
  676.     NOTE:  The specified count may be as large as 65535, decimal.  No
  677.     input will be produced if a value of zero is given, thus flagging
  678.     an EOF as soon as input    is requested.
  679.  
  680.  
  681.     7.1.2.14  [O] Turn Off Character
  682.  
  683.         <A:00> cmd <[o=&byte] inspec
  684.  
  685.     The [O]    option turns off, or filters out, from the input stream
  686.     any character which matches the    specified hex byte code.  Legal
  687.     character codes    range from 00 -    FE hex.
  688.  
  689.  
  690.     7.1.2.15  [P] Save Input Position
  691.  
  692.         <A:00> cmd <[p=&address] inspec
  693.  
  694.     The [P]    option is used to save the position within a disk or
  695.     memory file at which an    EOF condition was forced (by the [N]
  696.     option), or actually occurred.    In many    cases there are    more lines
  697.     in the file after a forced EOF,    and the    [K] option can be used to
  698.     continue reading from that point.  To test whether an actual EOF
  699.     was hit, the $%E variable should be used.
  700.  
  701.     Memory at the specified    address    is used    to hold    a pointer to the
  702.     next input character to    be read.  When used with redirection from
  703.     a file,    five bytes starting at this address are    used to    store the
  704.     pointer    information.  With memory redirection, only two    bytes are
  705.     used, and their    value is equal to the address at which the input
  706.     ended.    This data can prove to be useful within    Command    Language
  707.     programs.
  708.  
  709.  
  710.     7.1.2.16  [Q] Quiet Line Input Echo
  711.  
  712.         <A:00> cmd <[q]    inspec
  713.  
  714.     Many programs read their input in the form of editable lines by
  715.     using the Read Line system call    (BDOS 10).  ConIX normally echos
  716.     the input characters so    the user can see what is being typed.  The
  717.     [Q] option can be used to disable the echoing of input characters
  718.     for instances when privacy is needed.
  719.  
  720.  
  721.  
  722.                        7-7
  723.  
  724.  
  725.  
  726.  
  727.  
  728.     Redirection                    ConIX Operating System
  729.  
  730.     7.1.2.17  [R] Recognize    Warm Boot
  731.  
  732.         <A:00> cmd <[r]    inspec
  733.  
  734.     Programs that read their input in the form of editable lines
  735.     through    the Read Line system call (BDOS    10), recognize CTRL-C as
  736.     indicating a warm boot when entered at the beginning of    the input
  737.     line.  Using the [R] option allows a CTRL-C to cause a warm boot
  738.     at any point in    the input line,    or even    if the program uses
  739.     single-character input (BDOS 1/6), or direct BIOS calls.
  740.  
  741.  
  742.     7.1.2.18  [S] Skip Lines/Characters
  743.  
  744.         <A:00> cmd <[s=#count(c)] inspec
  745.  
  746.     The [S]    option provides    the ability to skip a specified    number of
  747.     lines or characters in the input stream    before any data    is
  748.     actually passed    to the running program.     If the    decimal    number
  749.     count is followed by the character `c',    the requested number of
  750.     characters will    be skipped.  If    `c' is omitted,    entire lines (each
  751.     terminated by an LF) will be skipped.
  752.  
  753.     NOTE:  The specified count may be as large as 65535, decimal.  A
  754.     value of zero will produce no action, thus ignoring the    option.
  755.  
  756.  
  757.     7.1.2.19  [T] Read From    TTY After EOF
  758.  
  759.         <A:00> cmd <[t]    inspec
  760.  
  761.     The [T]    option will cause program input    to be read from    the
  762.     console    keyboard (:TTY)    after the end of file is reached.  No EOF
  763.     character will be sent at the point of this switch-over.  All
  764.     redirection options specified when reading from    the file remain
  765.     active when input reverts to the keyboard.
  766.  
  767.  
  768.     7.1.2.20  [U] Set Uniform Input    Delay
  769.  
  770.         <A:00> cmd <[u=#delay] inspec
  771.  
  772.     When using the [U] option, programs which poll console status
  773.     (such as BASIC in the example for [C], above) must do so for delay
  774.     number of times    before a ready console status is returned.  No
  775.     resetting of this count    occurs,    as with    the [W]    option,    if a non-
  776.     status syscall is received.  The delay refers to the number of
  777.     times a    console-status system call must    be executed before
  778.     receiving a ``character    ready''    return value.  Using this option
  779.     should solve many problems with    programs which poll for    input
  780.     characters as well as special ``interrupt'' characters.
  781.  
  782.     NOTE:  The delay constant may be as large as 65535, decimal.
  783.  
  784.  
  785.  
  786.  
  787.  
  788.                        7-8
  789.  
  790.  
  791.  
  792.  
  793.  
  794.     ConIX Operating    System                       Redirection
  795.  
  796.     7.1.2.21  [V] Verbose Input Echo
  797.  
  798.         <A:00> cmd <[v=#type] inspec
  799.  
  800.     Using the [V] option causes all    characters read    from the input
  801.     stream to be echoed to the screen.  These characters may then be
  802.     caught by Output Redirection, which is useful for having input
  803.     appear in the output file (see Output Redirection, below).
  804.  
  805.     The type argument determines what forms    of input characters will
  806.     be expanded.  If [V=0],    only characters    read by    BDOS 1 system
  807.     calls will be expanded.     If [V=1], all input characters    will be
  808.     expanded to the    standard console output    stream (:CON).
  809.  
  810.  
  811.     7.1.2.22  [W] Set Input    Delay
  812.  
  813.         <A:00> cmd <[w=#delay] inspec
  814.  
  815.     Programs which poll console status (such as BASIC in the example
  816.     for the    [C] option, above) must    do so for delay    times in sequence
  817.     before console status is returned ready.  An internal counter is
  818.     kept of    all such system    calls (CP/M BDOS 6, 11,    or BIOS    console
  819.     status)    and if any other system    calls are received, this counter
  820.     is reset to zero and the delay restarted.  This    option differs
  821.     from the operation of the [U] option which does    not reset the
  822.     delay counter.
  823.  
  824.     Using the [W] option should solve incompatibility problems with
  825.     programs which poll for    input characters as well as special
  826.     ``interrupt'' characters.
  827.  
  828.     NOTE:  The delay constant may be as large as 65535, decimal.
  829.  
  830.  
  831.     7.1.2.23  [X] Expand Input to Screen
  832.  
  833.         <A:00> cmd <[x=#type] inspec
  834.  
  835.     This option is similar to [V] (above), except that, in this case,
  836.     characters are sent directly to    the screen and cannot be caught    by
  837.     output redirection.  The type argument determines the form of
  838.     input characters which will be expanded.  If [X=0], only
  839.     characters read    by BDOS    1 system calls will be expanded.  If
  840.     [X=1], any and all input characters will be output directly to the
  841.     console    screen.
  842.  
  843.  
  844.     7.1.3  Programs    that Resist Redirection
  845.  
  846.     Some existing CP/M programs just don't take a liking to    input
  847.     redirection, simply because they weren't written with ConIX in
  848.     mind.  Redirecting such    programs may yield undesirable results
  849.     such as    lost characters, an infinite loop at the end of    the file,
  850.     or they    may just blow up.  To get around these problems    you can
  851.  
  852.  
  853.  
  854.                        7-9
  855.  
  856.  
  857.  
  858.  
  859.  
  860.     Redirection                    ConIX Operating System
  861.  
  862.     try using some of the redirection options that are available.
  863.  
  864.     The [B]    option is useful for programs which hang at the    end of the
  865.     input file because they    do not recognize the meaning of    the EOF
  866.     character.  For    programs which gobble input characters,    the [C],
  867.     [U], or    [W] options should probably help.  It is up to you to
  868.     determine which    option(s) will work for    a particular program.
  869.     Only trial and error will tell.
  870.  
  871.     Generally, you should first try    the [C]    option,    as this    usually
  872.     works for a majority of    the programs we    have tried to redirect.
  873.     Others are more    stubborn and may require the [U] or [W]    option.
  874.     You should first try these options with    a wait constant    from 1-10,
  875.     then 10    and up.    You could go as    high as    65535 if you so    desire,
  876.     but even if this number    worked,    the program would execute so
  877.     slowly that it probably    wouldn't be worth the wait.
  878.  
  879.     If none    of these options work, then the    program    you are    trying to
  880.     redirect probably uses some obscure way    of reading its input.  We
  881.     have come across few such unredirectable programs.  Some of the
  882.     more extensive programs    generally give some problems, but there
  883.     are few    that can't be eliminated by using redirection options.
  884.     For the    most part, input redirection works, and    represents a
  885.     valuable part of the enhancements ConIX    provides for your system.
  886.  
  887.  
  888.     7.1.4  Special Character Substitute
  889.  
  890.     When redirecting input with the    [I] option set,    ConIX will
  891.     interpret special characters encountered in the    redirection stream
  892.     as indicating certain functions.  These    characters are outlined    in
  893.     the following sections.
  894.  
  895.  
  896.     7.1.4.1     Control Characters
  897.  
  898.     If ConIX encounters a circumflex in the    input stream, it will be
  899.     interpreted as the lead-in to a    control    sequence.  The character
  900.     that follows it    will then be converted to its control equivalent.
  901.     For example, the line:
  902.  
  903.         The terminal will now beep: ^g
  904.  
  905.     when printed through input redirection,    will cause the `^' and `g'
  906.     characters to be replaced by their control equivalent, CTRL-G,
  907.     thus causing the terminal to beep.
  908.  
  909.     This feature is    especially useful when working with text editors
  910.     that do    not allow control characters to    be entered into    the file.
  911.     When such characters are desired, ConIX    can be used as a filter    to
  912.     replace    the two-character control descriptor with the actual
  913.     desired    character.
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.                        7-10
  921.  
  922.  
  923.  
  924.  
  925.  
  926.     ConIX Operating    System                       Redirection
  927.  
  928.     7.1.4.2     Non-interpret
  929.  
  930.     If you do not wish ConIX to interpret a    character as being
  931.     special, then precede it with a    backslash.  For    example, the line:
  932.  
  933.         A CTRL-G (^g) will cause the terminal to beep.
  934.  
  935.     when printed through input redirection with the    [I] option set,
  936.     would cause the    `^g' to    be interpreted as a control sequence.  If
  937.     desired, this interpreting can be defeated by precededing the
  938.     circumflex with    a backslash, as:
  939.  
  940.         A CTRL-G (\^G) will cause the terminal to beep.
  941.  
  942.     which would prevent the    circumflex from    being interpreted as
  943.     starting a control sequence.  If a backslash itself must be
  944.     entered, double    it as:
  945.  
  946.         Place a    backslash (`\\') before    the circumflex.
  947.  
  948.     which would cause one backslash    to be placed within the
  949.     parenthesis after being    passed through the input stream.
  950.  
  951.  
  952.     7.1.5  Function    Key Substitute
  953.  
  954.     A major    innovation which has been added    to input redirection is
  955.     the ability to access the ConIX    letter variables ($a-$z    and $A-$Z)
  956.     from the redirection stream.  The actual contents of a referenced
  957.     variable can be    substituted directly into the input stream.  To
  958.     reference a variable, simply use a two character code, as:
  959.  
  960.         <lead-in><variable>
  961.  
  962.     The lead-in is a single    character which    indicates the start of a
  963.     variable reference.  The <variable> code is a letter corresponding
  964.     to the variable    you want to access (a-z, A-Z).    The value of the
  965.     lead-in    is undefined on    startup    but it may be set by using the OPT
  966.     +/-FK internal command.
  967.  
  968.     As an example, assuming    lead-in    to be CTRL-F, you may have a file
  969.     INFILE.TXT which contains the line:
  970.  
  971.         This is    the contents of    variable $A: <CTRL-F>a
  972.  
  973.     If you typed the following command, you'd get:
  974.  
  975.         <A:00> type <[f] infile.txt
  976.         This is    the contents of    variable $A: hello there
  977.         <A:00>
  978.  
  979.     where the two-character    sequence `<CTRL-F>A' was changed to the
  980.     actual contents    of the variable    $A, namely, ``hello there''.
  981.     Notice that the    [F] option was used since function keys, by
  982.     default, are not enabled in the    redirection stream.  (However,
  983.  
  984.  
  985.  
  986.                        7-11
  987.  
  988.  
  989.  
  990.  
  991.  
  992.     Redirection                    ConIX Operating System
  993.  
  994.     they are enabled when commands are running unredirected.)
  995.  
  996.     Similarly, the ConIX Programmable Character Keys may be    accessed
  997.     from the input stream, with the    sequence being changed to the
  998.     single character contained in the referenced key.  To access a
  999.     defined    key, enter a two-character code, as above, namely:
  1000.  
  1001.         <lead-in><key>
  1002.  
  1003.     where lead-in is a single character which indicates the    start of a
  1004.     Character Key reference, and key refers    to the character value set
  1005.     to be produced by that key.  The value of the lead-in is undefined
  1006.     on startup, but    can be set by using OPT    +/-FC command.    Refer to
  1007.     the chapter on OPT for complete    details.
  1008.  
  1009.  
  1010.     7.1.6  Input Redirection from a    Device
  1011.  
  1012.     Input redirection, thus    far, has only been explained in    terms of a
  1013.     file.  However,    input may also be redirected from special devices
  1014.     as well.  The syntax of    this form of redirection is:
  1015.  
  1016.         <A:00> cmd (arg(s)) <([option(s)]) :device
  1017.  
  1018.     This is    exactly    the same as input redirection using a file, except
  1019.     that the filename, infile, is replaced with a device name.
  1020.     Available input    devices    are given in the sections that follow.
  1021.  
  1022.     NOTE: unlike file names, devices may not be specified in double
  1023.     quotes.     Specifying a device in    quotes as:
  1024.  
  1025.         <A:00> getl < ":KBD"
  1026.  
  1027.     causes ConIX to    search for the file ``KBD.'' in    the disk search
  1028.     path.  This is because the `:' indicates an Automatic File Search
  1029.     request    when used in quotes.  When not in quotes, it indicates a
  1030.     device name.  Thus:
  1031.  
  1032.         <A:00> getl < ":FOO.ASM"
  1033.  
  1034.     is the way you can specify a file search when using input
  1035.     redirection.  If you leave out the quotes, ConIX will interpret
  1036.     FOO.ASM    as being a device, and will print an error since there is
  1037.     no such    device.     This restriction exists only on input redirection
  1038.     in order to prevent a conflict between device and file search
  1039.     specifications.
  1040.  
  1041.  
  1042.     7.1.6.1     :KBD Raw Console Keyboard
  1043.  
  1044.     This is    the raw    console    input device, namely, the keyboard.  It
  1045.     differs    from the :TTY device (below) in    that no    print spooling
  1046.     will take place    while input is being read from this device.
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.                        7-12
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.     ConIX Operating    System                       Redirection
  1059.  
  1060.     7.1.6.2     :NUL Null Device
  1061.  
  1062.     This is    the NULL or non-existent ``dummy'' system device which
  1063.     always returns EOF when    read.
  1064.  
  1065.  
  1066.     7.1.6.3     :RDR Reader
  1067.  
  1068.     This is    the system Reader device.  Although you    probably won't
  1069.     have a paper tape reading machine attached to it, the name is
  1070.     maintained for consistency with    existing CP/M devices.
  1071.  
  1072.  
  1073.     7.1.6.4     :TTY Console Keyboard
  1074.  
  1075.     The :TTY device    refers to the standard console keyboard.  It is
  1076.     important to note here that when a program runs    unredirected, it
  1077.     reads its input    from this device, with certain options set.
  1078.     Therefore, when    you type a command, such as DIR, it is executed
  1079.     internally as:
  1080.  
  1081.         <A:00> dir <[e,f,x=0] :tty
  1082.  
  1083.     The [E]    option is used so that hitting a CTRL-Z    at the keyboard
  1084.     will not be interpreted    as an EOF, thereby closing the input
  1085.     stream.     The [F] option    is used    to enable function key interpret,
  1086.     and [X=0] is included to expand    syscall    1 input    (which is a
  1087.     standard function of CP/M).
  1088.  
  1089.     The :TTY device    would be used if you wanted to change the
  1090.     redirection options that are in    effect when your program is
  1091.     reading    from the keyboard.  For    example, let's say you had a text
  1092.     editor which required the [W=1]    option in addition to the standard
  1093.     defaults, you would type:
  1094.  
  1095.         <A:00> edit foo.asm <[+w=1] :tty
  1096.  
  1097.     The ``TTY'' is needed for the input specification that is required
  1098.     when using redirection.
  1099.  
  1100.     Note that, as you may already suspect, there is    also a default
  1101.     setting    for the    console    output stream, which is    described later    in
  1102.     the section on Output Redirection.
  1103.  
  1104.  
  1105.     7.1.6.5     :UDI User Defined Device
  1106.  
  1107.     This is    a special user-definable input device.    ConIX uses
  1108.     physical port addresses    and status check-bits to read characters
  1109.     from this device.  It is set by    using the OPT +/-IP command,
  1110.     described later    in the commands    section.  This device returns EOF
  1111.     if it had not been previously defined by OPT.
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.                        7-13
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.     Redirection                    ConIX Operating System
  1125.  
  1126.     7.1.6.6     :UIA User Defined Address
  1127.  
  1128.     This device references an address at which a user-defined input
  1129.     routine    is stored in memory.  The OPT +/-IA command is used to set
  1130.     this address.  By default, this    device returns EOF if the address
  1131.     had not    been previously    defined.
  1132.  
  1133.  
  1134.     7.1.7  Redirection From    Memory
  1135.  
  1136.     One of the greatest innovations    offered    by ConIX is the    freedom
  1137.     the user has over the use of memory (see the section on    ConIX and
  1138.     Memory).  This flexibility has been applied to input redirection,
  1139.     allowing a program to read its input directly from system memory.
  1140.     The syntax of this form    of redirection is:
  1141.  
  1142.         <A:00> cmd (arg(s)) <([option(s)]) @(&start)(-&end)
  1143.  
  1144.     The `@'    sign tells ConIX that the command will be reading its
  1145.     input from memory.  The    optional starting address, start, gives
  1146.     the location in    memory at which    the first character is stored.
  1147.     The optional ending address, end, gives    the location in    memory at
  1148.     which to set the `physical end of file'.  This address puts a
  1149.     ceiling    on the memory file, just as available disk space puts a
  1150.     ceiling    on the length of a disk    file.  The actual EOF is indicated
  1151.     by the byte FF hex stored after    the last character to be sent
  1152.     through    the input stream, and may occur    before the specified
  1153.     ending address.
  1154.  
  1155.     For example, the command line:
  1156.  
  1157.         <A:00> getl < @3000-347f
  1158.  
  1159.     sets the command GETL to read its input    line from memory starting
  1160.     at location 3000 hex until location 347F hex.  It may actually
  1161.     read less than the amount of memory allocated if there is a Memory
  1162.     EOF (FF    hex) byte stored within    the specified address boundaries.
  1163.     In any case, EOF will always occur at the ending address.
  1164.  
  1165.     If the end address is omitted, a default length    of 128 bytes is
  1166.     assumed, effectively setting the end address to    start +    128.  For
  1167.     example, the command line:
  1168.  
  1169.         <A:00> getl < @3000
  1170.  
  1171.     is equivalent to:
  1172.  
  1173.         <A:00> getl < @3000-307F
  1174.  
  1175.     If both    the start and end addresses are    omitted, input is taken
  1176.     from the default internal memory buffer, as in:
  1177.  
  1178.         <A:00> getl < @
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.                        7-14
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.     ConIX Operating    System                       Redirection
  1191.  
  1192.     which sets the GETL command to read its    input from a memory buffer
  1193.     internal to ConIX which    is 128 bytes in    length.     Data may be
  1194.     stored in this buffer, or anywhere in memory, by using Output
  1195.     Redirection, described later.
  1196.  
  1197.  
  1198.     7.1.8  Some Input Redirection Examples
  1199.  
  1200.     Some useful examples of    commands using input redirection are
  1201.     presented here for your    edification:
  1202.  
  1203.     Simplest Form:
  1204.  
  1205.         <A:00> type < file.txt
  1206.  
  1207.     where the TYPE command reads its input from FILE.TXT.
  1208.  
  1209.     Using an Option:
  1210.  
  1211.         <A:00> basic <[c] file.bas
  1212.  
  1213.     where BASIC reads its input from FILE.BAS with all console-status
  1214.     syscalls returning ``not-ready''.  The input file may contain
  1215.     operating instructions such as:
  1216.  
  1217.        10 REM This program will compute the    sum (sigma)
  1218.        20 REM of all the numbers in    a range.
  1219.        30 print
  1220.        40 print "Please enter two numbers:";
  1221.        50 input s,e
  1222.        60 x=0
  1223.        70 for i=s to e
  1224.        80 x=x+i
  1225.        90 next i
  1226.        100 print "The sum of the numbers from";s;"to";e;"is";x
  1227.        110 end
  1228.        run
  1229.        10,30
  1230.        run
  1231.        1,3
  1232.        system
  1233.  
  1234.     which is actually an automated procedure that drives BASIC, and
  1235.     includes the program, instructions to run it, and the input data
  1236.     to be used.  As    another    example, take:
  1237.  
  1238.         <A:00> type <[s=3] file.bas
  1239.         40 print "Please enter two numbers:";
  1240.         . . .
  1241.         <A:00>
  1242.  
  1243.     where TYPE reads FILE.BAS, skipping the    first three lines, and
  1244.     starting with the fourth through the end of file.
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.                        7-15
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.     Redirection                    ConIX Operating System
  1257.  
  1258.     Using Multiple Options:
  1259.  
  1260.         <A:00> basic <[l,c,t] prog.bas
  1261.  
  1262.     where BASIC takes its input from PROG.BAS, stripping off Line
  1263.     Feeds and executing with console status    disabled.  After EOF is
  1264.     reached    in FILE.BAS, input will    continue to be read from the
  1265.     console    keyboard.  As another example:
  1266.  
  1267.         <A:00> type <[s=3,n=8c]    FILE.BAS
  1268.         40 print
  1269.         <A:00>
  1270.  
  1271.     where TYPE reads only eight characters of FILE.BAS, after skipping
  1272.     the first three    lines.
  1273.  
  1274.  
  1275.     7.1.9  Type-Ahead Buffering
  1276.  
  1277.     ConIX contains a special buffer    which is used to store characters
  1278.     entered    at the keyboard    while a    program    is running.  These
  1279.     characters are held in the buffer until    input is requested by a
  1280.     running    program    or ConIX when waiting at the prompt level.
  1281.     Characters usually enter the buffer when input is being    polled for
  1282.     a CTRL-S, as with Disk Wait Control and    during output to the
  1283.     console.  Any character    not recognized internally as performing    a
  1284.     predetermined special function relating    to ConIX, will be placed
  1285.     into this buffer for further processing.
  1286.  
  1287.     The type-ahead buffer is set to    hold up    to 80 characters.
  1288.     Entering more than this    amount of characters will cause    the
  1289.     console    bell to    sound every time a key is depressed.  The buffer
  1290.     may be cleared and re-started at any time by typing a special
  1291.     buffer-flush character.     This is set to    CTRL-_
  1292.     (control+underscore) by    default, and may be changed by the OPT
  1293.     +/-TC internal command.     Entering this character performs a cancel
  1294.     operation equivalent to    the CTRL-U at the prompt level.
  1295.  
  1296.     The ConIX type-ahead buffer does not interfere with buffering that
  1297.     is built into some computers.  In fact,    it can even provide type-
  1298.     ahead for systems which    do not support it internally.  This is
  1299.     because    CP/M does not save characters after they are typed at the
  1300.     console.  Entering more    than one character overwrites the previous
  1301.     one until console input    is requested.
  1302.  
  1303.     Some programs have the habit of    removing a character waiting at
  1304.     the keyboard after they    execute.  This problem may be eliminated
  1305.     by executing such programs with    one of the input redirection
  1306.     options    that delay console status requests.  Therefore,    those
  1307.     programs that do a quick, last minute check for    a waiting
  1308.     character will not see one, and    the type-ahead buffer will remain
  1309.     untouched.
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.                        7-16
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.     ConIX Operating    System                       Redirection
  1323.  
  1324.     7.2  Console Output File Redirection
  1325.  
  1326.     The redirection    of program output to a file instead of the console
  1327.     screen is called Console Output    File Redirection.  The syntax of
  1328.     this form of redirection is:
  1329.  
  1330.         <A:00> cmd (arg(s)) >(>)(+)([option(s)]) outfile
  1331.  
  1332.     where cmd represents the command whose output is to be redirected
  1333.     to the disk file outfile.  If only one `>' is given, the output
  1334.     file is    created    if it does not already exist.  If it does exist,
  1335.     it is first deleted and    then re-created, thereby starting with an
  1336.     empty file.  If    a second `>' is    specified, the output is appended
  1337.     to the named file if it    exists,    and will be created if it does
  1338.     not.  If a `+' is included after the last '>', output will go to
  1339.     the screen as well as to the file.  The    [options] represent
  1340.     certain    optional features which    the user may specify (see below)
  1341.     to modify certain operational defaults.     The `+' and left bracket
  1342.     of the options list must be placed immediately after the `>',
  1343.     without    any intermediate white-space.
  1344.  
  1345.     For example, the command GETL which reads a line of input from the
  1346.     keyboard and retypes it    to the screen can be used as:
  1347.  
  1348.         <A:00> getl > user.inp
  1349.         this is    the first line you typed
  1350.         <A:00>
  1351.  
  1352.     which gets a line of input from    the keyboard and saves it in the
  1353.     file, USER.INP.     Any spaces or tabs around the `>' are optional.
  1354.     If, in addition, you were to type:
  1355.  
  1356.         <A:00> getl >> user.inp
  1357.         this is    the second line    you typed
  1358.         <A:00>
  1359.  
  1360.     the output of the second GETL would be appended    to the file
  1361.     USER.INP.  Examining this file would show:
  1362.  
  1363.         <A:00> type user.inp
  1364.         this is    the first line you typed
  1365.         this is    the second line    you typed
  1366.         <A:00>
  1367.  
  1368.     which is the combined output from the two separate invocations of
  1369.     the GETL command.
  1370.  
  1371.  
  1372.     7.2.1  Output Redirection Options
  1373.  
  1374.     There are certain options that may be specified    to output
  1375.     redirection which can affect the characters passing through the
  1376.     output stream.    If you specify such options, you must include the
  1377.     square brackets, `[]', around them, and    separate multiple options
  1378.     by a comma.  Intermediate spaces or tabs are not permitted.  The
  1379.  
  1380.  
  1381.  
  1382.                        7-17
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.     Redirection                    ConIX Operating System
  1389.  
  1390.     following sections contain descriptions    of the available output
  1391.     redirection options.
  1392.  
  1393.  
  1394.     7.2.1.1     [A] Auto Line Feed
  1395.  
  1396.         <A:00> cmd >[a]    outspec
  1397.  
  1398.     When the [A] option is specified, ConIX    will automatically insert
  1399.     a line feed (LF) after every carriage return (CR) encountered in
  1400.     the output stream of the executing command.
  1401.  
  1402.  
  1403.     7.2.1.2     [B] Boot After    End of Output
  1404.  
  1405.         <A:00> cmd >[b]    outspec
  1406.  
  1407.     The [B]    option will cause a warm boot (JMP 0000) to be generated
  1408.     after the end of output    is reached, a condition    which can only
  1409.     occur after the    number of lines/bytes specified    by the [N] option
  1410.     have been output, or when there    is no more space available to
  1411.     store the output in a memory file.  If this option is not used,
  1412.     program    execution will continue    even though any    additional output
  1413.     would be discarded.
  1414.  
  1415.  
  1416.     7.2.1.3     [D] Append to Binary Data File
  1417.  
  1418.         <A:00> cmd >[d]    outfile
  1419.  
  1420.     When using redirection to append output    to an existing file, ConIX
  1421.     must first find    the end    of the file by searching for the
  1422.     EOF (CTRL-Z) character.     Since binary files usually contain this
  1423.     character within them, output would be appended    too early, thereby
  1424.     overwriting part of the    original file.
  1425.  
  1426.     The [D]    option is used to prevent this from happening when
  1427.     appending data to a binary file.  Instead of searching for the
  1428.     EOF, ConIX will    append output after the    last physical record
  1429.     previously written to the specified data file.
  1430.  
  1431.  
  1432.     7.2.1.4     [E] Disable EOF Termination
  1433.  
  1434.         <A:00> cmd >[e]    outfile
  1435.  
  1436.     ConIX normally places a    CP/M EOF character (CTRL-Z) after the last
  1437.     byte written to    a disk output file.  This is the default, since
  1438.     most output data is printable text and should contain this
  1439.     character to indicate its true end.  If    the data being redirected
  1440.     out is binary or object    code bytes, this extra character may be
  1441.     removed    by specifying the [E] option.
  1442.  
  1443.     Note that a CTRL-Z placed at the end of    a .COM file will cause no
  1444.     harm to    the operation of the program.  It may, however,    enlarge
  1445.  
  1446.  
  1447.  
  1448.                        7-18
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.     ConIX Operating    System                       Redirection
  1455.  
  1456.     the file by passing a minimum size boundary, in    which case EOF
  1457.     termination may    be defeated by using this option.
  1458.  
  1459.  
  1460.     7.2.1.5     [G] Remove Glitch Characters
  1461.  
  1462.         <A:00> cmd >[g]    outspec
  1463.  
  1464.     Program    output may sometimes contain certain undesirable
  1465.     characters in the control range    of 00 hex to 1F    hex.  If the [G]
  1466.     option is specified, all such ``glitch'' characters will be
  1467.     discarded from the output stream.
  1468.  
  1469.  
  1470.     7.2.1.6     [H] Strip Hi-Bit
  1471.  
  1472.         <A:00> cmd >[h]    outspec
  1473.  
  1474.     This option is used to zero the    hi-bit of all characters passing
  1475.     through    the output stream.  This is most useful    for filtering
  1476.     program    output that sets the 8th bit of    some characters, as this
  1477.     may cause undesirable effects when read    by other programs.
  1478.  
  1479.  
  1480.     7.2.1.7     [I] Set Invisible Attribute
  1481.  
  1482.         <A:00> cmd >[i]    outspec
  1483.  
  1484.     When the [I] option is supplied, the output file will be created
  1485.     with the invisible (SYS) attribute set.     This means that the file
  1486.     will not be printed in regular directory listings, although it
  1487.     will actually be there.     This may be useful for    certain
  1488.     `transparent' operations where the user    need not see certain files
  1489.     when manipulating the directory.  See the DIR internal command in
  1490.     the commands section for a description of this feature.
  1491.  
  1492.  
  1493.     7.2.1.8     [L] Remove Extra Line Feeds
  1494.  
  1495.         <A:00> cmd >[l]    outspec
  1496.  
  1497.     Using the [L] option will cause    any Line Feed characters not
  1498.     preceded by a Carriage Return to be discarded from  the    output
  1499.     stream.     Thus a    CR+LF+LF sequence will be changed to a CR+LF,
  1500.     since there was    no CR before the last LF.
  1501.  
  1502.  
  1503.     7.2.1.9     [N] Count Lines/Characters
  1504.  
  1505.         <A:00> cmd >[n=#count(c)] outspec
  1506.  
  1507.     The [N]    option will cause the output stream to be closed after a
  1508.     specified number of lines/characters have been output.    Characters
  1509.     will be    counted    if the letter `c' is placed after the decimal
  1510.     count number.  Otherwise, if `c' is omitted, lines will    be
  1511.  
  1512.  
  1513.  
  1514.                        7-19
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.     Redirection                    ConIX Operating System
  1521.  
  1522.     counted.  (The end of a    line is    determined by the Line feed (LF)
  1523.     character.)  Any characters output by the running program after
  1524.     the output stream is closed will be discarded.
  1525.  
  1526.     NOTE: The number of lines may be as large as 65535, decimal.  A
  1527.     value of zero will cause no characters to be output.
  1528.  
  1529.  
  1530.     7.2.1.10  [O] Turn Off Character
  1531.  
  1532.         <A:00> cmd >[o=&byte] outspec
  1533.  
  1534.     The [O]    option is used to turn off, or remove from the output
  1535.     stream any character which matches the specified hex byte code.
  1536.     Legal character    codes range from 00 to FE, hex.
  1537.  
  1538.  
  1539.     7.2.1.11  [P] Print Output Characters
  1540.  
  1541.         <A:00> cmd >[p]    outspec
  1542.  
  1543.     When this option is supplied, any characters passing through the
  1544.     output stream will also    be sent    to the printer (LST) device.
  1545.  
  1546.  
  1547.     7.2.1.12  [S] Skip Lines/Characters
  1548.  
  1549.         <A:00> cmd >[s=#count(c)] outspec
  1550.  
  1551.     The [S]    option is used to remove the first lines/characters that
  1552.     pass from the running program through the output stream.
  1553.     Individual characters will be removed if the decimal number count
  1554.     is followed by the letter `c'.    Otherwise, if `c' is not supplied,
  1555.     [S] will default to removing lines, where a line is defined as
  1556.     ending with an LF character.  Output will begin    after the
  1557.     specified number of lines/characters have been counted off.
  1558.  
  1559.     NOTE: The number of lines may be as large as 65535, decimal.  A
  1560.     count value of zero will produce no action.
  1561.  
  1562.  
  1563.     7.2.1.13  [T] Terminate    File with CR/LF
  1564.  
  1565.         <A:00> cmd >[t]    outfile
  1566.  
  1567.     Using this option assures that the output stream will always
  1568.     terminate in a CR/LF sequence.    This is    useful for some    programs
  1569.     which leave the    last line of their output unterminated,    since they
  1570.     expect the operating system to output a    CR/LF before the prompt    is
  1571.     printed.  If the output    stream from the    program    already    ended in a
  1572.     CR/LF, no extra    CR/LF will be added.
  1573.  
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.                        7-20
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.     ConIX Operating    System                       Redirection
  1587.  
  1588.     7.2.1.14  [X] Expand Tabs to Spaces
  1589.  
  1590.         <A:00> cmd >[x]    outspec
  1591.  
  1592.     For storage efficiency,    most text editors convert multiple spaces
  1593.     to tabs    when the file is written to disk.  In some cases, it may
  1594.     be necessary to    convert    them back to spaces, especially    if the
  1595.     receiving device or program does not recognize tabs.  The [X]
  1596.     option will cause this conversion to be    done automatically.  Tab
  1597.     stops are fixed    at multiples of    eight columns.
  1598.  
  1599.  
  1600.     7.2.2  Output Redirection to a Device
  1601.  
  1602.     Until now, we've been discussing output    redirection in terms of
  1603.     disk files.  You can also use a    device in the same way as a file
  1604.     and redirect program output to it, as:
  1605.  
  1606.         <A:00> cmd (arg(s)) >(+)([option(s)]) :device
  1607.  
  1608.     Available output devices are described in the following    sections.
  1609.  
  1610.  
  1611.     7.2.2.1     :CON Console Screen
  1612.  
  1613.     The :CON device    references the system console screen.  It is
  1614.     important to note here that when a program runs    unredirected,
  1615.     output is normally sent    to this    device with the    [X] option set.
  1616.     Therefore, when    you type a command, such as DIR, it is executed
  1617.     internally as:
  1618.  
  1619.         <A:00> dir >[x]    :con
  1620.  
  1621.     This option is needed just in case the console device does not
  1622.     know how to interpret tab characters.  With the    [X] option, tab
  1623.     characters are changed to a series of spaces.
  1624.  
  1625.     The :CON device    would be used if you wanted to change the options
  1626.     in effect when a program is writing to the screen.  For    example,
  1627.     let's say you wanted to    examine    the first 50 lines of a    long file.
  1628.     You would type:
  1629.  
  1630.         <A:00> type file.c >[x,n=50] :con
  1631.  
  1632.     The `:CON' is needed for the output specification that is required
  1633.     when using redirection.     If your console terminal/computer handles
  1634.     tabs in    hardware, [X] may be excluded.
  1635.  
  1636.     Character output to the    :CON device may    be paused by hitting the
  1637.     CTRL-S key.  Once paused, you may hit a    CTRL-C,    and the    program
  1638.     which is executing will    be aborted.  Hitting any other key allows
  1639.     the output to continue.     Also, while output is being sent to the
  1640.     screen,    you may    toggle printer transcript mode on/off by hitting
  1641.     the CTRL-P key.
  1642.  
  1643.  
  1644.  
  1645.  
  1646.                        7-21
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.     Redirection                    ConIX Operating System
  1653.  
  1654.     7.2.2.2     :CRT Raw Console Screen
  1655.  
  1656.     The :CRT device    is used    to output characters to    the console screen
  1657.     in `raw' mode, meaning that there will be no CTRL-S control as
  1658.     with :CON output.  It may be necessary to use the :CRT device with
  1659.     programs that use the CTRL-S and/or CTRL-P keys    for their own
  1660.     purposes.  If you were to hit either of    these keys while a program
  1661.     is outputting to the :CON device, they may be intercepted by ConIX
  1662.     and not    sent to    the program.
  1663.  
  1664.  
  1665.     7.2.2.3     :LST System Printer
  1666.  
  1667.     The :LST device    references the system printer.    Output to this
  1668.     device will be spooled if the Print Spooling feature is    enabled.
  1669.     Otherwise, characters will be sent immediately to the printer.
  1670.  
  1671.  
  1672.     7.2.2.4     :NUL Null Device
  1673.  
  1674.     This is    the NULL or non-existent ``dummy'' system device, which
  1675.     discards all characters    sent to    it.  It's a convenient place to
  1676.     dump unwanted output.
  1677.  
  1678.  
  1679.     7.2.2.5     :PUN Punch Device
  1680.  
  1681.     This is    the system Punch device.  Although you probably    won't have
  1682.     a paper    tape punch attached to it, the name is maintained for
  1683.     consistency with existing CP/M devices.
  1684.  
  1685.  
  1686.     7.2.2.6     :UDO User Defined Device
  1687.  
  1688.     This is    a special user-definable output    device.     ConIX uses system
  1689.     I/O port addresses to write characters to this device.    It is set
  1690.     by using the OPT +/-OP command,    described in the commands section.
  1691.     By default, this device    acts as    a :NUL if referenced without being
  1692.     previously defined, namely discarding any output sent to it.
  1693.  
  1694.  
  1695.     7.2.2.7     :UOA User Defined Address
  1696.  
  1697.     The :UOA device    references an address, set by the OPT +/-OA
  1698.     command, at which a user-defined output    routine    is stored in
  1699.     memory.     By default, output to this device is discarded    if
  1700.     referenced without being previously defined.
  1701.  
  1702.  
  1703.     7.2.3  Output Redirection to Memory
  1704.  
  1705.     ConIX applies the concept of a `Memory File' to    output redirection
  1706.     by allowing a program to output    directly to system memory.  The
  1707.     syntax of this form of redirection is:
  1708.  
  1709.  
  1710.  
  1711.  
  1712.                        7-22
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.     ConIX Operating    System                       Redirection
  1719.  
  1720.         <A:00> cmd (args) >(>)(+)([options]) @(&start)(-&end)
  1721.  
  1722.     As you can see,    the format is equivalent to that of output file
  1723.     redirection, except that the filename has been replaced    by a
  1724.     memory specification.  The `@' sign tells ConIX    that the specified
  1725.     command    will be    sending    its output to memory.  The optional
  1726.     starting address, start, gives the location in memory at which to
  1727.     store the first    character.  The    optional ending    address, end,
  1728.     gives the location in memory after which no more characters may    be
  1729.     stored.     This address puts a ceiling on    the memory file, as the
  1730.     length of a disk file is limited by available disk space.  For
  1731.     example, the command line:
  1732.  
  1733.         <A:00> dir > @3000-347f
  1734.  
  1735.     sets the DIR command to    send its output    into memory starting at
  1736.     location 3000 hex until    location 347F hex.  The    memory buffer may
  1737.     actually be larger than    the number of bytes needed to store the
  1738.     output.     In this case, the last    character will be terminated by
  1739.     the `Memory EOF' byte, which is    an FF hex.  This byte must always
  1740.     appear in the buffer, thereby subtracting one byte from    the amount
  1741.     of space available to store characters.     If the    buffer is too
  1742.     small, excess characters will be discarded, although program
  1743.     execution will continue.
  1744.  
  1745.     If the end address is omitted, a default buffer    size of    128 bytes
  1746.     is assumed, effectively    setting    the end    address    to start + 128.
  1747.     For example, the command line:
  1748.  
  1749.         <A:00> dir > @3000
  1750.  
  1751.     is exactly equivalent to:
  1752.  
  1753.         <A:00> dir > @3000-307f
  1754.  
  1755.     which allows for storage of up to 127 characters.
  1756.  
  1757.     If both    the start and end addresses are    omitted, output    will be
  1758.     sent to    the default internal 128-byte memory buffer.
  1759.  
  1760.  
  1761.     7.2.4  Some Output Redirection Examples
  1762.  
  1763.     Here are some additional examples of redirected    program    output
  1764.     that are intended for your edification:
  1765.  
  1766.     Simplest Form:
  1767.  
  1768.         <A:00> type file.old > file.new
  1769.  
  1770.     where the TYPE command will read FILE.OLD and send its output to
  1771.     FILE.NEW.  This    is effectively a simple    file-to-file copying
  1772.     program.  Similarly:
  1773.  
  1774.         <A:00> type file.old >+    file.new
  1775.  
  1776.  
  1777.  
  1778.                        7-23
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.     Redirection                    ConIX Operating System
  1785.  
  1786.     is same    as above, except that the output of TYPE will be sent to
  1787.     the screen as well to the given    file.  Furthermore:
  1788.  
  1789.         <A:00> type file.old >>+ file.new
  1790.  
  1791.     is a variation of the above, where FILE.OLD is appended    to
  1792.     FILE.NEW, if the latter    exists.     Otherwise, the    file will be
  1793.     created, with the output placed    at the beginning.
  1794.  
  1795.     Using an Option:
  1796.  
  1797.         <A:00> type file.mem >[g] file.prt
  1798.  
  1799.     where the output of TYPE will be redirected to FILE.PRT    with any
  1800.     control    (``glitch'') characters    discarded.  Similarly,
  1801.  
  1802.         <A:00> type file.mem >>+[g] file.prt
  1803.  
  1804.     output will be appended    to FILE.PRT and    simultaneously sent to the
  1805.     console    screen.
  1806.  
  1807.     Using Multiple Options:
  1808.  
  1809.         <A:00> type file.dat >>[s=2,n=10] file.cmb
  1810.  
  1811.     where lines 3 through 12 of FILE.DAT are appended to FILE.CMB (the
  1812.     first two lines    of output were skipped and then    up to ten lines
  1813.     were sent through).
  1814.  
  1815.  
  1816.     7.2.5  Auto Screen Paging
  1817.  
  1818.     We mentioned in    a previous section that    output to the :CON device
  1819.     may be paused by hitting the CTRL-S key.  There    is a much more
  1820.     sophisticated method of    pausing    output,    called Auto Screen Paging,
  1821.     which is available for use with    characters sent    to the standard
  1822.     :CON device.  This feature is enabled by using the OPT +/-SL
  1823.     internal command, as:
  1824.  
  1825.         <A:00> opt +sl <#length>
  1826.  
  1827.     where length is    the maximum number of lines (in    decimal) that your
  1828.     console    screen can display at one time.     Setting the screen length
  1829.     enables    Screen Paging, whereby program output will automatically
  1830.     pause after a screenful    has been printed.  At this point, the
  1831.     system will wait for you to finish reading the contents    of the
  1832.     screen before proceeding.
  1833.  
  1834.     When you are ready to receive the next screenful, hit <RETURN>.
  1835.     If you want the    screen to advance by just one more line, hit any
  1836.     letter or number on the    keyboard.  Otherwise, if you do    not want
  1837.     the output to pause again, simply hit the <SPACEBAR>, which will
  1838.     disable    screen paging for the currently    executing command.
  1839.     Subsequent commands will still run with    this feature enabled.
  1840.  
  1841.  
  1842.  
  1843.  
  1844.                        7-24
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.     ConIX Operating    System                       Redirection
  1851.  
  1852.     To determine when the screen has filled, ConIX internally counts
  1853.     the number of Line Feed    characters output by the executing
  1854.     program, and when equal    to the screen length, output is    paused.
  1855.     In addition, if    a Form Feed (CTRL-L) character is output, the
  1856.     screen will automatically be paused to prevent it from clearing,
  1857.     which might have caused    you to miss any    characters previously
  1858.     output.
  1859.  
  1860.     The default screen length, as set by OPT +/-SL,    can be changed for
  1861.     the execution of a single command by the [S] command line option,
  1862.     as:
  1863.  
  1864.         <A:00> [s=<#length>] <command> (arg(s))
  1865.  
  1866.     where length is    the maximum number of lines that should    be
  1867.     displayed before the screen is paused.    This setting overrides the
  1868.     current    default    during the execution of    the given command.
  1869.  
  1870.  
  1871.     7.3  Printer Output File Redirection
  1872.  
  1873.     The redirection    of a program's printer (LST) output to a file is
  1874.     called Printer Output File Redirection.     The syntax of this form
  1875.     of redirection is:
  1876.  
  1877.         <A:00> cmd (arg(s)) >#(+) prtfile
  1878.  
  1879.     where the printer output of cmd    is sent    to the disk file prtfile,
  1880.     which is created if it does not    already    exist.    If it does exist,
  1881.     it is first deleted and    then re-created.  If a `+' is specified,
  1882.     output will go to the printer as well as to the    file.  The `+'
  1883.     must be    typed immediately after    the `>#' without any intermediate
  1884.     white-space.
  1885.  
  1886.     Take, for example, a possible user-supplied command PRINT which
  1887.     prints the named file to the system printer with pagination.  Its
  1888.     printer    output can be redirected to a file as:
  1889.  
  1890.         <A:00> print file.txt ># file.pag
  1891.  
  1892.     where any characters which would have normally gone to the printer
  1893.     will instead go    into FILE.PAG.    Similarly, if you typed:
  1894.  
  1895.         <A:00> print file.txt >#+ file.pag
  1896.  
  1897.     printer    output will be sent to the system printer as well as to
  1898.     the designated output file.
  1899.  
  1900.  
  1901.     7.3.1  Printer Redirection Options
  1902.  
  1903.     There are no options available with printer output redirection as
  1904.     there are with console output redirection.  If such options are
  1905.     desired, you can use printer redirection to send the characters    to
  1906.     a file and then    use the    TYPE command to    read from that file using
  1907.  
  1908.  
  1909.  
  1910.                        7-25
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.     Redirection                    ConIX Operating System
  1917.  
  1918.     the desired redirection    options.
  1919.  
  1920.     For example, to    get only the first two pages (132 lines) from the
  1921.     printer    output stream of PRINT requires    two commands:
  1922.  
  1923.         <A:00> print file.txt ># file.tmp
  1924.         <A:00> type <[n=132] file.tmp >    file.prt
  1925.  
  1926.     The first command line sends the printer output    of PRINT to
  1927.     FILE.TMP.  The following command reads the first two pages from
  1928.     the intermediate file into the new FILE.PRT.  If desired, you can
  1929.     erase the temporary file with:
  1930.  
  1931.         <A:00> era file.tmp
  1932.  
  1933.     This may not be    very elegant, but it sure saves    a great    deal of
  1934.     extra coding within ConIX itself, and it most definitely works!
  1935.  
  1936.     Note that this entire process can be condensed into a single
  1937.     command    by redirecting printer output to the :CON device, as is
  1938.     explained in the following section.
  1939.  
  1940.  
  1941.     7.3.2  Printer Output Redirection to a Device
  1942.  
  1943.     You can    use a device as    you would a file when redirecting printer
  1944.     output.     The syntax of this form of redirection    is:
  1945.  
  1946.         <A:00> cmd (arg(s)) >#(+) :device
  1947.  
  1948.     Devices    available through output redirection (above) may also be
  1949.     used with printer redirection.    The only special consideration is
  1950.     with :CON, the standard    console    output device used with    regular
  1951.     output redirection.  Characters    sent to    this device will be caught
  1952.     by any output redirection invoked on the command.  For example,
  1953.     the command:
  1954.  
  1955.         <A:00> print file.txt ># :con >[n=132] file.prt
  1956.  
  1957.     will send printer output through the standard screen output to be
  1958.     processed by regular output redirection, which will then send the
  1959.     first 132 lines    of output to the file FILE.PRT.     With this
  1960.     capability, the    lack of    options    for printer redirection    does not
  1961.     become limiting.
  1962.  
  1963.  
  1964.     7.3.3  Printer Redirection To Memory
  1965.  
  1966.     ConIX applies the concept of a `Memory File' to    printer
  1967.     redirection by allowing    a program to route its :LST output
  1968.     directly to system memory.  The    syntax of this form of redirection
  1969.     is:
  1970.  
  1971.         <A:00> cmd (arg(s)) >#(+)@(&start)(-&end)
  1972.  
  1973.  
  1974.  
  1975.  
  1976.                        7-26
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.     ConIX Operating    System                       Redirection
  1983.  
  1984.     The '@'    sign tells ConIX that the given    command    will be    using a
  1985.     memory file.  The optional starting address, start, gives the
  1986.     location in memory at which to store the first character, and the
  1987.     optional ending    address, end, defines the end boundary of the
  1988.     buffer.     For example, the command line:
  1989.  
  1990.         <A:00> print file.txt ># @3000-347f
  1991.  
  1992.     sets the PRINT command to send its printer output to memory
  1993.     starting at location 3000 hex until location 347F hex.    If the
  1994.     memory buffer is larger    than needed, the last byte of output will
  1995.     be terminated by the `Memory EOF', an FF hex.  If the buffer is
  1996.     too small, excess characters will be discarded.
  1997.  
  1998.     If the end address is omitted, a default length    of 128 bytes will
  1999.     be assumed.  If    the start and end addresses are    omitted, the
  2000.     default    internal 128-byte buffer will be used.
  2001.  
  2002.  
  2003.     7.4  Print Spooling
  2004.  
  2005.     One of the slowest devices on your computer, by    far, is    the
  2006.     printer.  These    machines can typically print at    a rate of only 30
  2007.     to 120 characters per second, while a computer is capable of
  2008.     sending    characters at over 1000    cps.  Whenever a program outputs
  2009.     to the printer,    it spends a great deal of time in a loop, waiting
  2010.     for the    printer    to become ready    to receive another character.
  2011.     Even a small printout can sometimes take what seems to be an
  2012.     eternity to complete.
  2013.  
  2014.     The built-in ConIX Print Spooler allows    processing to continue
  2015.     while your printer is slowly outputting    characters.  This feature
  2016.     taps some hidden capability in your computer to    allow it to send
  2017.     characters to the printer while    still continuing to execute your
  2018.     program.  It's probably    the closest your standard CP/M system will
  2019.     ever come to multitasking.
  2020.  
  2021.     The print spooler uses a disk file to store the    output characters
  2022.     until your printer is ready to receive them.  The size and
  2023.     location of this file is determined by the OPT +PS command, as:
  2024.  
  2025.         <A:00> opt +ps <#length> (D:)(#/)
  2026.  
  2027.     where length is    the size of the    buffer file (CONIX.SPL)    in 128-
  2028.     byte records, which may    be followed by an optional disk    and user
  2029.     area to    specify    the directory (default A:0/) in    which the file is
  2030.     to be created.    Should the spool file become filled, the system
  2031.     will wait for it to empty enough to hold the remaining characters.
  2032.     The size of the    spool file is limited only to the amount of
  2033.     available disk space.
  2034.  
  2035.     Console    input is a significant point of    inefficiency in    your
  2036.     computer.  The system remains in a loop, constantly polling the
  2037.     keyboard for you to hit    a character.  Since the    computer is often
  2038.     requesting input, it was determined that this is the best time to
  2039.  
  2040.  
  2041.  
  2042.                        7-27
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.     Redirection                    ConIX Operating System
  2049.  
  2050.     check if the printer is    ready to receive the spool characters.
  2051.  
  2052.     In effect, whenever your system    is actually working, the printer
  2053.     will be    ignored    and full time will be devoted to the completion    of
  2054.     the executing command.    While your system is waiting for console
  2055.     input, the printer will    be serviced whenever it    becomes    ready.    If
  2056.     you do not type    any characters at this point, the spool    file will
  2057.     empty after a period of    time.
  2058.  
  2059.     When input is requested, hitting a character will cause    spooling
  2060.     to be delayed for a short period of time.  This    prevents input
  2061.     characters from    being lost if you type while the disk spooler file
  2062.     is being accessed.  This delay may be set at the time spooling is
  2063.     enabled.  See the OPT +PS internal command for details.
  2064.  
  2065.     NOTE:  This feature requires that the BIOS List    Status function    be
  2066.     operational as per the guidelines in the Digital Research
  2067.     Alteration Guide.  This    routine    must return the    current    status of
  2068.     the printer without ever waiting in a loop for the printer to
  2069.     become ready.
  2070.  
  2071.     The Print Spooling feature can be temporarily disabled by the [W]
  2072.     command    line option, as:
  2073.  
  2074.         <A:00> [w] <command> (arg(s))
  2075.  
  2076.     This option is used to suppress    spooling for the execution of the
  2077.     given command.    This is    useful if you don't want a particular
  2078.     command's output to be spooled while the print buffer is enabled.
  2079.     Specifying this    option will cause the current contents of the
  2080.     spooler    (if any) to be flushed to the printer, after which the
  2081.     command    will be    executed.  Once    completed, spooling will be
  2082.     reactivated as before.
  2083.  
  2084.  
  2085.     7.5  Multiple Redirections
  2086.  
  2087.     Yes, you can run Console Input,    Output and Printer Output
  2088.     Redirection on one command, so don't bother worrying about some
  2089.     limitation.  As    a really complex example, you can do:
  2090.  
  2091.         <A:00> basic <[l,c,t] file.bas >+[s=1] bas.out ># bas.prt
  2092.  
  2093.     which, in a nutshell, would set    the BASIC interpreter to read its
  2094.     input from FILE.BAS, send its screen output to BAS.OUT,    and its
  2095.     printer    output to BAS.PRT.
  2096.  
  2097.  
  2098.     7.6  Pipe Redirection
  2099.  
  2100.     The next logical step ConIX takes from I/O Redirection is called
  2101.     the Pipe.  It allows you to run    two or more programs, one
  2102.     following the other, where the second reads the    output generated
  2103.     by the first.  The syntax of pipe redirection is:
  2104.  
  2105.  
  2106.  
  2107.  
  2108.                        7-28
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.     ConIX Operating    System                       Redirection
  2115.  
  2116.         <A:00> cmd1 |(+)([(O-options)(:I-options)]) cmd2
  2117.  
  2118.     where the output of cmd1 will be read by the input of cmd2.  If    a
  2119.     `+' is specified, the characters passing through the pipe are also
  2120.     sent to    the console screen.
  2121.  
  2122.     The options to the pipe    are grouped in two categories.    The first
  2123.     are called O-options which are the options corresponding to the
  2124.     output of cmd1.     This group is separated by a colon from the
  2125.     second group called the    I-options, which are the options
  2126.     corresponding to the redirected    input of cmd2.
  2127.  
  2128.     A colon    is not necessary if only output    options    are used.  It is
  2129.     necessary, however, to specify a colon before input options, even
  2130.     if no output options are used.    This is    because    the colon is used
  2131.     by ConIX to determine the start    of the input options list.
  2132.  
  2133.     Note that the `+' must always follow the `|'.  The left    bracket    of
  2134.     the options list must follow the `|', or the `+' if used, and the
  2135.     right bracket must be followed by at least one space or    tab.
  2136.  
  2137.     The syntax of the three-step equivalent    to the pipe is:
  2138.  
  2139.         <A:00> cmd1 >(+)([O-options]) tempfile
  2140.         <A:00> cmd2 <([I-options]) tempfile
  2141.         <A:00> era tempfile
  2142.  
  2143.     The entire pipe    function can be    illustrated by presenting a simple
  2144.     example.  Let's    say we wanted to list all files    that have the word
  2145.     ``TEST'' in their name.     Because there is no way to specify this
  2146.     to the DIR command, you    just have to list all the files    and look
  2147.     for a name with    ``TEST'' in it.     The ``looking'' can be    done by
  2148.     the INDEX command, which checks    for a particular string    in every
  2149.     line of    input it receives.  INDEX will only print those    lines
  2150.     containing the specified string.
  2151.  
  2152.     The first step in the process is to list all the files,    as:
  2153.  
  2154.         <A:00> dir > files.lst
  2155.  
  2156.     (In our    example, DIR was set to    format the disk    directory listing
  2157.     in only    1 column by using the OPT +/-DC    command).  The output of
  2158.     DIR will be saved in the file FILES.LST    for processing in the next
  2159.     step, which is:
  2160.  
  2161.         <A:00> index test < files.lst
  2162.  
  2163.     which searches for the word ``TEST'' in    every line of FILES.LST,
  2164.     printing all matches.  Now that    we have    our list of files, we can
  2165.     perform    the last step:
  2166.  
  2167.         <A:00> era files.lst
  2168.  
  2169.     which removes the intermediate file.
  2170.  
  2171.  
  2172.  
  2173.  
  2174.                        7-29
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.     Redirection                    ConIX Operating System
  2181.  
  2182.     This entire three step process can be reduced to one simple
  2183.     command    sequence by using a pipeline, as:
  2184.  
  2185.         <A:00> dir | index test
  2186.  
  2187.     where the output of DIR    is sent    to the input of    INDEX, which then
  2188.     outputs    the matched lines to the screen.  A temporary file is used
  2189.     by ConIX to store the directory    listing    from DIR, and is removed
  2190.     after the execution of INDEX.
  2191.  
  2192.     The name of the    temporary file takes the form of TMPIPnnn.$$$ and
  2193.     its stored with    its SYS    (invisible) attribute set.  The    actual
  2194.     name varies with each invocation, with nnn set to a three digit
  2195.     number corresponding to    the number of previous invocations.  If
  2196.     the pipe should    be broken, (by an abort, disk full, or reset), the
  2197.     temporary file will not    be deleted.  The pipe file will    be created
  2198.     on the disk from which the pipe    was invoked.  See the OPT +/-PF
  2199.     command    to set a particular disk directory to be used for holding
  2200.     the pipe file.
  2201.  
  2202.  
  2203.     7.6.1  Memory Pipelines
  2204.  
  2205.     ConIX can be directed to use memory instead of a temporary file    to
  2206.     store the data passing through the pipeline.  The syntax of this
  2207.     feature    is:
  2208.  
  2209.         <A:00> cmd1 |(+)([option(s)])@(&start)(-&end) cmd2
  2210.  
  2211.     where the `@' indicates    the usage of a memory file.  This
  2212.     character must always follow the `|', `+', or `]', without any
  2213.     intermediate white space.  The optional    starting address, start,
  2214.     gives the location in memory at    which to store the first
  2215.     character.  The    optional ending    address, end, defines the end
  2216.     boundary of the    buffer.     For example, the command line:
  2217.  
  2218.         <A:00> dir |@1000-17ff index test
  2219.  
  2220.     sets up    a pipeline between DIR and INDEX through memory    starting
  2221.     at location 1000 to location 17FF.  If this memory buffer is too
  2222.     small, excess characters will be discarded.
  2223.  
  2224.     If the end address is omitted, a default length    of 128 bytes will
  2225.     be assumed.  This is equivalent    to specifying the end address as
  2226.     start +    128.  For example, the command line:
  2227.  
  2228.         <A:00> dir |@1000 index    test
  2229.  
  2230.     is equivalent to:
  2231.  
  2232.         <A:00> dir |@1000-107f index test
  2233.  
  2234.     Both the start and end addresses can be    omitted, as in:
  2235.  
  2236.         <A:00> dir |@ index test
  2237.  
  2238.  
  2239.  
  2240.                        7-30
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.     ConIX Operating    System                       Redirection
  2247.  
  2248.     where the pipeline characters will be stored in    the default 128
  2249.     byte internal memory buffer.
  2250.  
  2251.  
  2252.     7.6.2  Using Pipes and Redirection
  2253.  
  2254.     It is perfectly    legal to specify redirection to    a command whose
  2255.     execution is affected by a pipe, as long as it doesn't access the
  2256.     same character stream as the pipe.  For    example, the command:
  2257.  
  2258.         <A:00> cmd1 < inspec | cmd2 > outspec
  2259.  
  2260.     is legal because none of the redirection specifications    conflict
  2261.     with the pipeline.  However, the command line:
  2262.  
  2263.         <A:00> cmd1 < inspec > outspec | cmd2
  2264.  
  2265.     is illegal because the character stream    cannot go through the
  2266.     specified file when it is already going    through    a pipe.
  2267.  
  2268.  
  2269.     7.6.3  Pipe Redirection    Filename
  2270.  
  2271.     Pipes are implemented using temporary files.  These files take on
  2272.     the name TMPIPnnn.$$$, where nnn is set    to a different number
  2273.     every time you pipe.  Some programs do not take    their input from
  2274.     the keyboard, and require a filename as    an argument.  In order to
  2275.     facilitate the convenience of using a pipe with    these programs,
  2276.     they may be given the name of the temporary redirection    file as    an
  2277.     argument.  This    filename is stored in the `$|' variable.
  2278.  
  2279.     For example, the hypothetical program PRINT may    require    a file to
  2280.     print as its argument.    You may    type:
  2281.  
  2282.         <A:00> print foo.asm
  2283.  
  2284.     and the    contents of FOO.ASM will be output to the printer.  To
  2285.     PRINT the output, say, of the DIR directory list command, type:
  2286.  
  2287.         <A:00> dir | print $|
  2288.  
  2289.     where PRINT gets the current temporary output filename from the
  2290.     `$|' variable.    If you would leave out this filename, PRINT would
  2291.     probably output    an error message.  Now you can take advantage of
  2292.     the automatic removal of the intermediary output file.    If not for
  2293.     this variable, you'd have to type:
  2294.  
  2295.         <A:00> dir > outfile; print outfile; era outfile
  2296.  
  2297.     which would produce operationally equivalent results, except that
  2298.     much more typing is involved.
  2299.  
  2300.     Note that because `$|' references an actual disk file, it cannot
  2301.     be used    when implementing a pipeline through memory.
  2302.  
  2303.  
  2304.  
  2305.  
  2306.                        7-31
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.     Redirection                    ConIX Operating System
  2313.  
  2314.     7.7  Disabling Redirection
  2315.  
  2316.     As we showed in    a previous section, whenever a command runs
  2317.     unredirected, it is still passing characters through the standard
  2318.     I/O streams, :TTY and :CON.  This means    that characters    are being
  2319.     passed through all the same internal character handling    routines,
  2320.     although not much work is being    done to    them.
  2321.  
  2322.     The extra machine code executed    for each character I/O function
  2323.     can sometimes cause a noticeable delay in screen output.  To
  2324.     eliminate much of this delay for programs such as text editors
  2325.     that perform very heavy    console    I/O, we've provided a special
  2326.     command    line option, [O], that can speed up the    redirection
  2327.     routines.  Its syntax is:
  2328.  
  2329.         <A:00> [o(=#type)] <command> (arg(s))
  2330.  
  2331.     This option disables console I/O redirection for the given
  2332.     command, thereby causing console input and output functions to
  2333.     perform    as when    running    under CP/M.  This setting does not affect
  2334.     printer    output or the Print Spooling function.
  2335.  
  2336.     If type    is not supplied, all input and output redirection, except
  2337.     for printer redirection, will be disabled.  If a type of 0 is
  2338.     given, only output redirection will be disabled.  If 1,    only input
  2339.     redirection will be turned off.     If type is omitted, all console
  2340.     I/O redirection    functions will be disabled.
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.                        7-32
  2373.  
  2374.  
  2375.  
  2376.  
  2377. continue
  2378.     while your printer is slowly outputting