[comp.binaries.amiga] ARP library docs, part 2 of 2

afb@j.cc.purdue.edu (Matthew Bradburn) (12/11/87)

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	arp31.docs
# This archive created: Thu Dec 10 15:34:46 1987
# By:	Matthew Bradburn (Purdue University)
cat << \SHAR_EOF > arp31.docs
^L

TABLE OF CONTENTS (not in order)

arp.doc/Printf
arp.doc/FPrintf
arp.doc/Puts
arp.doc/ReadLine
arp.doc/GADS
arp.doc/Atol
arp.doc/EscapeString
arp.doc/CheckAbort
arp.doc/CheckBreak
arp.doc/Getenv
arp.doc/Setenv
arp.doc/FileRequest
arp.doc/CloseWindowSafely
arp.doc/CreatePort
arp.doc/DeletePort
arp.doc/SendPacket
arp.doc/InitStdPacket
arp.doc/PathName
arp.doc/Assign
arp.doc/DosAllocMem
arp.doc/DosFreeMem
arp.doc/BtoCStr
arp.doc/CtoBStr
arp.doc/GetDevInfo
arp.doc/FreeTaskResources
arp.doc/ArpExit
arp.doc/ArpAlloc
arp.doc/ArpAllocMem
arp.doc/ArpOpen
arp.doc/ArpDupLock
arp.doc/ArpLock
arp.doc/FindProcess
arp.doc/GetDataSegment
arp.doc/PatternMatch
arp.doc/FindFirst
arp.doc/FindNext
arp.doc/FreeAnchorChain

^Larp.doc/DosAllocMem (V31)

     NAME        DosAllocMem -- AmigaDOS compatible memory allocator
 
    SYNOPSIS
        memBlock = DosAllocMem( size_in_bytes )
            d0                      d0
 
    FUNCTION
        This function returns a memory block of the size requested, or
        NULL if the allocation failed.  The memory will satisfy the
        requirements of MEMF_PUBLIC | MEMF_CLEAR.
 
        As expected by AmigaDOS, the total size of the memory block is
        stored at (memblock - 4), so the actual memory allocated will
        always be four bytes larger than size_in_bytes.
 
    INPUTS
        size_in_bytes - the size of the desired block in bytes.
 
    RESULT
        memBlock - a pointer to the allocated free block.  This block
                   will be longword aligned, and the total size of the
                   block is stored at (memblock - 4).  If the allocation
                   failed, memBlock will return zero.
 
    ADDITIONAL CONSIDERATIONS
        The value returned by DosAllocMem is a real pointer.  If you
        need a BPTR, you must convert this value yourself.
 
    BUGS
        None known.
 
    SEE ALSO
        DosFreeMem()
 
    AUTHOR: SDB
    REVISED:
^Larp.doc/DosFreeMem (V31)
 
    NAME
        DosFreeMem -- AmigaDOS compatible memory freer.
 
    SYNOPSIS
        DosFreeMem( memBlock )
                        A1
 
    FUNCTION
        This function frees a memory block which was allocated using
        DosAllocMem or was allocated by AmigaDOS.
 
    INPUTS
        memBlock -- the pointer to the memblock returned by DosAllocMem.
                    This pointer may also be NULL, in which case no
                    memory will be freed.
 
    ADDITIONAL CONSIDERATIONS
        memBlock is not a BPTR - if you are passing a value obtained
        from AmigaDOS, make sure you convert it from a BPTR to a real
        pointer first!
 
    RESULT
        None.
 
    BUGS
        None known.
 
    SEE ALSO
        DosAllocMem()
 
        AUTHOR: SDB
        REVISED:
^Larp.doc/Printf (V31)
 
    NAME
        Printf -- print formatted data on current output.
 
    SYNOPSIS
        count = Printf("String", *args)
          d0              A0      A1
 
    FUNCTION
        Print formatted data on current output stream.  This function
        is implemented as FPrintf( Output(), "String", *args), please
        see that page for more information.
 
    INPUTS
        See FPrintf entry for "String" *args.
 
    RESULT
        See FPrintf entry.
 
    BUGS
        None known.
 
    SEE ALSO
        FPrintf, Puts.
 
        AUTHOR: SDB
        REVISED:
^Larp.doc/FPrinff (V31)
 
    NAME
        FPrintf -- print formatted data on file.
 
    SYNOPSIS
        count = FPrintf(File, "String", *args)
 			 D0      A0       A1
    FUNCTION
        This function performs 'standard' C-style formatting of data on
        the specified output file. It uses the exec function
        RawDoFmt() to do the actual formatting of the data.  The %
        types supported by this function are quite standard, see any C
        reference for details.
 
    INPUTS
        File - A valid AmigaDOS output file handle, such as returned
               by Open() or Output().
 
        "String" - pointer to a C-style format string.
 
        *args - Pointer to start of argument stream.
 
    RESULT
        count - if all goes well, the total count of characters
                actually written will be returned.  If an error occured,
                this function will return -1.  If this function is
                passed a NULL output filehandle, this function will
                return zero.
 
    ADDITIONAL CONSIDERATIONS
        If your compiler uses a default int size of 32 bits (i.e., Lattice),
        you *must* specify %lx or %ld, for example, instead of %d
        or %x, since the compilers will promote all ints to longs
        before passing them to this function.
 
        Note also that this function very likely has a different idea
        of stdout then the support libraries for your compiler.
 
    BUGS
        None known.
 
    SEE ALSO
        Printf, Puts, exec.library/RawDoFmt, C language reference on printf.
 
    AUTHOR: SDB
    REVISED: cdh 26-sep-87 Use ArpBase not DosBase for call
^Larp.doc/CreatePort (V31)
 
    NAME
        CreatePort -- Create a message port.
 
    SYNOPSIS
        msgport = CreatePort("Name", priority)
          d0                    A0,     D0 (0:8)
 
    FUNCTION
        Creates a message port with the given name and priority.  This
        function is equivalent to that in amiga.lib, but is reentrant, and
        may be called by assembly code.
 
     INPUTS
        Name - pointer to a null terminated character string, or NULL.  If NULL,
               this function will not attach the port to the system msgport
               list (it will be private to the caller).
 
        priority -- the priority of this msgport (-128..127).
 
    RESULT
        Pointer to an initialized message port, or NULL, if port could not
        be allocated.  If Name was non-null, then the port will have been
        added to the system's msgport list.
 
    BUGS
        None known.
 
    SEE ALSO
        DeletePort
 
    AUTHOR: SDB
    REVISED:
 
^Larp.doc/DeletePort (V31)
 
    NAME
        DeletePort -- Deletes a message port.
 
    SYNOPSIS
        DeletePort(port)
                    A1
 
    FUNCTION
        Removes a message port.
 
    INPUTS
        port - pointer to a message port - may be private or public.
               port may also be NULL, in which case this function does nothing.
 
    RESULT
        None.
 
    ADDITIONAL CONSIDERATIONS
        Functionally equivalent to amiga.libs DeletePort, although the Amiga
        version does some extra stuff which is not done here, largely
        because it does not appear needed.
 
    BUGS
        None known.
 
    SEE ALSO
        CreatePort
 
    AUTHOR: SDB
    REVISED:
