Copyright (c)  1994, 1995, 2002  Timothy Rue (3seas@threeseas.net)

  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.2
  or any later version published by the Free Software Foundation; with no
  Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

  A copy of the license is included in the file fdl.html

-------------------------------------------------------------------------------

                  (SF) Sequence-Focus, Sequenced-Files.


 Brief:
    SF - process and output Sequenced File lines, with optional line editing.


 Specific:

   (SF) Sequence-Focus - The concept of Sequence-Focus is to access and control
        the typical "grab the next line of the active sequenced-file", process
        it for VIC variables and commands, then pass it (or its return values)
        to the device, program, program-port, etc. as set by OP, when there is
        something to pass on (not totally consumed by SF processing.)

        SF has options to step through the processing of SF file lines and to
        limit processing. The ability to allow the user to directly alter the
        line being processed and at the different steps in the processing of the
        line. The user can insert lines to be processed before and/or after the
        current line, and use SF in interactive mode (no SF file being
        processed). The option to send the line(s) to a file (tee) with or
        (redirection) without sending it to the OP defined device or program.
        All this can be done through PK setting the SF-LPC (Line Processing
        Control) flags.

        SF-LPC flags
        ------------
        A - auto-processing (default)
        S - step-processing (S = S1)
        S# - Step Processing and level of (optional).
             (additional levels yet to be determined)
        I - interactive mode = S0 (Step processing is inherently interactive but
             at '0' level SF processing doesn't step, but only prompts user for
             a SF line to process when it has nothing to do. It does not step in
             processing the line.)

        E - enable SF processing (default)
        B - bypass SF processing (IQ/ID out is directly to OP setting direction)
        D - disable SF processing (Suspends SF leaving AI processing available)

        +/- Variables: +V variables (default), -V don't process VIC variables
        +/- Commands: +C commands (default), -C don't process VIC commands

        T filename  - tee to file (append to file)
        R filename  - redirection to file (append to file)


        A keyboard key combination (Ctrl-P) can be used to toggle step and auto
        processing. It is also possible for an SF file line to select the
        processing mode, through a PK command call.

        To clearly understand the limitation of SF and PK abilities to alter
        the sequence, understand that SF only processes the current line for VIC
        variable and commands, optionally with user interaction, before passing
        what remains, to the device, program, file, etc. defined by OP. PK, in
        altering the SF stack, only alters the coming sequence of files and/or
        their next file line number(s) that SF processes. SF updates the PK
        files SF stack to the next line to be processed.

        First variables are processed to replace variable names with their
        values. This happens in a recursive manner so multi-depth variables can
        be found and again processed to get to their final value. Then the line
        is checked for VIC commands. If VIC commands are found, it executes the
        commands and passes any results to the output (as defined by OP.)

        It is possible to tell SF not to process VIC variables and/or commands.
        (say you want to use Csh "foreach" to call a VIC command, you'd need a
        way to escape or pass the VIC commands, and perhaps variables, past SF
        to Csh processing.)


 "SF" files:

        The input SF file(s) can be stdin, a pipe, port, etc. type of temporary
        file, as is generated by IQ/ID output, or external program such as
        another VIC, where the tee/redirection to file output can be directed as
        input to another VIC SF command processor.

        The sequenced files can be any text type files. Generally these files
        would contain commands for the VIC but would also contain lines for
        other programs or output objectives (auto-composing content.) Since what
        is not totally processed and consumed by the VIC, is passed to the
        output as determined by "OP".


 Variables:

        Variables are handled in the typical shell manner, where using a '$' in
        front of a variable name i.e. $varname will access the variable content
        and an escape character '\' to allow the use a '$' as a normal character
        rather than a special character, i.e. '\$test' will output '$test'. This
        way it is possible to create a variable having content containing
        '$variable' or multi-depth variables.


 Command Processing:

        It is possible to have more than one SF-line, for SF to process in
        sequence, per console line-string by using a semicolon ';' to separate
        or delimit SF lines to process. It is thru the use of this ';' delimiter
        that the user can insert a line for SF to process before and/or after
        the currently being processed SF line. But in doing this the next "step"
        will only show the first "line to SF process", while what follows is
        buffered (not lost.) However, The SF running Stack "filename@line#" does
        NOT consider such a "multi-SF line as being more then one file line
        (because in the debugging process the line number needs to be the actual
        line number in the named file, not how many "SF lines" there are to, or
        have been, processed.)

        Redirection input '<',  output '>' and pipe '|' are also available.
        This way it is possible to make a variable contain the returned values
        of commands such as the PK commands, that return the PK file lines or
        fields. And to then use such variables to reset such PK file content
        with PK commands using these variables. See above about variables and
        the OI command.

        Of course in finding a VIC command the given command function is called
        with the given arguments. If a VIC command/function does not yet exist
        (i.e. IQ, ID and KE commands) there should still be a dummy function
        call to act as a place holder for that command/function parse tree for
        when they do exist.


 SF Line editing:

        As a minimum, the ability to place the cursor anywhere in the SF line
        contents and use the typical insert/delete(overwrite) mode of editing,
        as well as typical cut and paste abilities. Of course having typical
        intelligent shell line editing capabilities and even history can't hurt.

        While in step mode, as each line is stepped through, variables being
        replaced with their values and piped commands being done in sequence,
        the user is allowed to edit the line, but in any case the user is
        required to hit the return/enter key to cause the next step to happen.


 SF GUI/UI:

        The SF user interface for a VIC instance: As a GUI, it may be listed in
        an overall VIC AI GUI system list, iconified onto the desktop, sized
        just for minimum SF user interaction, or full debug/watch of various
        elements but typically watch, step, and edit of the current files used.
        Of course a lot regarding such a GUI has to do with the GUI system being
        used. Python itself contains no GUI system though Tcl/Tk tkinter is
        considered a standard gui system for python, it is not available on all
        system Python is available on. Because of this it is important to
        make/have a console based user interface as well as generate such output
        that a GUI interface can make use of to produce what is mentioned above.

        If this VIC system was to only run one instance of a VIC then handling a
        console interface would be rather simple and straight forward. But that
        is not in the versatility scope of the VIC. Considering several possible
        solutions to the problem, from using python os.module to start up a dos
        level shell running another python interpreter for each VIC instance, to
        using fork(... uh  if there is no spoon, there is no fork() usability in
        one system named squeeeeeek...windows...) but then there are Threads....
        But still, how to manage output from multiple VIC instances with the
        possibility of one or more set to watch/debug, step and/or user
        interactive mode?

        What to do here? A little of both? The use of two consoles/shells, one
        specifically for requested and error information output, the other
        specifically for user input, editing and stepping of SF line processing.
        The use of threads to keep overhead down, interpreter locks to control
        sequence focus, and pipes to redirect selected output information to the
        output console....?

        As a shell/console interface (non-gui) what we are probably better
        working from is the AI priority level or just above the VIC instances
        of whatever number of SF processor might be running. We can better
        manage multiple VIC instances information output and user input through
        the common AI processing level, which would in turn interact with
        whatever GUI system we might decide to use. User Input/Editing having a
        single input console interface...(we only do one thing at a time anyway)
        ... we need a way "Focus" to the VIC instance we want to work with at
        the moment.

        We can instruct each VIC instance to output whatever degree of
        information we want, i.e. Full watch/debug ... from watching PK file
        changes, OI file contents and changes, KE file contents and changes, SF
        processing, error out, etc.) to no output, etc.... When this information
        is being output to a single console, each output line begins with the
        VIC instance identifier responsible for the information. That is the VIC
        instance identifier as determined/set at startup of each VIC instance
        (See AI and the first field of the PK files AI: line).

        To interact with a specific VIC instance, use the command:

             SF AI-name.number

        Which will set the input/editing prompt to the specified AI-name.number
        and focus on interaction with named VIC instance and watch and error
        output.

        To change the focus, issue the command again but with another named VIC
        instance identifier or the command:

             SF AI

        which will bring focus back to the overall, again outputting requested
        information from all VIC instances.


 Debugging tools for what the VIC system processes:

        Given that any number of things may be processed by the VIC system and
        there has yet to be established enough use "experience" of the VIC
        system, it is not possible to really determine what useful functionality
        to include at this time. A lot may be determined based what GUIs are
        created, what information they would find useful and what information/
        data they might generate for VIC use.

        With these unknowns in mind, the current command options of SF will be
        limited.


