IBM Object REXX V1.1.9.0 for AIX V4.3.3 README

(c) Copyright International Business Machines Corp. 1998, 2002
All rights reserved.

5765-D62 (c) COPYRIGHT IBM CORP. 1998, 2002 - IBM Object REXX for AIX

CONTENTS

1.0 ABOUT THIS README FILE
2.0 INSTALLATION INFORMATION
2.1 System requirements
2.2 Installation instructions
2.3 Removing installed software
3.0 GENERAL INFORMATION
4.0 LIST OF FIXES AND ADDITIONS
4.1 Known problems
5.0 HINTS AND TIPS
5.1 README file locations
5.2 Case sensitivity of commands
5.3 Case sensitivity of library names
5.4 Deleting shared memory
5.5 Documentation
5.6 User Switch (su -)
6.0 DESCRIPTION OF NEW FUNCTIONS
6.1 SysGetErrortext
6.2 SysQueryProcess
6.3 SysCreatePipe
6.4 SysFork
6.5 SysWait
6.6 FtpGetResume
6.7 USERID
6.8 The MutableBuffer Class
7.0 LIST OF REXX UTILITY FUNCTIONS
8.0 CONTACTS
9.0 NOTICES


1.0  ABOUT THIS README FILE

This README file is for the summary PTF number 024 for the Object
REXX Interpreter. The PTF contains all fixes from previous PTFs.


2.0 INSTALLATION INFORMATION

2.1 System Requirements

Object REXX for AIX version 1.1.9.0 can be installed under
AIX version 4.3 and higher. Object REXX for AIX is a 32Bit
application.

2.2 Installation instructions

If you have got the .tar file, you must unpack the file with the
following command to get the .bff file for installation:

       tar -xvf orx00nn.tar

       (smit(ty) panels:)   enter smit or smitty

      on the menu
       select:  Software Installation and Maintenance
       select:  Install and Update Software
       select:  Install/Update Selectable Software (Custom Install)
       select:  Install Software Products at Latest Level
       select:  Install New Software Products at Latest Level
       fill in:  INPUT device / directory for software
       select the device or enter the file name of the
       installable image of IBM Object REXX for AIX
       and press ENTER to start the installation.

NOTE: If a TRIAL version of IBM Object REXX for AIX exists
on the system:
 o  It must be removed (see 2.3)
 o  The new version of IBM Object REXX for AIX can be installed.
 o  The system must not be rebooted if the procedure "rxdelipc"
    is used to delete the shared memory of Object REXX before
    its first use.


2.3 Removing installed software

    (smit(ty) panels:)   enter smit or smitty

     on the menu
      select:  Software Installation and Maintenance
      select:  Maintain Installed Software
      select:  Remove Software Products
      fill in:  SOFTWARE name
      enter "orexx" and change PREVIEW only? to "no"
        and press ENTER.


3.0 GENERAL INFORMATION

In order to try Object REXX statements, enter  trexx. The
command opens its own window. If the system cannot open a window,
you can enter

     rexx rexxtry.cmd

for the same purpose.

Visit our REXX Internet home page
     http://www.ibm.com/software/ad/obj-rexx
for more information.


4.0 LIST OF FIXES AND ADDITIONS

 o  Performance improvements on stem processing, REXX kernel
    processing, and memory management.

 o  New libraries for:

          o  Mathematical functions
          o  Regular expressions

 o  New options "-force" and  "-help" for binary "rxdelipc".

 o  The default mode for opening a stream is NONE SHARED. This
    default mode can be changed by explicitly opening the stream
    with the stream open command or method using the SHARED/
    SHAREDREAD or SHAREDWRITE mode.

    If a file was opened NONE SHARED and another REXX procedure
    tries to open it again, the NOTREADY signal will be raised.
    For more information see Object REXX Reference chapter 6
    "Stream Class" and chapter 8 "Stream Function".

 o  Memory leak was caused if a REXX program called another
    external REXX program in a loop.

 o  CTRL_Z character for end-of-file is ignored by REXX now.

 o  Delayed and piped input from "stdin" (keyboard) is recognized.

 o  The binary "rexxrt" retokenizes old tokenized REXX scripts to
    the latest REXX version. ( See the description "rexxc" and "rexxrt"
    in the Object REXX Reference for more information.)

 o  Tokenized Object REXX scripts for AIX  do not run on another
    AIX system before Object REXX version 1.1.9.0.



