*** VARIABLES ***

AviosPL is a typeless language or if you prefer everything is stored as a
string. That doesn't mean that all variables are the same however as you can
have the following types:



NORMAL
------
These are declared using the "var" command and their name and can be set to
any value.

eg: var tom dick
    set tom "a string"
    set dick 666



ARRAYS
------
Arrays are declared by using the @ modifier in front of the variable name
and are associative which means that the indexes can be words as well as 
numbers. (Currently and for the forseable future they are 1 dimensional only
but there are ways around this limitation).

eg: set dick:"test" "Test string"

The above would set the element indexed by "test" in the array dick to the
string value following. If a variable (say 'a') had been set to "test" then
the following would have the same affect:

    set dick:a "Test string"

Indexes cannot be the direct output of commands in this version however
(though I intent to implement it at some point) so currently the following
code is *ILLEGAL*:

    set dick:[addstr "te" "st"] "Test string" 

Reverse lookups can be done so once dick:"test" is set you could reset the
element by doing this:

    set dick?"Test string"  "Another string"

You can also get the index itself:

    printnl [dick?"Test string"]

The ? operator tells the system to find the element which has the _value_ 
given.

The final array operator is # which gets the element by index _number_ which
start at 1 _NOT_ 0 as in C.	

eg: set dick:"test" "Test string"
    set dick#1 "Another"
    printnl dick:"test"

Please note that you _cannot_ create a new element using this method , it
will only work on existing elements so for instance if you have an array 'a'
with 3 elements you cannot do: set a#4 "hello". This will give you an 
Undefined subscript error.

Arrays can be set in and retrieved in an alternative method to using the
above operators by treating them as a list string.

eg: var @a
    set a "one two three"
    printnl a:"1" " " a#2 " " a?"three"
    printnl "--" a "--"



POINTERS
--------
These can only be declared in a procedure parameter list and are declared by
having a '*' in front of the variable name. They are set and read like any 
other variable but anything done to them is actually done to the variable they 
reference.

eg: proc main
    var tom @dick

    set tom "ONE"
    set dick:"test" "hello"

    printnl tom "," dick:"test"
    call testproc tom dick
    printnl tom "," dick:"test"

    endproc


    proc testproc *a *@b
    set v "TWO"
    set b:"test" "world"
    endproc



SHARED VARIABLES
----------------

Global variables can be shared between processes (although only 1 process is 
the actual owner) by use of the share command , eg: var a; share a
Currently sharing is either all or nothing , either all processes can
access the variable or none can. This may change in future releases. To
access a shared variable you prepend its name with the process number of the
owner of the variable plus a dot (the process number can be in a variable 
itself

eg: PROCESS 2                            PROCESS 3

    var tom; share dick                  var dick;  share dick                           
    proc main                            proc main
    set tom 10                           set dick 20
    sleep 1                              sleep 1
    printnl "Process 3 var: " 3.dick     printnl "Process 2 var: " 2.tom
    sleep 1                              sleep 1
    endproc                              endproc

A variable can be unshared using the unshare command. Remember that only 
global variables can be shared as local variables are destroyed once the
procedure they are in has exited.

Use useful command to use with shared variables is the tset command which
provides an atomic test and set operation allowing shared variables to be
safely used as semaphores between processes.



SYSTEM VARIABLES
----------------

There are quite a number of system variables in Avios (denoted by a prepended 
'$' sign) all of which are read-only and are set internally by the system. They
are either specific to the process referencing them or apply to the system as
a whole.


Systemwide ones:
   $pcs - This array holds the list of process names indexed by process number.
  
   $pcs_count - Current number of processes (including images and the 
                system_dummy process) on the system.
     
   $error - This array stores the system error strings indexed by error number.

   $max_mesgs - Maximum number of messages allowed on a process message queue.

   $version - Avios version number.

   $build - Avios build (eg: STANDARD, LINUX etc)

   $uname - Information about the version of Unix the system is running on.
            It gives the same info as doing "uname -a" at the unix shell.

   $unixuser - This array gives information on the user whos id the system was
               started under.

Process specific ones:
   $name - Name of the process.

   $filename - Program filename of the process.

   $pid - Process id which is a number. This is an Avios Id , not a unix one.

   $ppid - Process id of the parent process. If it doesn't have one its zero.

   $site - Current site process is connected to. Value is set to <TERM> or
           <BACK> if process is a terminal or background one and </dev/....>
           if connected to a device.

   $lport - Local port process is on as setup in the init file.

   $rport - Current remote port the client the user is connecting to us with is
            using.

   $prog  - This array stores the program text of the process (not including
            comments and empty lines). Each element of the array contains a 
            single "word" which is the prog_word[].word string from the C 
            structure in the source code. Appended to each element is the 
            program line number , the real/file line number and the filename
            the word was loaded from. See the virus example program to see 
            how it can be used.

   $proc  - This is an array which stores the return values from procedures.
            They are referenced using the procedure name as the array index.

   $result - Stores the value returned from the most recent procedure call. 
             This is a more convieniant method than using $proc:"<procname>".

   $mesg_cnt - Count of the number of messages currently in processes message 
               queue.

   $int_mesg - Passed along with an interrupt.

   $int_enabled - 1 or 0 depending on whether interrupts are enabled or 
                  disabled (set using ei and di commands).

   $in , $out - Names of the current input and output streams as set by the 
                in and out commands. 

   $print_ok - 0 if process tried to print to a non-blocking but locked or
               full stream, otherwise 1.

   $eof - Normally 0 this will change to 1 if a read operation is performed
          on a file and the end of the file is then reached. 

   $last_error - Set to the error number of the error last caught by a trap
                 command.

   $break - Set by the optional argument with the break command.

   $cont - Set by the optional argument with the continue command.