^Larp.doc/InitStdPacket (V31)
 
    NAME
        InitStdPacket -- Initialize a standard packet structure.
 
    SYNOPSIS
        InitStdPacket(Action, Args, Packet, replyport)
                        D0      A0     A1       A2
 
    FUNCTION
        This function performs the initialization required for a packet
        before it is posted to AmigaDOS.
 
    INPUTS
        PacketType -- The type (action) of packet you need.
        Packet -- Address of the start of the standard packet you wish
                  initialized. NOTE! - this is the start of the message
                  portion of the packet, NOT the actual packet itself.
 
        ReplyPort -- The replyport for this packet.
 
        Args -- pointer to an array of 7 longwords representing the
                argument values you wish to send to AmigaDOS.  If this
                is NULL, the packet arguments will be cleared.
 
    RESULT
        The StdPacket is initialized according to your requests.
 
    ADDITIONAL CONSIDERATIONS
        Note that AmigaDOS destroys the value of the replyport in the
        packet structure each time it is posted, therefore, you must
        preserve a local copy of this pointer, and reinitialize it each time.
 
    BUGS
        None known.
 
    SEE ALSO
        SendPacket
 
    AUTHOR: SDB (Version 8)
    REVISED:
^Larp.doc/SendPacket (V31)
 
    NAME
        SendPacket -- Send a packet to DOS.
 
    SYNOPSIS					     xxxxxx
        Result1 = SendPacket( Action, Args, Handler, Result)
           d0                    d0    a0      a1       a2
 						     xxxxxx
    FUNCTION
        Sends an AmigaDOS packet to a handler.  This function will Wait(),
        if necessary, until the Handler returns the packet.  It cannot
        therefore be used for asynchronous I/O.  This function uses the
 	processes message port, and it will call the pr_PktWait function
 	if this is installed.
 
    INPUTS
        Action -- the action you wish this packet to cause.
 
        Args -- Pointer to an array of seven long words which specify the
                arguments to send with the packet.  This may be NULL, in which
                case the arguments will be set to zero.
 
        Handler -- The address of the msgport of the handler you wish to
                   receive this packet.
 
        Result -- Pointer to an array of two long words in which the
                  result1 and result2 of the returned packet will be
                  placed.  This may be NULL.
 
 
    RESULT
 	This function returns the result1 field of the returned packet.
 
    ADDITIONAL CONSIDERATIONS
 	Providing a higher level language environment for a user installed
 	PktWait function is an exercise left to those who require it.
 
 	For use in assembly language, d0 will hold the result1 field,
 	and d1 will hold the result2 field.
 
    DIAGNOSTICS
 	See the return values for the packets which you post.  Note that
 	other processes (dos handler processes) are also using the process
 	message port.  If this function gets a packet other than the one it
 	posted, it will GURU out.
 
    BUGS
        None known.
 
    SEE ALSO
        InitStdPacket
 
    Author: SDB
    Revised: V15.5 -- Uses process message port, which is vastly superior
 	     to the way we were doing this originally.  In particular, this
 	     allows us to return res1 and res2 instead of the former returns.
 	     Many thanks to whawes for this suggestion. (SDB)
    Revised: Result array arg removed
^Larp.doc/EscapeString (V31)
 
    NAME
        EscapeString -- convert escape characters in string.
 
    SYNOPSIS
        NewLength = EscapeString( "String" )
            D0                       A0
 
    FUNCTION
        This function scans the string, replacing all escaped characters
        with the correct byte value.  This function uses the value for ESCAPE
        set in ESCChar in ArpBase, which is maintained elsewhere; this value
 	defaults to the BCPL '*' (RSN), or may be the normal '\'.
 
        This function currently recognizes the following special characters:
 
            N   - newline
            T   - horizontal tab
            V   - vertical tab
            B   - backspace
            R   - return
            F   - formfeed
            E   - escape (ascii 27 decimal)
            Xnn - character representd by hex value nn.
 
        The above may be either upper or lower case.  If this function
        finds an escaped character which is not one of the above, it will
        return the character value (i.e. '\A' will be replaced by the single
        character 'A'. The sequence '\\' is replaced by the single
        character '\', and so on.)
 
        For sending hexcodes, the \x argument may be followed by either one
        or two hex digits, in either upper or lower case.
 
    INPUTS
        string - pointer to a null terminated ASCII string.
 
    RESULT
        A new string, starting at the same memory location, but with the
        escaped characters (if any) changed to their actual byte values.
        This string will be null terminated.
 
        NewCount -- The new length of the string.
 
    ADDITIONAL NOTES:
        For easy use in assembly language parsers, this function will
        return with the A0 register unchanged.
 
    BUGS
        Routine uses the region of memory pointed to by A0 as a work area,
        so if you wish to retain a pristine copy of the string, copy it first.
 
 
    SEE ALSO
        GADS
 
    AUTHOR: SDB
    REVISED: cdh 16-sep-87	Use ESCchar in ArpBase, rather than wild flags
^Larp.doc/PathName (V31)
 
    NAME
        PathName - Find complete pathname of file/directory.
 
    SYNOPSIS
        Length = PathName(Lock, Destination, NumberNames)
          D0               D0       A0          D1
 
    FUNCTION
        This function builds a path name which completely describes the
        path from the root of the filing system to the file on which the
        Lock has been obtained.
 
        The name returned is of the form:
 
            Volume:Dir1/Dir2/Dir3/.../Name\x00
 
    INPUTS
        Lock -- Thisis a lock on the file or directory obtained from Lock()
                or DupLock(), or some such function.
 
        Destination -- This is the area of memory to place the filename in.
 
        NumberNames -- This is the number of names that can be placed in
                       the destination area.  You should reserve 31 bytes
                       for each pathname component.  The minimum buffer
                       size would be 32 bytes, which would allow room for
                       one name.
 
    RESULT
        The resulting pathname will be placed in Destination.
 
        If everything goes well, then you get the total length of the
        pathname, in characters accumulated.  If there is a problem (either
        the buffer is too small, or there was a disk error), you will get a
        zero.
 
    BUGS
        None known.
 
    SEE ALSO
 
    Author: SDB
 
^Larp.doc/ReadLine (V31)
 
    NAME
        ReadLine -- Get a line from current input. (stdin)
 
    SYNOPSIS
        Count = ReadLine("Address")
 	  d0		    A0
 
    FUNCTION
       This function reads a line of up to MaxInputBuf characters from
       stdin.  You must have a buffer available of this size, or you
       run the risk of overwriting innocent memory.  MaxInputBuf is
       defined in arpbase.[h|i].
 
       This function does no editing or echoing of the command line,
       although it does guarantee the returned string is null terminated.
 
    INPUTS
        Address - Pointer to a 256 byte buffer to store the input
                  string in.
 
    RESULT
        Count - The actual count of the characters returned.
        Address will contain a null terminated string of Count characters.
 	  
    BUGS
        None known - there may be problems using this function on other
                     than a CON: window (i.e., a file, or RAW:), but
                     nothing definite is known at this time.
 
    ADDITIONAL NOTES:
        For the convenience of assembly language programs, A0 is guaranteed
        to contain the same value on exit as it did on entry.
 
    SEE ALSO
        GADS, EscapeString.
 
    Author: SDB
    Revised: VERSION 8, removed SIZE argument, returns NULL if no input handle.
 
^Larp.doc/Atol (V31)
 
    NAME
        Atol -- Ascii string to long int.
 
    SYNOPSIS
        intval = Atol("string")
          d0             a0
 
    FUNCTION
        Convert "string" to a long integer.  This function will skip
        leading whitespace.
        This function returns an error if a non-whitespace non-digit
        is encountered during processing.
 
    INPUTS
        string - pointer ascii string, which may be null terminated
                 or whitespace terminated.  The digits may have
                 leading whitespace.
 
    RESULT
        intval -- a long integer value.
                  If an non-numeric is encountered during processing 
                  other than surrounding whitespace or null
                  terminators), this function will return with the Z
                  flag SET, and the offending character value in d0.
 
                  If the Z flag is clear, then all characters
                  encountered were either whitespace or digits.
 
    ADDITIONAL CONSIDERATIONS
        This function is callable by higher level languages,
        but the glue routine must take the responsibility
        for detecting the error returns, and informing the
        caller in a fashion appropriate to the language in use.
 
    BUGS
        Values which cannot be represented as a 32bit integer will
        not cause an error.
 
     Author: SDB
 
