Readme File for IBM Object REXX for Windows
Interpreter Edition Version 2.1.2 Update



CONTENTS

1.0 ABOUT THIS README FILE

2.0 INSTALLATION
2.1 Running Installation Silently

3.0 CHANGES SINCE VERSION 2.1.1
3.1 New features
3.1.1 New MutableBuffer Clas
3.1.2 New Built-In Function USERID
3.1.3 Enhanced REXXRT utility
3.1.4 New FTP Function FtpGetResume

4.0 SUPPORT AND ADDITIONAL INFORMATION



1.0 ABOUT THIS README FILE

This installation package updates an installed Object REXX for Windows
Interpreter Edition Version 2.1 or Version 2.1.1 to Version 2.1.2 For
additional information please refer to the readme file for version 2.1
and the information to the update version 2.1.1 below.



2.0 INSTALLATION

To install this update, the Object REXX Interpreter Edition Version 2.1
or 2.1.1 must be installed. Download the file orxi212uzip.exe, double-click
it from the Windows Explorer, select a temporary target directory, and
select the Extract button. Double-click on the extracted file
orxi212u.exe and follow the installation instructions.

The Object REXX Runtime and Development Edition Update is available as a
separate package.

Under certain circumstances the installation might terminate at the
beginning. If this happens, perform an "Administrative Install".
Start the Setupxx.exe with parameter /A. This unpacks the
"IBM Object REXX for Windows ....2.1.2.msi" and other files to the
selected directory. Change to this directory and select the ".msi" file
with the right mouse button and select Install.

An additional problem might occur if an older version of the Microsoft
Software Installer is installed on the target system. If this happens,
download and install the newest version from the Microsoft internet site
http://www.microsoft.com/downloads/


2.1 Running Installation Silently

These are the possible arguments for the installation routine. Note that
all parameters are case-sensitive.

/S
Do not display the setup.exe progress bar.

/V  ( / V without blank between )
Parameters following this flag are passed to the installation program.
If more than one argument is used, all arguments must be enclosed within
quotation marks. If quotation marks are used inside these quotation marks,
they must preceded by a \.  (i.e.  \"firstArgument SecondArgument\" )

/QN
Run Microsoft Software Installer in silent mode also.

/S /V/QN

Run silent installation.

INSTALLDIR=
Specifies the installation drive and directory. If the path includes
blanks, it must be enclosed within quotation marks.

SETUP /S /V"/QN INSTALLDIR=\"c:\My Programs\ObjREXX\""

Installs all Object REXX features in the directory c:\My Programs\ObjREXX\

ADDLOCAL=
Specifies the features to be installed, separated by commas.
Available features:
	ApplicationFiles
	SocketAndFTPFiles


SETUP /S /V"/QN INSTALLDIR=c:\ObjREXX\ ADDLOCAL=ApplicationFiles"

Installs only the Object REXX application files in the directory
c:\objrexx\.

ALLUSERS=
Specifies if Object REXX should be installed for all users or for the
current user. If set to 1, Object REXX is installed for all users; if
omitted it is installed for the current user.

SETUP /S /V"/QN INSTALLDIR=c:\ObjREXX\ ADDLOCAL=ApplicationFiles ALLUSERS=1"

Installs only the Object REXX application files in the directory
c:\objrexx\, for all users.



3.0 CHANGES SINCE VERSION 2.1.1

In addition to bug fixes this version has some new features. This
section describes the enhanced and the new features.

3.1 New features

3.1.1 New MutableBuffer Class

The MutableBuffer class is a buffer that contains a string on which
certain string operations such as concatenation can be performed very
efficiently. (Frequent concatenation of long strings without using this
class might result in weak performance, large memory allocation, or both.)

Methods available to the MutableBuffer class:

Init
Append
Delete
GetBufferSize
Insert
Length
Overlay
SetBufferSize
String
Substr


Init
                    ,-----,-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 is increased if an
overflow occurs when adding to the buffer.


Append

>>-Append(string)----------------------------------------------------><

This modifies the buffer content by appending the string string. The
buffer size is extended if necessary.


Delete

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

Modifies the buffer content by deleting length characters, beginning at
the n'th 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 content (including the n'th character). The length must be a
positive integer, or zero. The n must be a positive integer. If n is
greater than the length of the buffer or zero, the method does not modify the
contents of the buffer.