4.1 Known problems
    o Only first buffer read by routed input, no problem if piped.
    o The option for the "rexxc" is "-s" and NOT "/s". This is wrong in
      the documentation.
    o The library "librxftp.so" is not thread save.


5.0 HINTS AND TIPS

5.1 README file locations

The OREXX README files are in the directory '/usr/lpp/orexx/'.


5.2  Case sensitivity of commands

When you issue a command to the system shell, or a REXX script is
called within a REXX script, the command must be put in quotes.
This causes the REXX interpreter to handle the command as a
case-sensitive string. If the command is not within quotes, the
interpreter translates the command to upper case, and AIX does not
recognize this command. This must be taken into account, if you run
REXX programs that were developed under OS/2,  Windows95/NT, or
other non-Unix platforms.


5.3 Case sensitivity of library names

If you want to load a function from an external library,
remember that the library is case sensitive.  For example,
if the library name is 'librexxutil.so',  you must enter:

     rxfuncadd 'SysSleep','rexxutil','SysSleep'

If you instead enter:

     rxfuncadd 'SysSleep','Rexxutil','SysSleep'

the interpreter does not find the library.


5.4 Deleting shared memory

The procedure "rxdelipc" can be used to delete the shared
memory, which Object REXX for AIX uses for "rxqueue" data,
for function registrations, for the macro space, and for
control purposes.

Shared memory can become corrupted as the result of a
"kill -9 PID" call to stop a REXX procedure.

You can also use the procedure "rxdelipc" if stored data of
a named REXX queue will never be fetched and does consume
storage.


5.5 Documentation

If the "orexxman.img" image file has been installed on your AIX
system, the following documentation is provided in directory
/usr/lpp/orexx.info.en_US/*

"Object REXX Reference"               - file:  rexxref.pdf
"Object REXX Programming Guide"       - file:   rexxpg.pdf
"Object REXX Mathematical Functions"  - file:   rxmath.pdf New!
"RxSock Reference"                    - file:   rxsock.pdf
"RxFtp Reference"                     - file:    rxftp.pdf
"Object REXX Regular Expression"      - file: rxregexp.doc New!

If you need the Adobe Acrobat reader to read the PDF files,
download it from URL

     http://www.adobe.com/prodindex/acrobat/readstep.html

or install it from your Object REXX for AIX CD-ROM.


5.6 User Switch (su -)

Object REXX uses a shared memory for controlling purposes and persistent
data storage. Only the owning user can read from and write to this shared
memory for security reasons. Therefore the  "User Switch"  command:
 "su - user_id" must be used to switch to another user and the environment
of this user (through the minus sign) too. Otherwise Object REXX will not
have an anchor point for the shared memory of the switched user.
For more information see the help text of the "rxdelipc -h" procedure.


6.0 DESCRIPTION OF NEW FUNCTIONS


6.1 SysGetErrortext

   >>-SysGetErrortext(errornumber)--------------------------><

Obtains a string describing the system error identified by the
error number.

Returns a string with the description of the error, or an empty
string if no description is available.

Example:

   err=SysMkDir("/home/NotKnown/temp")

   if err \= 0 then

   say "Error" err":"SysGetErrortext(err)


6.2 SysQueryProcess


                        .-PID------.
                        |          |
   >>-SysQueryProcess("-+----------+--")--------------------><
                        |          |
                        +-PPID-----+
                        |          |
                        +-PPRIO----+
                        |          |
                        +-PTIME----+
                        |          |
                        +-PMEM-----+
                        |          |
                        +-PSWAPS---+
                        |          |
                        '-PRCVDSIG-'

Retrieves information about the current process.

Parameter:

   info
      The kind of information requested:

   PID
      Returns the process ID of the current process.

   PPID
      Returns the parent process ID of the current process.

   PPRIO
      Returns the priority number of the current process.

   PTIME
      Returns time information on the current process.

   PMEM
      Returns the maximum of memory (RSS) used by the current
      process.

   PSWAPS
      Returns the number of memory which has been swapped out.

   PRCVDSIG
      Returns the number of memory which has been swapped out.

Return codes:

  o  For PID or PPID: an ID

  o  For PPRIO: a number between -20 and +20

  o  For PTIME: the summary and the amount of time that the
     process executed in kernel mode, and the amount of time
     that the process executed in user mode.


6.3 SysCreatePipe

                     .-Blocking----.
                     |             |
   >>-SysCreatePipe(-+-------------+-)-----------------------><
                     |             |
                     '-Nonblocking-'

Creates an interprocess channel called an "unnamed pipe", opens
it, and returns two handle identifiers separated by a blank. The
first handle returned is opened for reading, and the second is
opened for writing.

Unnamed pipes are used to allow communication between different
processes. Anything that is written to the writing pipe can be
read from the reading pipe. The restriction is that unnamed pipes
can only be shared between the process that creates them and the
child processes of that process.

Once an unnamed pipe is created with SysCreatePipe, the read and
write handles can be used directly with the system I/O functions,
or they can be concatenated with the string "HANDLE:" to form
stream names that can be used like any other transient streams in
REXX programs. Because they are transient streams, changing the
read and write positions is not allowed, CHARS returns only 1 or 0
(See Chapter for "Input and Output Streams" for a discussion of
REXX input and output).

The "Blocking" option, which is the default, causes input operations
to wait until data is available in the pipe, or until an end-of-file
indication is returned by the UNIX operating system (which means
that no processes remain that have the pipe open for writing).
The end-of-file indication will cause the NOTREADY condition to be
raised when the native REXX input functions are used. For system
input functions, the end-of-file indication is returned.

The "Nonblocking" option, on the other hand, causes input operations
to return immediately, regardless of the availability of data. If no
data is present, but there are still processes that have the pipe
open for writing, the input operations will simply return null
strings (""). An end-of-file indication will still raise the NOTREADY
condition if the native REXX input functions are used. For system
input functions, the end-of-file indication is returned.

The handles returned by SysCreatePipe are numeric, and equal to the
handle numbers returned by the "pipe" of the UNIX operating system
subroutine. You might want to pass this information to any programs
that you call, so that they can make use of the pipes that you have
created.

Examples:
   SysCreatePipe()       ->  "7 8"   /* maybe this */
   SysCreatePipe()       ->  "9 14"  /* maybe this */