SF Commands:
------------

SF AI level options (**):
-------------------------

     SF AI AI-name.number

        Sets interaction focus to given VIC instance.


     SF AI

        Sets interaction focus to total VIC system.


SF VIC instance level command options:
--------------------------------------
(Available only in VIC instance level as set above, ** unless otherwise noted)
("output" is always to output console, unless redirected.)

     SF

        Outputs PK SF running Stack line.


**   SF -?

        Help on SF (help the same way as found in the AI and PK commands)
        (**Allowed in AI level)


     SF -r

        Outputs "contents" of current top-of-stack SF-file@line#. (look ahead,
        as the top of stack shows next line to process.)


     SF -r#

        Outputs "content" of current top-of-stack SF-file@line# up to the # of
        lines given. i.e. "SF -r12" will output the next 12 lines of SF-file
        stack.

        NOTE: This does NOT advance the line# or alter the stack of the SF file
        being processed, but only outputs/shows the contents of the given count
		of next SF stack lines to process, regardless of which files on the
        stack they may be.


**   SF filename@line# (opt. -#)

        Outputs given filename@line# contents. If opt. -# is used then range of
        lines will be output. Range starts at line# given otherwise first line
        of file and outputs lines up to the -# of lines given or end-of-file,
        which ever comes first. (**Allowed in AI level)


     SF -w item,..

        Cause a watch of given item(s) in current Focused VIC instance.

        A single item may be an individual item like a single variable or a set,
        such as the complete current OI file content. i.e.:

        SF -w IO:variablename, IO:variable2  - will watch these variables

        SF -w IO:              - will watch the whole list, IO-file.

        Upon setting for a full list, the full content of the item is output,
        after that only what is changed is output. i.e. even if the full set
        of OI variables is to be watched, only those variables which have been
        changed are output to the output watch console, along with their new
        values, which can be a messages stating the variable has been removed.
        If the OI file is changed then that to is noted on the output along
        with new file and list of variables and their content. This as well
        applies to PK files and KE files, but NOT IQ, ID or SF files as these
        files can be far to large to watch, but their listing/change in the PK
        file will be noted.


**   SF -W item,...

        Cause named item(s) to be watched in any VIC instances it exist in.
        (**Allowed in AI level)


**   SF -W AI:AI-name.number/item,...

        Watch on item(s) in given VIC instance. (**Allowed in AI level)


     SF -wr

        Outputs the full watch list of current focused VIC instance and their
        values.


**   SF -Wr

        Outputs full watch list and values of all VIC instances.
        (**Allowed in AI level)


     SF -wr item,...

        Outputs item(s) of current focus VIC instance and their value(s).


**   SF -Wr item,...

        Outputs item(s) in full watch list and their value(s).
        (**Allowed in AI level)


     SF -wc

        Clear the watch list of current focused VIC instance.


**   SF -Wc

        Clears the Complete watch list. (**Allowed in AI level)


     SF -wc item,...

        Clears item(s) from watch list of current focused VIC instance.


**   SF -Wc item,...

        Clears the complete watch list of item(s). (**Allowed in AI level)


**   SF -wc AI:AI-name.number/item,...

        Clear watch list of given VIC instance item(s) (**Allowed in AI level)