GetBufferSize

>>-GetBufferSize-----------------------------------------------------><

Retrieves the current buffer size.


Insert

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

Inserts the string new, padded or truncated to length length, into the mutable
buffer after the n'th 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 integers or zeros. If n is greater than the length of the buffer
content, 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

>>-Length------------------------------------------------------------><

Returns length of data in buffer.


Overlay

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

Modifies the buffer content by overlaying it, starting at the n'th
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
is extended as appropriate. If you specify length, it must be a positive
integer or zero. The default value for length is the length of new. If n
is greater than the length of the buffer content, 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 integer.


SetBufferSize

>>-SetBufferSize(n)--------------------------------------------------><

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

String

>>-String------------------------------------------------------------><

Retrieves the content of the buffer (a string).


Substr

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

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

3.1.2 New Built-In Function USERID

The Userid build-in function retrieves the user name of the user currently
logged on to the system.

Example:

say USERID()    ->    'ARTHUR' /* Maybe */


3.1.3 Enhanced REXXRT utility

The REXXRT utility now supports more conversion parameters.

Usage: rexxrt /1|/2|/3|/4|/5 oldfile newfile

options: /1 tokenize from V1.0.3 to V2.1   format
         /2 tokenize from V2.1   to V1.0.3 format
         /3 tokenize from V2.1.1 to V2.1.2 format
         /4 tokenize from V2.1.2 to V2.1.1 format
         /5 tokenize from V2.1.2 to V2.1.1 format

Note: Retokenizing to a previous version is not recommended. Instad, use an
appropriate version to run the script.


3.1.4 New FTP Function FtpGetResume

New function 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.

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 (optional)
     is the number of bytes from where the restart of the remote file
     must begin.

     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 return value is an FTP error code.

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.



4.0 SUPPORT AND ADDITIONAL INFORMATION

Report any problems relating to IBM Object REXX via the Internet page
http://www.ibm.com/software/ad/obj-rexx/support.html

See the Object REXX home page http://www.ibm.com/software/ad/obj-rexx/
for information about news, features, function packages, tutorials, books,
and so on.

Microsoft, Windows, Windows NT, and the Windows logo are trademarks of
Microsoft Corporation in the United States, other countries, or both.








===========================================
Readme file for IBM Object REXX for Windows
Interpreter Edition Version 2.1.1 Update
===========================================


CONTENTS

1.0 ABOUT THIS README FILE

2.0 INSTALLATION
2.1 Running Installation Silently

3.0 CHANGES SINCE VERSION 2.1
3.1 New features
3.1.1 New RegularExpressions Class
3.1.2 Additions to the REXXUTIL function package
3.1.3 Windows Script Host (WSH) extensions
3.1.4 Support for Microsoft Internet Explorer Security Manager
3.1.5 RXAPI.EXE as a service
3.1.6 Utility to terminate REXX
3.1.7 REXXRT to pre-2.1 format
3.1.8 New method for WindowsProgramManager class
3.1.9 MakeArray method for String Class
3.1.10 MakeArray method for WindowsClipboard Class
3.1.11 Modified NEW method of method class
3.1.12 Modified SETMETHOD method of Object Class

4.0 SUPPORT AND ADDITIONAL INFORMATION

5.0 NOTICES
5.1 Trademarks and service marks



1.0 ABOUT THIS README FILE

This installation package updates an installed Object REXX for
Windows Interpreter Edition Version 2.1 to Version 2.1.1. For
additional information please refer to the README file for
version 2.1.



2.0 INSTALLATION

To install this update, the Object REXX Interpreter Edition Version
2.1 must be installed. Download the ORXI211UZIP.EXE file, double-click
it from Windows Explorer, select a temporary target directory and
click Extract. Double-click on the extracted file ORXI211U.EXE and
follow the installation instructions.

Under certain circumstances the installation might terminate at the
beginning. If this happens, perform an "Administrative Install".
Start the ORXI211U.EXE with parameter /A. This unpacks the "IBM
Object REXX for Windows ....2.1.1.msi" and other files to the
selected directory. Change to this directory and select the ".msi"
file with the right mouse button and select Install.