^Larp.doc/Puts (V31)
 
    NAME
        Puts -- Print string with newline on stdout.
 
    SYNOPSIS
        BOOL = Puts("string")
         d0             a1
 
    FUNCTION
        Writes a string to stdout, and then writes a terminating newline.
        This is currently implemented as Printf("%s\n", string).
 
    INPUTS
        string - pointer to ascii string. (null terminated)
                 String may be null, in which case a newline only will
                 be displayed.
 
    RESULT
        See FPrintf page for more information - note that this
        function always trys to write a newline.
 
    BUGS
        None known.
 
    SEE ALSO
        Printf, FPrintf.
 
    Author: SDB
    Revised:  String is now in A1 to allow a more efficient implementation.
              THIS IS INCOMPATIBLE WITH EARLIER VERSION OF THE LIBARARY.
              SDB.
^Larp.doc/GetDevInfo (V31)
 
    NAME
 	GetDevInfo -- traverse through DevInfo device list
 	Traverse through Devinfo list
 	Call with A2 = current position in Devinfo list (or NULL)
 	Returns D0 ( and A2 ) = next entry in Devinfo list (or head)
 	Also - side effect - ZERO FLAG IS SET ZERO if end of list
        Puts -- Print string with newline on stdout.
 
    SYNOPSIS
        devinfo = GetDevInfo( devinfo | NULL )
         d0/A2                   A2
 
    FUNCTION
 	Traverse to next entry in DevInfo device list
 	If input is NULL, returns head of DevInfo
 	At end of list, returns NULL.
 	Side Effect - Zero Flag is NULL return status
 
    INPUTS
        devinfo - pointer to current entry in devinfo list.
 		if NULL, get head of list
 
    RESULT
 	Next entry of devinfo list is in D0 and A2
 	If result is NULL, end of list (Zero flag is set)
 
    BUGS
        None known.
 
    SEE ALSO
        Assign
 
    Author: cdh
    Revised:  20-sep-87 cdh Added traversal (originally only got head
 		of list ).
^Larp.doc/Assign (V31)
 
    NAME
        Assign -- Assigns a logical device name
 
    SYNOPSIS
        Result = Assign("name:","physical")
          D0              ao        a1
 
    FUNCTION
        This function performs the guts of an AmigaDOS "assign"
        function.  The arguments are similar to the arguments of the
        ADOS program "Assign logicaldev: directory".
 
 
    INPUTS
        "name" -- Name to create a Devinfo assigned name for.
 
        "physical" -- Name of file or directory to get a Lock from.
 		  NOTE - if physical is NULL, remove existing name.
 
    RESULT
        A Devinfo entry is created for the requested name. Any prior
        assignment for that name is removed.
 
        Result -- an error code return which may be one of:
 
            ASSIGN_OK       everything worked this time.
            ASSIGN_NODEV    "physical" did not represent a valid directory.
            ASSIGN_FATAL    Something is really rotten somewhere.
            ASSIGN_CANCEL   Attempt to cancel something (like a
                            volume) that can't be canceled.
 
    BUGS
        None known.
 
 
    Author: cdh	15-may-87
    Revised: SDB Version 8.1, make A6=ArpBase for most ArpLib calls,
            Various other minor changes.
 	20-sep-87 cdh Added null input calls "DeleteDevice"
^Larp.doc/BtoCStr (V31)
 
    NAME
        BtoCStr -- Copy a BSTR to a C null terminated string
 
    SYNOPSIS
        Count = BtoCStr("CString", BSTR, MaxLength)
          d0                A0      D0      D1
 
    FUNCTION
        This function copies a BSTR into a null terminated string.
        The BCPL string is passed as an unconverted icky BCPL ptr.
 
    INPUTS
        CString - Pointer to a buffer area for the resulting string.
 
        BSTR - BPTR to the BSTR to convert.
 
        MaxLength - Maximum number of characters in buffer (not
                    including NULL terminator).
 
    RESULT
        Count -- Actual number of characters copied.
        A0 has START of C string for assembly convenience.
 
    ADDITIONAL NOTES:
        This function does NOT require A6 to be ArpBase.  This info
        if for internal (library) use only!  Within the Arp library
        you can bsr CtoBStr without setting A6 = ArpBase.
 	
 	Author: cdh  15-May-87
 	Revised:
^Larp.doc/CtoBStr (V31)
 
    NAME
        CtoBStr -- Copy a C null terminated string to a BSTR
 
    SYNOPSIS
        Count = CtoBStr("CString", BSTR, MaxLength)
          d0                A0      D0      D1
 
    FUNCTION
        This function copies a null terminated string into a BCPL
        string.  The BCPL string is passed as an unconverted icky
        pointer.
 
    INPUTS
        CString - pointer to the string to convert.
 
        BSTR - BPTR to the destination string.
 
        MaxLength -- Number of characters available in BSTR (not
                     including initial count byte.)
 
    RESULT
        Count -- actual number of characters transferred.
        A0 and A1 are zapped.
 
    ADDITIONAL NOTES:
        This function does NOT require A6 to be ArpBase.  This info
        is for internal (library) use only!  Within the Arp library
        you can bsr CtoBStr without setting A6 = ArpBase.
 	
    Author: cdh  15-May-87
    Revised:
^Larp.doc/FindProcess (V31)
 
    NAME
        FindProcess -- Find a process given a CLI task number.
 
    SYNOPSIS
        Process = FindProcess(tasknum)
           d0			 d0
 
    FUNCTION
        This function returns the pointer to the process structure
        associated with tasknum.  This is a pointer to the start of
        the process structure, usable with EXEC calls, and not the
        process value returned by DOS calls.
 
    INPUTS
        The CLI task number for the process, or special case ZERO,
 	which returns the total number of process slots.
 
 	NOTE:  YOU MUST FORBID PRIOR TO CALLING THIS FUNCTION!
 
 	This function only makes sense when you are Forbidden, as
 	otherwise the process may squirt away from you before you
 	can use the result!  Thus this function does NOT Forbid
 	around a critical section.  You have been warned!
 
    RESULT
        Process -- a pointer to a Process structure, or NULL.  A NULL
                   return indicates that there is no currently active
                   process associated with that CLI task number.
 
 		( Except if tasknum was Zero )
 
    BUGS
        None known.
 
    Author: SDB
    Revised:
^Larp.doc/CheckAbort (V31)
 
    NAME
        CheckAbort -- Check for control C
 
    SYNOPSIS
        BOOL = CheckAbort( *Func() )
         d0                  A1
 
    FUNCTION
        This function checks to see if the user issued a CNTRL-C abort
        for this process (either keyboard, or from Break).  It can
        one of three possible actions.
 
        If CNTRL-C occurred:
 
            If (*)(func)() is NULL, then the CNTRL-C system flag will
            be returned.
 
            If (*)(func)() is NOT null, it will be called.  If it
            returns, you will see the return code from your function.
 
            If CNTRL-C did not occur, you will get a ZERO return, and
            (*)(func)() will not be called, even if non-null.
 
    INPUTS
        *Func() -- an (optional) function to call if CNTRL-C occured.

    NOTE - if Func() is called, the and you "rts" from Func, you will
	return to the caller of CheckAbort.
 
    RESULT
        Zero if no CNTRL-C.
        If *Func() is null, a NON-Zero function return will occurr.
        If *Func() is not null, you will see this return value.
 
    BUGS
    None known.
 
    Author: SDB
    Revised:
^Larp.doc/CheckBreak (V31)
 
    NAME
        CheckBreak -- Check for control C/D/E/F
 
    SYNOPSIS
        BOOL = CheckAbort( Mask(s), *Func() )
         d0                  D1        A1
 
    FUNCTION
        This function will check to see if the user issued a
        CNTRL-C/E/D/F abort (from keyboard or Break program), and will
        take one of three possible actions.
 
        If the BREAK occurred:
 
            If *Func() is null, then the Actual Mask will be returned.
 
            If *Func() is NOT null, it will be called, and you will
            see the return code from that function.
 
            If a BREAK did not occur, you will get a ZERO (false)
            return, and	*Func() will not be called, even if non-null.
 
    INPUTS
        Mask(s) -- One (or more) of SIGBREAKF_CTRL_C/D/E/F masks.
        *Func() -- an (optional) function to call if the BREAK occured.
 
    RESULT
        Zero if no Break
 
        If *Func() is null, you will get the masks that caused
        this break.
 
        If *Func() is not null, you will see your return value.
 
    ADDITIONAL:
        For this function, we guarantee all registers preserved,
        except for D0, which will hold the masks.
 
        For CheckAbort, all registers will be preserved, except
        for D0/D1.
 
    BUGS
        None known.
 
    Author: SDB
    Revised: cdh V25 return ***BREAK string in A1, return is same level
 			as call (return address overwritten)
^Larp.doc/GADS (V31)
 
    NAME
        GADS -- Do standard AmigaDOS command line parsing.
 
    SYNOPSIS
        Count = GADS( "line", len, "help"  args, "tplate");
          d0            a0     d0    a1     a2       a3
 
    FUNCTION
        This function performs the standard AmigaDOS style command
        line parsing, using the standard AmigaDOS style templates. It
        also handles interactive command lines for you.
 
        Interactive command lines occur under AmigaDOS when the user
        types a command name followed by a '?' as the first argument.
 
        This program will also perform all the normal AmigaDOS
        processing on the command line before the parse.  In
        particular, this means handling any escape characters that are
        found in the line.  The method used by AmigaDOS (and in this
        function) is to escape quoted commands, but not unquoted
        commands. Quotes will be stripped unless escaped.
 
        Note that ArpLib recognizes a more extensive escape vocabulary
        than AmigDOS (see EscapeString).  Note also that one exception
        to the above occurs when a function is passed a null 'tplate'
        pointer. 
 
    GENERAL DISCUSSION
        Programs calling this function present a very different
        appearance to the calling program than is presented to the
        user of the program.
 
        To the user, it appears as though they have a fair amount of
        flexibility in the order in which they type their arguments.
 
        To the calling program, an argument which is specified as
        first in the template will ALWAYS occupy that slot, if it
        occurs in the users command line, no matter where in the
        command line this argument occurs.  Here is an example:
 
 
            FROM/A,TO,OPT/K,FOOBAR/S        ( template )
              0     1   2      3            ( arg position)
 
        This is how it appears to both the user and the caller:
 
        USER OF PROGRAM TYPES:       PROGRAM SEES:
        f1 f2                        |  arg[0] = f1, arg[1] = f2
        f1 TO f2                     |  arg[0] = f1, arg[1] = f2
        TO f2 FROM f1                |  arg[0] = f1, arg[1] = f2
        OPT zip FOOBAR TO f2 FROM f1 |  arg[0] = f1, arg[1] = f2
                                     |  arg[2] = zip arg[3] = TRUE
 
        If an argument is a string (\A \K or optional), then a pointer
        to the string which is the value of that argument is placed
        in the args array.  If the string is not found, then a NULL
        will be placed in the array slot for that argument (although
        this might cause an error under certain circumstances - see
        below).
 
        If the argument is a SWITCH (\S) then -1L will be placed in
        the args slot for that switch, or FALSE, if the switch was
        not found on the command line.
 
        Note that this function DOES DO ERROR CHECKING on the
        arguments. In particular, this means that if you specify a
        template with a required argument (\A), you can count on it
        being there, you do not have to check for it's existance, as
        this function will return an error to you if it is not present.
 
        There are other conditions which can cause an error to be
        returned, see below for more information.
 
    INPUTS
        "cmdline" -- pointer to the command line, just as you get it
                     from DOS.
 
        cmdlen -- length of command line, just as handed to you by
                   DOS. 
 
        argarray -- Pointer to the start of an array of longwords
                    which will receive the results of the argument
                    parse. There must be as many longwords in this
                    array as there are arguments in the template. 
                    There must ALWAYS be at least one element in this array.
 
                    You may declare this in C as an array of:
 
                        union { char *string;   for optional, /a, /k.
                                long boolean;   for /s
                        }
 
        "tplate" -- Pointer to an AmigaDOS style template.  This
                    function assumes that the template is 'well
                    formed', i.e., no spaces, tabs, etc., and that it
                    null terminated.  Do NOT end your template
                    with ':'.  It may contain mixed cases.
 
 
        "xtra help" -- optional extra help string, which may be as
                       long as you like, and include any type of
                       characters you desire.  The user will see this
                       string if they type a question mark after they
                       have already entered interactive processing.
 
                       If you don't have any xtra help to supply, then
                       this should be NULL, and this routine will use
                       a default help string.
    RESULT
        COUNT -- The number of arguments found, or -1 if there is an
                 error in the comand line.  This function is fairly
                 demanding about command line syntax.  Here are some
                 of the things that currently cause an error:
 
                    An opening quote without a closing quote. (Note
                    that the inverse is ok: "OOPS is a mistake, but
                    OOPS" is ok.  This is consistant with the behavior
                    of AmigaDOS.)
 
                    An argument specified as required (\A) was not supplied.
 
                    Too many arguments were supplied.
 
                    An argument was supplied where a keyword was expected.
 
                    A Template word which required an argument (i.e.,
                    anything except a \S element) was supplied, but no
                    argument was found.
 
                    In interactive mode, no memory for input buffer.
 
        ArgArray -- If COUNT is nonzero, ArgArray contains the results
                    of the parse.  The actual value of the arguments
                    will be placed in the position of the ArgArray
                    corresponding to their descriptor in the
                    template.  If the user supplied a quoted string,
                    the string will be scanned for escape characters,
                    and the appropriate substitutions made.
 
                    If COUNT is ZERO, arg array will contain the same
                    values as those it had at entry to this function. 
                    This allows you to preinitialize the arg array.
 
                    If COUNT is -1, then ArgArray is in an unknown
                    state.  The only option open to you at this point
                    is to issue an error message and scram.
 
 
    WARNING/ADDITIONAL CONSIDERATIONS
        Note that the initial commandline pointer may not be valid
        after a call to this function, due to the interactive command
        line feature.  Use only the argarray values.
 
    BUGS
        No error checking is performed on the actual syntax of the
        template.  This routine assumes you did it right.
 
        Could alter the original cmdline area, and will, except in
        the case of interactive input.
 
        Does not recoginze the ';' CLI comment character on interactive
        input.
 
    ADDITIONAL NOTES:
        If "template" is null (i.e., as might be used by Echo, for
        example), interactive command line processing will take
        place, and arg[0] will contain a pointer to the processed
        string.  Quotes will be stripped, if found (note that
        unmatched quotes will return an error.).  Currently, in the
        case of a NULL template, the single argument will be escaped
        whether it is quoted or not.  This should be ok, since only ECHO
        currently uses this facility.
 
     Author: SDB
    Revised: Version 16
 	Bug fix:
 		Templates with 'holes' such as arg1,arg2,,arg3
 		are now correctly parsed.
 	New Feature:
 		If a command line error occurs which is detectable
 		by this program, the first element of the argument
 		array will contain a pointer to a null terminated
 		string which may by Puts() to inform the user of
 		an error.  Comments on the error messages are welcome.
 		Please use this feature if you can, to avoid the
 		"Bad Args for Glork" syndrome.
 
 	Clarification:
 		GADS() will only detect a missing \A argument if
 		there is NOT a null command line.  So if you have
 		a template with a \A argument, if the return from GADS
 		is not 0 (NULL command line), then you can count on
 		the \a argument being there.  A simple test:
 			if (GADS() <= 0)
 				ERROR
 		will suffice.
 
  Final Fixes (I hope):
 	Use toupper for case change
 	Will treat an unquoted ';' as EOL.