6.4 SysFork

   >>-SysFork()---------------------------------------------><

Returns the process ID (pid) of the created child process to the
parent process, and always returns a value of 0 to the child
process.


6.5 SysWait

   >>-SysWait()---------------------------------------------><

Waits for a child process to stop or to terminate, then returns
with the exit code of the child process. If the child process that
has not been waited for has already stopped or terminated prior to
the call, SysWait returns without waiting.


6.6 FtpGetResume

   New function in the RxFTP library for a file transfer restart.

   The FtpGetResume() call copies a single file from a restart position
   of a file on the remote FTP server to the local FTP client. The copy
   and the file to be copied need not have the same name.

   The RestartPosition parameter is optional:

      If it is omitted (or if RestartPosition = 0), and if the local
      file exists, data from the remote file, beginning at its restart
      position, is appended to the local file.

      If it is omitted (or if RestartPosition = 0), and if the local
      file does not exist, the restart position of the remote file is
      ignored, and the entire remote file is copied.

      If a restart position greater than "0" is specified, data from
      the remote file, beginning at the restart position, is copied to
      a new local file. An existing file is overwritten.

   The transfer mode is always BINARY.

   The remote host running the FTP server is specified with the FtpSetUser()
   call.
   Note:
      The FtpGetResume() function can only be used with an FTP server that
      supports the restart facility.

   Syntax:

   rc = FtpGetResume(localFile,remoteFile<,restartPosition>)

   where:

   localFile
      is the name of the copy on the local host.

   remoteFile
      is the name of the file to be copied from the remote FTP server.

   RestartPosition
      is the number of bytes from where the restart of the remote file must
      begin.

   The return value is an FTP error code.

================================================================

6.7 USERID

New built-in function of Object REXX.

Syntax:

user_id = UserID()

   >>-UserID()----------------------------------------------><

The return value is the active user identification.

================================================================


6.8 The MutableBuffer Class

                    ,-----,-256------,
>>-INIT(-+--------+-+----------------+-)-----------------------><
         '-string-' '-,-buffer size--'

Initialize the buffer, optionally assign content and starting size
for the buffer size. The default is 256; the buffer size will be
increased if an overflow would occur when adding to the buffer.