Another problem might occur if an older version of the Microsoft
Software Installer is installed on the target system. If this happens,
download and install the newest version from the Microsoft internet
site http://www.microsoft.com/downloads/


2.1 Running Installation Silently

These are the possible arguments for the installation routine. Note
that all parameters are case-sensitive.

/S
Do not display the SETUP.EXE progress bar.

/V
Parameters immediately following this flag are passed to the
installation program. If more than one argument is used, all
arguments must be enclosed within quotation marks. If quotation
marks are used inside this quotation marks, they must preceded
with an \ (for example \"firstArgument secondArgument\" ).

/QN
Run Microsoft Software Installer in silent mode also.

/S /V/QN
Run silent installation.

INSTALLDIR=
Specifies the installation drive and directory. If the path includes
blanks, it must be enclosed within quotation marks.

SETUP /S /V"/QN INSTALLDIR=\"c:\My Programs\ObjREXX\""
Installs all Object REXX features in the directory
c:\My Programs\ObjREXX\

ADDLOCAL=
Specifies the features to be installed, separated by commas.
Available features:
	ApplicationFiles
	SocketAndFTPFiles

SETUP /S /V"/QN INSTALLDIR=c:\ObjREXX\ ADDLOCAL=ApplicationFiles"
Installs only the Object REXX application files in the directory
c:\objrexx\

ALLUSERS=
Specifies whether Object REXX should be installed for all or the
current user only. If set to 1, Object REXX is installed for all
users. If omitted, it is installed for the current user.

SETUP /S /V"/QN INSTALLDIR=c:\ObjREXX\ ADDLOCAL=ApplicationFiles ALLUSERS=1"
Installs only the Object REXX application files in the directory
c:\objrexx\, for all users.



3.0 CHANGES SINCE VERSION 2.1

This version provides improved processing speed for stem operations
and several new and improved features.


3.1 New features

3.1.1 New RegularExpressions Class

This class provides support for regular expressions. A regular
expression is a pattern you can use to match strings.

Here is a description of the syntax:

|    OR operator between the left and right expression
?    Matches any single character
*    Matches the previous expression zero or more times
+    Matches the previous expression one or more times
\    "Escape" symbol: use the next character literally
()   Expression in parenthesis (use where needed)
{n}  Matches previous expression n times (n>1)
[]   Set definition: matches any single character out of the defined
     set.
     A '^' right after the opening bracket means that none of the
     following characters should be matched.
     A '-' (if not used with '\') defines a range between the last
     specified character and the one following '-'. If it is the
     first character in the set definition, it is used literally.

The following symbolic names (all starting and ending with ':') can
be used to abbreviate common sets:

:ALPHA:        Characters in the range A-Z and a-z
:LOWER:        Characters in the range a-z
:UPPER:        Characters in the range A-Z
:DIGIT:        Characters in the range 0-9
:ALNUM:        Characters in :DIGIT: and :ALPHA:
:XDIGIT:       Characters in :DIGIT:, A-F and a-f
:BLANK:        Space and tab characters
:SPACE:        Characters '09'x to '0D'x and space
:CNTRL:        Characters '00'x to '1F'x and '7F'x
:PRINT:        Characters in the range '20'x to '7E'x
:GRAPH:        Characters in :PRINT: without space
:PUNCT:        All :PRINT: characters without space and not
               in :ALNUM:

Examples:

     "(Hi|Hello) World"      Matches "Hi World" and
                             "Hello World".
     "file.???"              Matches any file with three
                             characters after '.'
     "file.?{3}"             Same as above.
     "a *b"                  Matches all strings that begin with
                             'a' and end with 'b' and have an
                             arbitrary number of spaces in between
                             both.
     "a +b"                  Same as above, but at least one space
                             must be present.
     "file.[bd]at"           Matches "file.bat" and "file.dat".
     "[A-Za-z]+"             Matches any string containing only
                             letters.
     "[:ALPHA:]+"            Same as above, using symbolic names.
     "[^0-9]*"               Matches any string containing no
                             numbers, including the empty string.
     "[:DIGIT::LOWER:]"      A single character, either a digit or
                             a lower case character.
     "This is (very )+nice." Matches all strings with one or more
                             occurrences of "very " between
                             "This is " and "nice.".

The RegularExpression class is not a built-in class. It is defined
in the RXREGEXP.CLS file. This means, you must use a
::requires statement to activate its functionality, as follows:

::requires "RXREGEXP.CLS"


Methods available to the RegularExpression class:

Init
Match
Parse
Pos
Position


Init

                     +-,-"MAXIMAL"--+
>>-Init(-+---------+-+--------------+-)------------------------------><
         '-Pattern-' +-,-"MINIMAL"--+

Instantiates a RegularExpression object. The optional parameter 'Pattern'
lets you define a pattern that will be used to match strings. See the
introductory text below for a description of the syntax. If the strings
match, you can decide whether you want "greedy" matching (a maximum-length
match) or "non-greedy" matching (a minimum-length match).

Examples:

     myRE1 = .RegularExpression~new
     myRE2 = .RegularExpression~new("Hello?*")


Match

>>-Match(-String-)---------------------------------------------------><

This method tries to match the given string to the regular expression
that was defined on the "new" invocation or on the "parse" invocation.
It returns 0 on an unsuccessful match and 1 on a successful match.
For an example see "Parse".


Parse

                  +-,-"CURRENT"--+
>>-Parse(-Pattern-+--------------+-----------------------------------><
                  +-,-"MAXIMAL"--+
                  +-,-"MINIMAL"--+

This method creates the automation used to match a string from the
regular expression specified with 'Pattern'. The RegularExpression
object uses this regular expression until a new invocation of Parse
takes place. The second (optional) parameter specifies whether to
use minimal or maximal matching. The default is to use the current
matching behaviour.

Return values:

0    Regular expression was parsed successfully.
1    An unexpected symbol was met during parsing.
2    A missing ')' was found.
3    An illegal set was defined.
4    The regular expression ended unexpectedly.
5    An illegal number was specified.


Example 1:

     a.0 = "does not match regular expression"
     a.1 = "matches regular expression"
     b = .array~of("This is a nice flower.",
                   "This is a yellow flower.",,
                   "This is a blue flower.",
                   "Hi there!")

     myRE = .RegularExpression~new
     e = myRE~parse("This is a ???? flower.")
     if e == 0 then do
       do i over b
         j = myRE~match(i)
         say i~left(24) ">>" a.j
       end
     end
     else
       say "Error" e "occured!"
     exit

     ::requires "rxregexp.cls"

Output:

This is a nice flower.   >> Does match regular expression
This is a yellow flower. >> Does not match regular expression
This is a blue flower.   >> Does match regular expression
Hi there!                >> Does not match regular expression

Example 2:

     a.0 = "an invalid number!"
     a.1 = "a valid number."
     b = .array~of("1","42","0","5436412","1a","f43g")
     myRE = .RegularExpression~new("[1-9][0-9]*")
     do i over b
       j = myRE~match(i)
       say i "is" a.j
     end
     say

     /* Now allow "hex" numbers and a single 0 */
     if myRE~parse("0|([1-9a-f][0-9a-f]*)") == 0 then do
       do i over b
         j = myRE~match(i)
         say i "is" a.j
       end
     end
     else
       say "invalid regular expression!"

     exit

     ::requires "rxregexp.cls"

Example 3:

     str = "<p>Paragraph 1</p><p>Paragraph 2</p>"
     myRE1 = .RegularExpression~new("<p>?*</p>","MINIMAL")
     myRE1~match(str)
     myRE2 = .RegularExpression~new("<p>?*</p>","MAXIMAL")
     myRE2~match(str)

     say "myRE1 (minimal) matched" str~substr(1,myRE1~position)
     say "myRE2 (maximal) matched" str~substr(1,myRE2~position)

     ::requires "rxregexp.cls"

Output:

myRE1 (minimal) matched <p>Paragraph 1</p>
myRE2 (maximal) matched <p>Paragraph 1</p><p>Paragraph 2</p>



Pos

>>-Pos-(-Haystack-)--------------------------------------------------><

This method tries to locate a string defined by the regular expression
on the "new" invocation or on the "parse" invocation in the given
haystack string. It returns 0 on an unsuccessful match or the starting
position on a successful match. The end position of the match can be
retrieved with the POSITION method.

Example:

     str = "It is the year 2002!"
     myRE = .RegularExpression~new("[1-9][0-9]*")
     begin = myRE~pos(str)
     if begin > 0 then do
       year = str~substr(begin, myRE~position - begin + 1)
       say "Found the number" year "in this sentence."
     end

     ::requires "rxregexp.cls"

Output:

Found the number 2002 in this sentence.


Position

>>-Position----------------------------------------------------------><

Returns the character position at which either Parse, Pos or Match
ended, depending on what was invoked last.

Example:

     myRE = .RegularExpression~new
     myRE~Parse("[abc")                    -- illegal set definition
     say myRE~Position                     -- will be 4

     myRE = .RegularExpression~new("[abc]12")
     myRE~Match("c12")
     say myRE~Position                     -- will be 3

     myRE~Match("a13")
     say myRE~Position                     -- will be 2 (failure to match)

     ::requires "rxregexp.cls"


3.1.2 Additions to the REXXUTIL function package

Printer access functions

There are three new functions in the REXXUTIL function package for
Windows:

SysWinGetPrinters       - get a list of available printers
SysWinGetDefaultPrinter - get default printer
SysWinSetDefaultPrinter - set default printer


SysWinGetPrinters

>>--SysWinGetPrinters(stem.)-----------------------------------------><

Fills a stem with the available printer descriptions.

stem.0 - number of entries
stem.i - entry

Each entry is of the form "Printername, Drivername, Portname".

Returns:

0 - success
1 - failure


SysWinGetDefaultPrinter

>>--SysWinGetDefaultPrinter------------------------------------------><

Returns the current default printer in the form
"Printername,Drivername,Portname".


SysWinSetDefaultPrinter

>>--SysWinSetDefaultPrinter(description)-----------------------------><

Sets the default printer. The description must have the form
"Printername,Drivername,Portname".

Returns:

0        - Success
non-zero - System error codes. Use SysGetErrorText() to get a
           description of the error.


Sample program:

     /* set default printer */

     default = SysWinGetDefaultPrinter()
     parse var default default",".

     if SysWinGetPrinters(list.) == 0 then do
       say "List of available printers (* = default):"
       do i=1 to list.0
         parse var list.i pname",".
         if pname == default then
           say i list.i "*"
         else
           say i list.i
       end
       say
       say "Please enter number of new default printer (0 = keep default)"
       pull i
       if i > 0 then call SysWinSetDefaultPrinter(list.i)
     end

     exit


3.1.3 Windows Script Host (WSH) extensions

A selector called "WSHENGINE" was added to the VALUE function when
a REXX script is run in a WSH scripting context (running via
cscript, wscript or as embedded code in HTML for the Microsoft
Internet Explorer). The only currently supported value is
"NAMEDITEMS". Calling VALUE with these parameters returns an array
with the names of the named items that were added at script start.

Example: 	

     myArray = VALUE("NAMEDITEMS",,"WSHENGINE")

The value NAMEDITEMS is read-only, writing to it is prohibited.

Object REXX scripts running via the scripting engine (in WSH
context) can now call the default method of an object as a function
call with the object name.

Example:

The SESSION object of ASP (Active Server Pages) has the default
method VALUE. The usual (and recommended) way of using the SESSION
object is to use

SESSION~VALUE("key","value").

Because VALUE is the default method, a function call

SESSION("key","value")
SESSION~VALUE("key","value").

causes an invocation of VALUE with the given arguments. For
objects that have the name of any REXX function, an explicit call
to the default method must be made, because REXX functions have
priority over this implicit method invocation mechanism.


3.1.4 Support for Microsoft Internet Explorer Security Manager

Support for Microsoft Internet Explorer Security Manager was
implemented, removing the warning message that popped up if Object
REXX was embedded in HTML.


3.1.5 RXAPI.EXE as a service

The RXAPI.EXE normally runs in the background as a WIN32 application
without a window. It has no user interactions.

To run it as a service, it must be registered/deregistered with the
service manager. The RXAPI.EXE now supports the following parameters:

/i 			: Install and register RXAPI.EXE as service,
                          but do not start the service.
/u 			: Deinstall and deregister RXAPI.EXE as service.
/v			: Show the version number and whether it is
                          registered as service.
any other parameter 	: Gives a short help message about the
                          possible parameters.
no parameter 		: Verify if is registered as a service, and
                          start as service or regularly.

If started with a parameter, the action and the result are shown in
a message box.After registration, the RXAPI.EXE can be started as a
service using the Windows Services dialog box.


3.1.6 Utility to terminate REXX

The REXXTERMINATE.EXE utility can be used to terminate REXX.EXE and
RXAPI.EXE. Use it carefully because any running REXX script might hang
immediately!


3.1.7 REXXRT to pre-2.1 format

The re-tokenizer now allows to convert to pre-2.1 format as well.

Usage: rexxrt [/1|/2] oldfile newfile

options: /1 tokenize to pre-2.1 format
         /2 tokenize to 2.1 format (default)


3.1.8 New method for WindowsProgramManager class

                                +-"PERSONAL"-+
DeleteDesktopIcon--(--name--,---+------------+-)
                                +-"COMMON"---+

Deletes a shortcut from the Windows desktop that was previously
created with AddDesktopIcon.

The arguments are:

name 	: The name of the shortcut to be deleted.

location: Either of the following locations:

          "PERSONAL"
          The shortcut was previously created with AddDesktopIcon
          and the location option "PERSONAL". This is the default.

          "COMMON"
          The shortcut was previously created with AddDesktopIcon
          and the location option "COMMON".

Return codes:

0  Shortcut deleted successfully.
2  Shortcut not found.
3  Path to shortcut not found.
5  Access denied or busy.
26 Not a DOS disk.
32 Sharing violation.
36 Sharing buffer exceeded.
87 Does not exist.
206 Shortcut name exceeds range error.

Note: Return code 2 is also returned if a "PERSONAL" should be
deleted that was previously created with "COMMON", and vice versa.


Example:

     pm = .WindowsProgramManager~new
     if pm~InitCode \= 0 then exit

     rc = pm~DeleteDesktopIcon("MyNotepad1","%SystemRoot%\system32\notepad.exe")
     if rc \= 0 then do
       say "Error deleting shortcut: My Notepad 1"
       exit
     end

     exit

     ::requires "winsystm.cls"


3.1.9 MakeArray method for String Class

>>-MAKEARRAY(-+-----------+-)----------------------------------------><
              '-Separator-'

This method returns an array of strings containing the single lines
that were separated using the separator character. The default separator
is the newline character.

Example:

     nl = '0d0a'x
     string = "hello"nl"world"nl"this is an array."
     array = string~makearray
     say "the second line is:" array[2]

     string = "hello*world*this is an array."
     array = string~makearray('*')
     say "the third line is:" array[3]	


3.1.10 MakeArray method for WindowsClipboard Class

>>-MAKEARRAY---------------------------------------------------------><

If the content of the clipboard is a string with newline characters
in it, makeArray can be used to split up the string into individual
lines. An array is returned containing those lines.


3.1.11 Modified NEW method of method class

Another parameter was added to the NEW method of the Method class:

>>-NEW(name,source--+-----------------+------------------------------><
                    +--,methodobject--+

The third parameter influences the scope of the method. If none is
given, the program scope is used. If another method object is given,
its scope is used.


3.1.12 Modified SETMETHOD method of Object Class

A third parameter was added to the SETMETHOD method of the Object class:

                                      +-"FLOAT"--+
>>-SETMETHOD(methodname-+----,----+-,-+----------+--)----------------><
                        '-,method-'   '-"OBJECT"-'

This parameter describes if the method that is attached to an object
should have object or float scope. "Float" scope means that it shares
the same scope with methods that were defined outside of a class.
"Object" scope means it shares the scope with other, potentially
statically defined, methods of the object it is attached to.



4.0 SUPPORT AND ADDITIONAL INFORMATION

Report any problems relating to IBM Object REXX via the Internet page
http://www.ibm.com/software/ad/obj-rexx/support.html

See the Object REXX home page http://www.ibm.com/software/ad/obj-rexx/
for information about news, features, function packages, tutorials,
books, and so on.



5.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 or implied 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.


5.1 Trademarks and service marks

Microsoft, Windows, Windows NT, and the Windows logo are trademarks
of Microsoft Corporation in the United States, other countries, or both.