^Larp.doc/GetDataSegment (V31)
 
    NAME
        GetDataSegment -- Get a data segment + ptr for resident program.
 
    SYNOPSIS
        memBase = GetDataSegment(base, size)
           d0                     a0    d0
 
    FUNCTION
        This function provides a method where programs which
        ordinarily could not be made resident will work as resident
        code modules.
 
        Resident code modules have only one copy of the program text
        in memory at one time, no matter how many instances of that
        program may exist in the system.  Ordinarily, programs must be
        written in a special manner to allow this to occur.  However,
        this function should allow most programs to run as resident software.
 
        The only restriction on a program which intends to be resident
        is that it's data must reside in a single block of memory, no
        greater than 64k in size, and it must access it's data by
        offsets from a base register (which will point in the middle
        of this area, of course).
 
    INPUTS
        base -- pointer to the base of the programs data
        size -- size of data region in bytes.
 
    RESULT
        Memory will be allocated for the new data area, the original
        data will be copied to this location, and a pointer to the
        middle of this region will be returned.
 
    ADDTIONAL CONSIDERATIONS
        Many, but note that for Manx users, they will need special
        startup code, as well as a new version of geta4().   They
        should be extremely careful to link only with libraries that
        use the same code model.  Exiting should be done with care,
 	since the data region is automatically deallocated when ArpLib
 	is closed.
 
        Note also that any additional initialization of the data area
        must be carried out before this function is called.
 
    BUGS
        None known.
 
    Author: SDB (V11)
    Revision:  cdh v26 save bytes use CALLEXE
^Larp.doc/GetEnv (V31)
 
    NAME
        GetEnv -- Get the value of an environment variable
 
    SYNOPSIS
        strptr = Getenv("string", buffer, size)
          d0              A0        A1     d0
 
    FUNCTION
        This function provides an environment variable mechanism
        compatible with MANX.  Note that this call is more efficient
        than using the manx getenv() function call when arplibrary is
        installed.  
 
    INPUTS
        string -- pointer to an environment variable name.
        buffer -- a user allocated area which will be used to store
                  the value associated with the environment variable.
                  This may be NULL.
        size -- size of buffer region in bytes.
 
    RESULT
        If found, a pointer to the start of the value string for that
        variable will be returned.
 
        If buffer is non-null, then as much of the value string as
        allowed by size will be copied into the user buffer.
 
 
 
    ADDTIONAL CONSIDERATIONS
        MANX was the first to implement environment variables on the
        Amiga.  As a result, we are trying to be compatible with their
        implementation.  Note that this function is NOT equivalent to
        MANX getenv() call, but can easily be constructed using this
        this function.  Note also that all calls by MANX will be handled
        by arplibrary when it is installed.
 
        You would be wise to run as Forbidden all code which examines the
        environment space of the arp.library (for example, using the
        return value of this function).  As an example, the following code
        performs identically to the manx getenv() function:
 
            char getenv(variable)
                 char *variable;
                 {
                        char *temp;
                        static char *buffer;
 
                        free(buffer);   /* Free memory from last call */
                        Forbid();
                        temp = Getenv(name, 0L, 0L);
                        if (!temp)
                            Permit(), return(0);
                        buffer = malloc(strlen(temp));
                        strcpy(buffer, temp);
                        Permit();
                        return (buffer);
                   }
 
    BUGS
        If size is not large enough, the complete value of that
        environment variable will not be copied to the user buffer.
 
    Author: SDB (V12)
    Revision:
^Larp.doc/SetEnv (V31)
 
    NAME
        Setenv -- Set the value of an environment variable
 
    SYNOPSIS
         BOOL = Setenv("string", buffer)
          d0              A0        A1
 
    FUNCTION
        This function provides an environment variable mechanism
        compatible with MANX.  Note that this call is more efficient
        than using the manx setenv() function call when arplibrary is
        installed.
 
    INPUTS
        string -- pointer to an environment variable name.
        buffer -- a user allocated area which will contains the values
                  to be associated with this environment variabnle.
 
    RESULT
        If the value was succesfully established, a TRUE result will
        be returned, otherwise, a FALSE value will be returned.
 
 
    ADDTIONAL CONSIDERATIONS
        MANX was the first to implement environment variables on the
        Amiga.  As a result, we are trying to be compatible with their
        implementation.
 
    BUGS
        None known.
 
    Author: SDB (V12)
    Revision:
^Larp.doc/CompareLock (V31)
 
    NAME
        CompareLock -- Compares two filesystem Locks to see if they
 			belong to the same object.
 
    SYNOPSIS
       Result = CompareLock( Lock1, Lock2 )
      D0/Z flag		      D0     D1  
 
    FUNCTION
 	This function may be used to determine if two file Locks obtained
 	with the DOS Lock() function belong to the same file/object.
 	Using this library call allows an application to avoid using
 	private information; this call may be updated if/when a DOS
 	Packet ACTION_COMPARE_LOCK is implemented.
 
    INPUTS
        D0 and D1 are Locks obtained with DOS Lock()
 
    RESULTS
 	Return is in D0.  If D0 is:
 
 		0 - Locks are identical
 		1 - Locks are on same Volume
 		2 - Locks are on different Volumes (dn_Task?)
 		3 - Locks are on different Volumes
 
 	Z-Flag reflects return status
 
    BUGS
 	Caveat, this function now uses information that is considered
 	"private" to each filehandler; thus, it is possible it will
 	give an erroneous result if somebody implements a funny
 	filehandler.
 	This function was included primarily for the Rename program,
 	to prevent Rename from creating directory loops that cause the
 	directory to be lost in BCPL-space.
 
    SEE ALSO
        
    Author: cdh (V19)
    Revision:
 