>>-APPEND(string)----------------------------------------------><

This modifies the buffer's contents by appending the string string
at the end of the buffer's data. The buffer size will be extended
if necessary.



>>-DELETE(n---+---------+--)-----------------------------------><
              '-,length-'

Modifies the buffer's contents by deleting the length characters
beginning at the nth character. If you omit length, or if length is
greater than the number of characters from n to the end of the buffer,
the method deletes the rest of the buffer's contents (including the
nth character). The length must be a positive whole number or zero.
The n must be a positive whole number. If n is greater than the length
of the buffer or zero, the method does not modify the contents of the
buffer.


>>-GETBUFFERSIZE-----------------------------------------------><

Retrieves the current buffer size.


>>-INSERT(new-+-----------------------------------------+--)---><
              '-,--+---+--+--------------------------+--'
                   '-n-'  '-,--+--------+--+------+--'
                               '-length-'  '-,pad-'

Inserts the string new, padded or truncated to length length, into the
mutable buffer after the nth character. The default value for n is 0,
which means insertion at the beginning of the string. If specified, n
and length must be positive whole numbers or zero. If n is greater than
the length of the buffer's contents, the string new is padded at the
beginning. The default value for length is the length of new. If length
is less than the length of the string new, then INSERT truncates new to
length length. The default pad character is a blank.


>>-LENGTH------------------------------------------------------><

Returns length of data in buffer.


>>-OVERLAY(new-+-----------------------------------------+--)--><
               '-,--+---+--+--------------------------+--'
                    '-n-'  '-,--+--------+--+------+--'
                                '-length-'  '-,pad-'

Modifies the buffer's contents by overlaying them, starting at the nth
character, with the string new, padded or truncated to length length.
The overlay can extend beyond the end of the buffer. In this case the
buffer size will be extended as appropriate. If you specify length, it
must be a positive whole number or zero. The default value for length
is the length of new. If n is greater than the length of the buffer's
contents, padding is added before the new string. The default pad
character is a blank, and the default value for n is 1. If you specify
n, it must be a positive whole number.


>>-SETBUFFERSIZE(n)--------------------------------------------><

Sets the buffer size. If n is smaller than the length of the content
of the buffer, the contents are truncated. If n is 0 all contents will
be erased and the new buffer size will be the value given in the INIT
method.


>>-STRING------------------------------------------------------><

Retrieves the content of the buffer (a string).


>>-SUBSTR(n-+--------------------------+--)--------------------><
            '-,--+--------+--+------+--'
                 '-length-'  '-,pad-'

Returns a substring of the buffer's contents that begins at the nth
character and is of length length, padded with pad if necessary. The
n must be a positive whole number.   If  n  is greater than
receiving_string~LENGTH, only pad characters are returned. If you omit
length, the rest of the buffer's contents are returned. The default pad
character is a blank.




7.0 LIST OF REXX UTILITY FUNCTIONS

=================================================================
    This is the list of the Object REXX system utilities.
      They may differ or do not exist on all platforms.
=================================================================
 Function                 | Exists on platforms:  |
  Name:                   | OS/2 | Windows | UNIX | Remarks