^Larp.doc/PatternMatch (V31)
 
 	NAME
 	   PatternMatch - perform a wildcard match on a string
 
 	SYNOPSIS
 	   result = PatternMatch(pat,str)
 	     D0                 A0   A1
 
 	FUNCTION
 	   This function compares a string to the given pattern and determines
           if it is a valid match.  If so it returns a true result.
           The pattern must be constructed with special preparsed tokens and
           supports the following patterns:
            (p1|p2|p3)  One of the patterns p1, p2 or p3
            ?           Any single character
            #<pat>      Pattern repeated 0 or more times
            [class]     Character class
            [^class]    Negated character class
            {pat}       Structure tag for replacement
            *           0 or more occurances of any character
 
 	INPUTS
 	  char *pat     The pattern string to match against
          char *str     The string to be matched
 
 	RESULT
 	  result - a boolean value indicating success/failure.  The condition
 		   codes are guarenteed to reflect the status of the result
 	
 	BUGS
 	  None known.
 
 	SEE ALSO
 
 	Author:	JAT
^Larp.doc/FindFirst (V31)
 
 	NAME
 	   FindFirst -- Search for multilevel pattern match
 
 	SYNOPSIS
 	   rc = FindFirst(pat, chain, info)
           d0              D0    A0     A1
 					xxxx ( Removed V22 )
 	FUNCTION
           This function locates the first match for a pattern
 
 	INPUTS
          char *pat - pattern to search for
          struct Anchor **chain  - pointer to file chain
          struct FileInfoBlock *info - pointer to file info buffer
 
 	RESULT
 	  long rc - 0 for success, non-zero for any error
 	
 	BUGS
 	  None known.
 
 	SEE ALSO
          FindNext(), MakeAnchor(), FreeAnchorChain()
 
 	Author:	JAT
 		cdh 02-Oct-87 Removed info calling arg - now it is in
 			the anchor base.
 
^Larp.doc/FindNext (V31)
 
 	NAME
 	   FindNext -- Locate next match for a file pattern
 
 	SYNOPSIS
 	   rc = FindNext(chain)
           d0             A0
 
 	FUNCTION
           This function locates the next match for a pattern
 
 	INPUTS
 	  struct Anchor **chain  - pointer to file chain
 
 	RESULT
 	  long rc - 0 for success, non-zero for any error
 	
 	BUGS
 	  None known.
 
 	SEE ALSO
 
 	Author:	JAT
 		cdh 02-Oct-87 added break checks
^Larp.doc/FreeAnchorChain (V31)
 
 	NAME
 	   FreeAnchorChain -- Free an allocated Anchor Chain
 
 	SYNOPSIS
 	   FreeAnchorChain(chain)
                           A0
 
 	FUNCTION
           This function frees an anchor chain allocated by FindFirst/FindNext
           It may be called multiple times without harm
 
 	INPUTS
 	  struct Anchor **chain  - pointer to file chain
 
 	BUGS
 	  None known.
 
 	SEE ALSO
         FindFirst(), FindNext(), MakeAnchor()
 
 	Author:	JAT
^Larp.doc/Strcmp (V31)
 
 	NAME
 		Strcmp -- Compare two strings, ignoring case.
 
 	SYNOPSIS
 		result = strcmp(s1, s2)
 		  d0		a0  a1
 
 	FUNCTION
 		returns <0 =0 or >0
 
 	AUTHOR:
 		sdb
^Larp.doc/Strncmp (V31)
 
 	NAME
 		Strncmp -- Compare two strings for n bytes, ignoring case.
 
 	SYNOPSIS
 		result = strcmp(s1, s2, n)
 		  d0		a0  a1	d0
 
 	FUNCTION
 		returns <0 =0 or >0
 
 	AUTHOR:
 		sdb
^Larp.doc/QSort (V31)
 
     FUNCTION
 	QSort -- Quickly sort whatever you want.
 
     SYNOPSIS
 	stkerr = QSort( baseptr, region_size, byte_size, user_function)
 	  d0		  a0	        d0           d1		a1
 
     FUNCTION
 	QSort is an implementation of Hoares sorting algorithm.  It
 	uses a constant amount of stack no matter what the size of the
 	file.
 
     INPUTS
 	baseptr	- pointer to the start of a memory region to be sorted
 	region_size - size of region to be sorted, in number of elements (not bytes!)
 	byte_size - size of sorted elements, in bytes.
 	user_function - function to be provided by caller, which compares two
 	elements from the set to be sorted.  QSort will call the user function
 	like so:
 
 		return = user_function(el1, el2)
 		d0	   	       a0    a1
 
 	Your function must return the following in D0:
 
 		if (el1 < el2)	return < 0
 		if (el1 > el2)	return > 0
 		if (el1 == el2) return = 0
 
 	You must save all registers except a0, a1, d0, d1.
 	(See below for an example of a C calling sequence)
 
 	QSort will also pass A5 to you unchanged.  You can use this register
 	to point to pass information to your comparison routine.
 
    RETURNS
 	-1 if everything is cool, 0 if there was an internal recursion
 	stack overflow (not too likely).
 
    EXAMPLE:
 	Here is an example of a calling sequence from C, which is to sort
 	an array of pointers to strings:
 
 	char	**names;
 	long	numEls;
 	extern	Cmp();
 
 	if (QSort(names, numELs, 4L, Cmp))
 		do whatever
 	else
 		STACK_ERROR
 
 	the Cmp function would look like this:
 
 	Cmp()
 	{
 		{
 	#asm
 		public	_geta4
 		movem.l	d2-d3/a4/a6,-(sp)	; save important registers
 		movem.l	a0/a1,-(sp)		; push args
 		bsr	_geta4
 		bsr	_cmp			; call real compare function
 		addq.l	#8,sp			; clean up args
 		movem.l	(sp)+,d2-d3/a4/a6	; restore registers
 	#endasm
 		}
 	}
 
 	The cmp function called by the above is a normal C function, it can
 	be whatever you like.  Here is a sample one:
 
 	cmp(s1,s2)
 	char **s1, **s2;
 	{
 		return strcmp(*a, *b);
 	}
 
 	BUGS
 		None known.
 
 	AUTHOR:	SDB	(V17)
 	REVISED:
 
^L(sorry for the skimpy doc on the next few .. out of time! )

    NAME
	FileRequest -- Get filename from user

    SYNOPSIS
	retstr = FileRequest( filereqstruct )
	  D0			    A0
    
    FUNCTION
	Prompts the user for a filename.  See struct FR_struct in arpbase.i,

    NOTE
	V1.0 of Arp does not support the FR_Flags, FR_Wildfunc,
	or FR_MsgFunc entries in the struct, but you MUST allocate these
	and pass NULL values if you want to work with V1.1 of arplib!

^L
    NAME
        CloseWindowSafely -- close a window without GURUing.

    SYNOPSIS
	CloseWindowSafely( window, morewindows )
			    A0,      A1

    FUNCTION
	Closes window after removing any messages pending for it in
	the window msgport, for use with a shared window.  Without
	this precaution, you will GURU when there is fast mouse
	activity (or multitasking).

	The second arguement is NON-ZERO if there is another window
	that still is sharing the msgport (ie, the msgport should
	remain unfreed).  If the second arguement is NULL, the
	msgport is freed as well.  Most often, the value morewindows
	will be an actual windowptr or NULL; the value doesn't really
	matter though, it is just a flag