--------------------------+------+---------+------+--------------
SysAddFileHandle          | YES  |   YES   | NO   |
SysAddRexxMacro           | YES  |   YES   | YES  |
SysBootDrive              | YES  |   YES   | NO   |
SysClearRexxMacroSpace    | YES  |   YES   | YES  |
SysCloseEventSem          | YES  |   YES   | YES  |
SysCloseMutexSem          | YES  |   YES   | YES  |
SysCls                    | YES  |   YES   | YES  |
SysCopyObject             | YES  |   NO    | NO   |
SysCreateEventSem         | YES  |   YES   | YES  |
SysCreateMutexSem         | YES  |   YES   | YES  |
SysCreateObject           | YES  |   NO    | NO   |
SysCreatePipe             | NO   |   NO    | YES  |
SysCreateShadow           | YES  |   NO    | NO   |
SysCurPos                 | YES  |   YES   | NO   |
SysCurState               | YES  |   YES   | NO   |
SysDeregisterObjectClass  | YES  |   NO    | NO   |
SysDestroyObject          | YES  |   NO    | NO   |
SysDriveInfo              | YES  |   YES   | NO   |
SysDriveMap               | YES  |   YES   | NO   |
SysDropFuncs              | YES  |   YES   | YES  |
SysDropLibrary            | YES  |   YES   | NO   |
SysDropRexxMacro          | YES  |   YES   | YES  |
SysDumpVariables          | YES  |   YES   | YES  |
SysElapsedTime            | YES  |   NO    | NO   |
SysFileDelete             | YES  |   YES   | YES  |
SysFileSearch             | YES  |   YES   | YES  |
SysFileSystemType         | YES  |   YES   | NO   |
SysFileTree               | YES  |   YES   | YES* |
SysFromUnicode            | NO   |   YES   | NO   |
SysToUnicode              | NO   |   YES   | NO   |
SysGetErrortext           | NO   |   YES   | YES**|
SysFork                   | NO   |   NO    | YES  |
SysGetCollate             | YES  |   YES   | NO   |
SysGetEA                  | YES  |   NO    | NO   |
SysGetFileDateTime        | YES  |   YES   | YES  |
SysGetKey                 | YES  |   YES   | YES  |
SysGetMessage             | NO   |   YES   | YES  |
SysGetMessageX            | NO   |   NO    | YES  |
SysGetpid                 | NO   |   NO    | YES+ | use SysQueryProcess instead;
SysIni                    | YES  |   YES   | NO   |
SysLoadFuncs              | YES  |   YES   | YES  |
SysLoadLibrary            | YES  |   YES   | NO   |
SysLoadRexxMacroSpace     | YES  |   YES   | YES  |
SysMapCase                | YES  |   YES   | NO   |
SysMkDir                  | YES  |   YES   | YES  |
SysMoveObject             | YES  |   NO    | NO   |
SysNationalLanguageCompare| YES  |   YES   | NO   |
SysOpenEventSem           | YES  |   YES   | YES  |
SysOpenMutexSem           | YES  |   YES   | YES  |
SysOpenObject             | YES  |   NO    | NO   |
SysPostEventSem           | YES  |   YES   | YES  |
SysProzessType            | YES  |   YES   | NO   |
SysPulseEventSem          | YES  |   YES   | NO   |
SysPutEA                  | YES  |   NO    | NO   |
SysQueryClassList         | YES  |   NO    | NO   |
SysQueryEAList            | YES  |   NO    | NO   |
SysQueryExtLIBPATH        | YES  |   NO    | NO   |
SysQueryProcess           | YES  |   YES   | YES* |
SysQueryProcessCodePage   | YES  |   YES   | NO   |
SysQueryRexxMacro         | YES  |   YES   | YES  |
SysQuerySwitchList        | YES  |   NO    | NO   |
SysRegisterObjectClass    | YES  |   NO    | NO   |
SysReleaseMutexSem        | YES  |   YES   | YES  |
SysReorderRexxMacro       | YES  |   YES   | YES  |
SysRequestMutexSem        | YES  |   YES   | YES  |
SysResetEventSem          | YES  |   YES   | YES  |
SysRmDir                  | YES  |   YES   | YES  |
SysSaveObject             | YES  |   NO    | NO   |
SysSaveRexxMacroSpace     | YES  |   YES   | YES  |
SysSearchPath             | YES  |   YES   | YES  |
SysSetExtLIBPATH          | YES  |   NO    | NO   |
SysSetFileDateTime        | YES  |   YES   | YES  |
SysSetFileHandle          | YES  |   NO    | NO   |
SysSetIcon                | YES  |   NO    | NO   |
SysSetObjectData          | YES  |   NO    | NO   |
SysSetPriority            | YES  |   YES   | NO   |
SysSetProcessCodePage     | YES  |   YES   | NO   |
SysShutDownSystem         | YES  |   YES   | NO   |
SysSleep                  | YES  |   YES   | YES  |
SysStemCopy               | YES  |   YES   | YES  |
SysStemDelete             | YES  |   YES   | YES  |
SysStemInsert             | YES  |   YES   | YES  |
SysStemSort               | YES  |   YES   | YES  |
SysSwitchSession          | YES  |   YES   | NO   |
SysSystemDirectory        | YES  |   NO    | NO   |
SysTempFileName           | YES  |   YES   | YES  |
SysTextScreenRead         | YES  |   YES   | NO   |
SysTextScreenSize         | YES  |   YES   | NO   |
SysUtilVersion            | YES  |   YES   | YES  |
SysVersion                | YES  |   YES   | YES  |
SysVolumeLabel            | YES  |   YES   | NO   |
SysWait                   | NO   |   NO    | YES  |
SysWaitEventSem           | YES  |   YES   | YES  |
SysWaitForShell           | YES  |   NO    | NO   |
SysWaitNamedPipe          | YES  |   YES   | NO   |
SysWinDecryptFile         | NO   |   YES   | NO   |
SysWinEncryptFile         | NO   |   YES   | NO   |
SysWildCard               | YES  |   YES   | NO   |
==========================+======+=========+======+==============
SysOS2Ver                 | YES  |   NO    | NO   | use SysVersion instead;
SysWinVer                 | NO   |   YES   | NO   | use SysVersion instead;
SysLinVer                 | NO   |   NO    | YES++| use SysVersion instead;
=================================================================
     Legend: *  <=> works different;
             ** <=> new function;
             +  <=> AIX only.
             ++ <=> LINUX only.
=================================================================


8.0 CONTACTS

Please address any comments and problem reports via our home
page's problem reporting facility:

     http://www.ibm.com/software/ad/obj-rexx

or by e-mail to:

     rexxhelp@vnet.ibm.com

or by mail to postal address:

   IBM Deutschland Entwicklung GmbH
   REXX Development, Department 7804
   Postbox 1380
   D-71003 Boeblingen
   Germany


9.0 NOTICES

This information was developed for products and services offered
in the U.S.A. IBM may not offer the products,services, or features
discussed in this document in other countries. Consult your local
IBM representative for information on the products and services
currently available in your area. Any reference to an IBM product,
program, or service is not intended to state or imply that only
that IBM product, program, or service may be used. Any functionally
equivalent product, program, or service that does not infringe any
IBM intellectual property right may be used instead. However, it is
the user's responsibility to evaluate and verify the operation of
any non-IBM product, program, or service.

IBM may have patents or pending patent applications covering subject
matter described in this document. The furnishing of this document
does not give you any license to these patents. You can send license
inquiries, in writing, to:
  IBM Director of Licensing
  IBM Corporation
  North Castle Drive
  Armonk, NY 10504-1785
  U.S.A.

For license inquiries regarding double-byte (DBCS) information,
contact the IBM Intellectual Property Department in your country
or send inquiries, in writing, to:
  IBM World Trade Asia Corporation
  Licensing
  2-31 Roppongi 3-chome, Minato-ku
  Tokyo 106, Japan

The following paragraph does not apply to the United Kingdom or any
other country where such provisions are inconsistent with local law:
INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some states do not
allow disclaimer of express orimplied warranties in certain transactions,
therefore, this statement may not apply to you.

This information could include technical inaccuracies or
typographical errors. Changes are periodically made to the information
herein; these changes will be incorporated in new editions of the
publication. IBM may make improvements and/or changes in the product(s)
and/or the program(s) described in this publication at any time without
notice.

Licensees of this program who wish to have information about it for
the purpose of enabling: (i) the exchange of information between
independently created programs and other programs (including this one)
and (ii) the mutual use of the information which has been exchanged,
should contact:

  IBM Deutschland
  Informationssysteme GmbH
  Department 3982
  Pascalstrasse 100
  70569 Stuttgart
  Germany

Such information may be available, subject to appropriate terms and
conditions, including in some cases, payment of a fee.

The licensed program described in this document and all licensed
material available for it are provided by IBM under terms of the
IBM Customer Agreement, IBM International Program License Agreement
or any equivalent agreement between us.

COPYRIGHT LICENSE:

This information contains sample application programs in source
language, which illustrates programming techniques on various
operating platforms. You may copy, modify, and distribute these
sample programs in any form without payment to IBM, for the purposes
of developing, using, marketing or distributing application programs
conforming to the application programming interface for the operating
platform for which the sample programs are written. These examples
have not been thoroughly tested under all conditions. IBM, therefore,
cannot guarantee or imply reliability, serviceability, or function of
these programs. You may copy, modify, and distribute these sample
programs in any form without payment to IBM for the purposes of
developing, using, marketing, or distributing application programs
conforming to IBM's application programming interfaces.