^L
    NAME
	AddDANode -- add a new entry to a DAList

    SYNOPSIS
	newnode = AddDANode( NewNode, *DaList, length, ID )
			      A0	A1      D0    D1

    FUNCTION
	Adds a node to a DAList.  The address of the DAList header
	is in A1; A0 points at the buffer that you want copied
	as a DANode.  If length is ZERO, NewNode is a null-terminated
	string; if length != 0, it is the length of the mem to
	copy.  ID is a sort key, which may be used by your program
	either for sorting or for classification; see AddDADevs
	and the bitdefs for how they are used for getting device
	names.

    SEE ALSO- FreeDAList
	
^L    NAME
	AddDADevs -- get a private list of devices/assignments/volumes

    SYNOPSIS
	numentries = AddDADevs( dalist, select )
				  A0,	  D0
    FUNCTION
	Adds devices, volumes, and/or assigned names to a DAlist in
	a way that is both safe for multitasking, and easily accessible
	for C/assembler programs.

	See bitdefs in arpbase.i for selecting which devlist entries
	you want, and identifying what each entry is.  The returned
	list is sorted both by class, and then by alpha-numeric.

    SEE ALSO - FreeDAList

	
^L    NAME
	FreeDAList -- Free a DosAllocmem (DA) list

    SYNOPSIS
	FreeDAList ( dalist )
		       A1

    FUNCTION
	Frees all DAList nodes from a DA list.  Each node is a singly
	linked DosAllocMem block, seach for "DA_" in arpbase.i.

    NOTE - The dalist arguement is the actual first item of the list,
	NOT a pointer to the list-head!

^L
    NAME
	FindTaskResList -- find a pointer to current task's reslist
 
    SYNOPSIS  Finds the Resource List for this task, or NULL
	ResList = FindTaskResList()
	  D0 (A1) ( Zero flag )

    FUNCTION
	This function searches for the most recently nested ResList
	for the current task, if any.  If there are no resource lists
	for this task, the return pointer points at NULL.

    NOTE - This implementation may change.  FindTaskResList is normally
	not needed as an external callout, as all task tracking is
	done automaticly without the application needing to know about
	this

    BUGS
	None known.  Will change to work with SyncRun
 
^Larp.doc/ArpExit (V31)
 
    NAME
        ArpExit -- exit immediately, closing arp, freeing resources.
 
    SYNOPSIS
        ArpExit( ReturnCode, (Fault) )
                    d0		d2
 
    FUNCTION
        This function will cause a currently running program to
        terminate.  It will first CloseLibrary(ArpBase), which will
        cause all tracked resources to be freed.  It will then force
        DOS to unload your program, returning the error code to the CLI.
 
    INPUTS
        ReturnCode -- The integer value you wish to return. By
                        convention, 0 means a normal exit.
 	Fault -- If ReturnCode is non-zero, this value is the ADOS
 			error code which is used with the "Why" program,
 			in pr_Result2. ( If ReturnCode is ZERO, pr_Result2
 			will be set to 0).
 
    RESULT
        No results, in fact, no return.
 
    BUGS
        None known.
 
    Author: SDB
    Revised: cdh 16-sep-87 Add pr_Result2 fault value in D2
 	     cdh 28-sep-87 Frees ResLists before CloseLibrary,
 			because CloseLibrary Forbids first - nasty
 			for system performance.
 	     cdh 29-sep-87 Use pr_ReturnAddr rather than DOS Exit(). Hah.
 
^Larp.doc/CreateTaskResList (V31)
 
    NAME
	CreateTaskResList -- Create a new nested ResList for this task

    SYNOPSIS
	ResList = CreateTaskResList()
	  D0 / Z Flag

    FUNCTION
	Create a new Resource list for this task, and insert it at the
	HEAD of the ResourceArray list.

	You do not normally need to use CreateTaskResList, because the
	functions which insert tracked items into the task reslist
	will automaticly create a reslist if one did not exist before.

	This function may be used to explictly create a nested ResList
	for this task; all resources allocated after CreateTaskReslist
	will be stored in the new ResList until you call FreeTaskResList.
	This would allow you, for instance, to call CreateTaskResList at
	the start of a function, and FreeTaskResList at the end of the
	function, and any resources tracked in the interum would be
	freed; but all other tracked resources for the task would
	remain tracked.

	All Task reslists will also be automaticly freed when you call

    BUGS
	None known.  Current implementation will change slightly when
	SyncRun is added to arp.library

    Author - cdh V18
 
^Larp.doc/ArpAllocMem (V31)
 
    NAME
        ArpAllocMem -- Allocate and track memory.
 
    SYNOPSIS
        MemPtr = ArpAlloc( size, reqs )
          d0 (a1)	    D0 / D1
 
    FUNCTION
 
        This function is identical to the Exec AllocMem call, but will
        track memory resources for you.
 
        When you CloseLibrary(ArpBase), any memory allocated with this
        function will be freed, which provides a simpler means of
        termination than is ordinarily found.
 
        You may make multiple calls to this routine -- all memory
        resources will be tracked.  Note also that this function
        requires you to specify the type of memory, so that you may
        also allocate and track CHIP memory using this function.
 
    INPUTS
        Same args as Exec AllocMem request, size / reqs
 
    RESULT
        MemPtr -- pointer to the memory requested, same as Exec AllocMem
 		  return.  If this is NON-ZERO, the memory allocation
 		  succeeded.
 	Tracker -- same as all the tracking calls, register A1 contains
 		  the pointer to the TRACKER.  See ArpAlloc, GetTracker,
 		  CreateTaskReslist,FreeTaskReslist.
 
    WARNING
 	Do NOT call FreeMem to free the memory from this allocation!
 	If you want to free this allocation before terminating the task,
 	or before calling FreeTaskReslist, you MUST use the TRACKER pointer
 	and use FreeTrackedItem.
 
        If you want to manage your own memory, use the exec calls directly.
 
    BUGS
        None known.
 
    SEE ALSO
        ArpAlloc(),  GetTracker(), FreeTaskResList()
 
    AUTHOR: SDB (V8.4)
    Revised:	cdh V23 converted to AllocMem rather than AllocEntry
 
^Larp.doc/ArpOpen (V31)
 
    NAME
        ArpOpen -- Open a file and track it.
 
    SYNOPSIS
        FileHandle = ArpOpen("name", accessmode)
            d0                 d1        d2
 
    FUNCTION
        This function is equivalent to the AmigaDOS Open(), except
        that this function will remember that the file is open when
        you do a CloseLibrary(ArpBase) and close it for you.
 
        This is part of the Resource tracking of ArpLib, which also
        tracks memory allocations and Locks.
 
    INPUTS
        name - pointer to a null terminated string.
 
        accessmode -- pointer to a valid AmigaDOS access mode.
 
    RESULT
        A BPTR to a filehandle, or NULL, if an error occurred.
 
    BUGS
        None known.
 
    SEE ALSO
        ArpAllocEntry(), ArpAlloc(), ArpLock(), FreeTaskResList().
        dos.doc/Open
 
    AUTHOR:  SDB (V9.0)
    Revised:
^Larp.doc/ArpDupLock (V31)
 
    NAME
        ArpDupLock -- Duplicate a lock and track it.
 
    SYNOPSIS
        Lock = ArpDupLock( lock )
         d0                 d1
 
    FUNCTION
        This function is completely equivalent to the AmigaDOS DupLock(),
        except that ArpLib will remember that you have duped this lock,
        and will UnLock() for you when you CloseLibrary(ArpBase).
 
    INPUTS
        lock -- pointer to a lock
 
    RESULTS
        A lock or NULL, if no lock.
 
    BUGS
        None known.
 
    SEE ALSO
        DOS DOCUMENTATION, FreeTaskResList, ArpAlloc(), ArpAllocEntry(),
        ArpClose().
^Larp.doc/ArpLock (V31)

    NAME
        ArpLock -- Get a lock and track it.
 
    SYNOPSIS
        Lock = ArpLock("name", accessmode)
         d0              d1       d2
 
    FUNCTION
        This function is completely equivalent to the AmigaDOS Lock(),
        except that ArpLib will remember that you have opened this lock,
        and will UnLock() for you when you CloseLibrary(ArpBase).
 
    INPUTS
        name -- pointer to a null terminated string
 
        accessmode -- a valid AmigaDOS access value.
 
    RESULTS
        A lock or NULL, if no lock.
 
    BUGS
        None known.
 
    SEE ALSO
        DOS DOCUMENTATION, FreeTaskResList, ArpAlloc(), ArpAllocEntry(),
        ArpClose().
^Larp.doc/GetTracker (V31)
 
    NAME
 	GetTracker -- Get a tracking node for resource tracking.
 
    SYNOPSIS
 	Tracker = GetTracker()		/* PRESERVES D0/D1/A0 */
 	  A1
 
     FUNCTION
 	This call creates a tracking node which you may use to track
 	whatever type of resource you want tracked.  If you leave
 	the TRU_ID field null, this tracker is just considered as a
 	memory node, and properly freed.  In fact, you can use
 	ArpAlloc to and build your own tracking node; all nodes have
 	the same basic structure, with the default being a simple
 	memory allocation.
 
 	This call preserves registers D0/D1/A0, unless the request
 	fails in which case D0 is set to 0 for your convenience,
 	as a NULL result.  On sucess, register A1 is a pointer to
 	the tracking node, and the Z flag is set NOT-ZERO.
 
 	Normally for C language use, the details of tracking will be
 	hidden in a binding routine designed for the particular thing
 	you want to track.
 
 	Normally you should call this function prior to allocating
 	the resource you want to track, see the library functions like
 	ArpLock for an example of how to use this function efficiently.
 
 	The worst case as to what will happen if you use GetTracker
 	and then fall off the end of the world, is that the tracking node
 	will be treated as a ArpAlloc memory item, which will be freed
  	by FreeTaskResList or by a cleanup routine at some later time.
 
    SEE ALSO
        ArpAlloc, FreeTaskResList, ArpOpen, ArpUnLock, ArpDupLock.
 
    Author: cdh
 
^Larp.doc/ArpAlloc (V31)
 
    NAME
        ArpAlloc -- Allocate memory and track.
 
    SYNOPSIS
        Memory = ArpAlloc( size_in_bytes )
          d0                    d0
 
    FUNCTION
        This function provides a simple memory allocation/tracking
        mechanism. You can allocate memory with this function and,
        when you CloseLibrary(ArpBase) or ArpExit(code), the memory
        will be automatically freed for you.  You can make multiple
        calls to ArpAlloc(), each allocation will be tracked.
 
    INPUTS
        size_in_bytes - Amount of memory required.
 
    RESULT
        Pointer to a memory block with attributes (MEMF_PUBLIC | MEMF_CLEAR),
        or zero, if an error occurred.
 
    WARNINGS/ADDITIONAL CONSIDERATIONS
        REMEMBER: You must call CloseLibrary(ArpBase) for the resource
        freeing to occur.


 
    SEE ALSO
        ArpAllocEntry, FreeTaskResList, ArpOpen, ArpUnLock, ArpDupLock.
 
    Author: SDB
    Revised: Use ArpAllocEntry (version 8)
^Larp.doc/FreeTaskResList (V31)
 
    NAME
        FreeTaskResList -- Free tracked resources for this task
 
    SYNOPSIS
        BOOL = FreeTaskResList()
         d0
 
    FUNCTION
        This function frees ALL resources tracked by arplibs resource
        tracking mechanism.  This includes memory as well as open
        files and locks.  Ordinarily, you will call this function
        indirectly by CloseLibrary(ArpBase) or ArpExit().  This
        mechanism allows easier exits (whether normal or abnormal)
        than is usually found.
 
 
    INPUTS
        NONE
 
    RESULT
        TRUE if resource deallocation occurred, otherwise FALSE.
 
    ADDITIONAL
        The tracking scheme has been radically changed from eariler
        versions of arplib, but this should not break any programs.
 
    BUGS
        None known.
 
    Author: SDB
    Revised: Track more stuff (SDB V9).
 
^Larp.doc/FreeTrackedItem (V31)
 
    NAME
	FreeTrackedItem -- Free a tracked item from a ResList

    SYNOPSIS
	FreeTrackedItem( ItemPtr )
			   A1
 
    FUNCTION
	Frees an individual tracked resource.  You need the address of
	the tracking node (which is returned by ArpAlloc or GetTracker,
	or for functions ArpLock/ArpOpen/ArpDupLock, in register A1 as
	the secondary result after the primary value in D0 )

	The resource is removed from the tasks tracking list, automajikly.

    BUGS
	None known.

    Author: CDH V18
^Larp.doc/GetAccess (V31)
 
    NAME
        GetAccess -- Locks access to a tracked resource.
 
    SYNOPSIS
 	Pointer = GetAccess( tracker )
 	  d0		       A1
 
    FUNCTION
 	This function is used in conjunction with FreeAccess() for
 	tracked items. If you call FreeAccess, a tracked item may
 	be freed by the OS during memory crunch.  GetAccess is used
 	to try to reclaim the object for continued use.
 
 	When you call GetAccess, if the item has not been flushed, the
 	return value in D0 is the tracked item pointer (not the tracker),
 	and the item is locked so the system will not attempt to flush
 	it on you again.
 
 	If the system has FREED the tracked item, the return value from
 	the GetAccess call will be ZERO.  In this case, it is best for
 	you to then call FreeTrackedItem on the tracker node, to free
 	the tracking link.  Otherwise the link may cause fragmentation
 	until your task terminates or until you FreeTaskReslist.
 
     BUGS
 	None Known.
 
     AUTHOR: CDH V18

^Larp.doc/FreeAccess (V31)
 
    NAME
 	FreeAccess -- Decrements use count for a tracked item.
 
    SYNOPSIS
 	FreeAccess( Tracker )
 		      A1
 
     FUNCTION
 	Decrements the user count on a tracked item.  If the user count
 	goes to (-1), the item may be freed during a memory crunch.  To
 	find out if the item was freed, use GetAccess, which will return
 	NULL if the item is gone, or the value if it was not freed.
 
 	This maintains private values in the tracking node. If you
 	directly access this information, your program will probably
 	not work in future releases of ArpLibrary.
 
     BUGS:
 	None Known.
 
     AUTHOR
 	CDH V18

SHAR_EOF
#	End of shell archive
exit 0