REXX Tips & Tricks:Miscellaneous

This section contains some further useful information.

Using PMREXX
The syntax for PMREXX is: >>──PMREXX───┬────┬──┬─────────────┬─┬───────────┬─>< ├─/Q─┤ └─rexxprogram─┘ └─parameter─┘ └─/T─┘ Where:
 * /Q:Close PMREXX after the REXX program ends (no "The program has ended" message box)
 * /T:Start PMREXX in trace mode
 * rexxprogram:Name of the rexx program
 * parameter:Parameter for the REXX program

All parameters, except rexxprogram, are optional.

Using PMREXX with the parameter /Q is useful for simple programs which only need to show a PM messagebox (using RxMessageBox). For an example see Saving the Desktop (3.0)

(see Run a REXX program under a specific environment on how to force a program to run under PMREXX)

Please note that you cannot use OS/2 commands that change the environment in a REXX program running under PMREXX. You have to use a similar REXX function for that purpose (e.g. directory instead of CD, VALUE instead of SET, etc.).


 * Warning: The default address environment for a REXX program started via PMREXX in WARP 3 is PMREXX; the default environment in WARP 4 is CMD. Therefore, you cannot distinguish between the environments using ADDRESS in WARP 4!


 * Note:see also PMPopup/2 if you only want to use simple dialog boxes in REXX programs.

The RXQUEUE filter
The purpose of the RXQUEUE filter is to copy the output of an OS/2 program into a REXX queue (The RXQUEUE filter is the external program RXQUEUE.EXE - not the built-in function RXQUEUE!) The syntax for RXQUEUE filter is: >>──RXQUEUE──┬───────────┬──┬────────┬──────>< └─queuename─┘ ├─/FIFO──┤ ├─/LIFO──┤ └─/CLEAR─┘ The RXQUEUE filter usually operates on the default queue named "SESSION". However, if an environment variable named "RXQUEUE" exists, the RXQUEUE value is used for the queue name.

Parameters


 * queuename:This is the name of the queue to use. The queue must already exist. The name of a queue can only contain the following characters: 'A'...'Z', '0'...'9', '.', '!', '?' and '_'. Lowercase letters are converted to uppercase letters.
 * /LIFO:Stacks items from STDIN last in, first out (LIFO) on a REXX queue.
 * /FIFO:Queues items from STDIN first in, first out (FIFO) on a REXX queue.
 * /CLEAR:Removes all lines from a REXX queue.
 * Note: Again, do not confuse the RXQUEUE filter with the RXQUEUE built-in function! Note further that you cannot use the RXQUEUE filter to write a REXX queue to STDOUT - you've to write a REXX program to do this task. (see Write the REXX Queue to STDOUT for an example).

Return code of the function ADDRESS
A REXX program can use the function ADDRESS to detect the current environment. Following is a list of environments I know about (see [Passing parameter to Rexx Dialog programs] and Run a REXX program under a specific environment for examples for using this function.):

ANSI ESC Sequences
ANSI ESC Sequences - also called ANSI commands - are useful for doing some display I/O control in REXX.

To use ANSI commands the OS/2 ANSI support must be active. To activate the ANSI support use the OS/2 command ANSI ON and to deactivate the ANSI support use the OS/2 command ANSI OFF. To get the current status of the ANSI support use the OS/2 command ANSI without a parameter. The default for the ANSI support is ON. (see Check if ANSI is active - 1 - or Check if ANSI is active - 2 - for REXX source to detect if ANSI support is active from within a REXX program)

Each ANSI command begins with the sequence ESC[. where ESC represents the ASCII code 1Bh (= 27 decimal). If there is more than one parameter for an ANSI command, use a semicolon to separate the parameter.

To output ANSI commands you can use the functions LINEOUT and CHAROUT or the statement SAY. Example: say "1B"x || "[30;41m" || "This text is black on red" call lineOut, "1B"x || "[31;40m" || "This text is red on black" call charOut, "1B"x || "[0m" || "This text is in default color" (see Using ANSI sequences for some sample code using ANSI sequences and RxLBox - menu routine in REXX is a menu program using only ANSI sequences to implement the navigation with cursor keys and function keys)


 * Note:To use the ANSI commands to set or get the cursor position you must use the function CHAROUT! (see SysCls for another minor restriction)


 * Further Note:Almost all ANSI Control Characters are documented in the command reference of WARP version 4.

Key Codes for key redefinitions

 * Note:Use the values in parenthesis with care - they may work or may not work.

"Compiling" REXX programs
I don't know of a real REXX compiler for OS/2 REXX. But because the REXX interpreter stores an tokenized copy of each REXX program in the EAs of the program, it is possible to delete the source code from REXX programs (see REXXCC). Another method to "compile" a REXX program is used by the program RxCLS. But this is also no real compiler.

The only method to create a standalone REXX program that runs on any machine with or without REXX installed is to create an EXE containing the REXX program and a static version of a REXX interpreter. This is possible with the package Rexx/Wrapper and the REXX Interpreter Regina from Mark Hessling (see Internet - Web Pages)

To "compile" an Object-Oriented REXX program you can use the program REXXC.EXE which is part of Object-Oriented REXX. REXXC.EXE creates the token image and saves it in a REXX cmd. This method avoids the 64 K limit for the token image. (see also the )

Another method to create a token image of your REXX program is to load the REXX program into the macro space and save the macro space into a file. This will produce a token image of your REXX program that you can reload into the macrospace and execute it from there. This method also avoids the 64 K limit of the EAs. (see REXXCC - a REXX "compiler") In this case you need an additional loader to load the token image into the macro space again before you can execute it.

Or use LoadMac.cmd to create and load the token image: see also Debugging a "compiled" REXX program, Get the source code of a "compiled" REXX program, and Protect the source code of a REXX program

Creating "compiled" programs for Classic REXX and Object REXX
To use a "compiled" program in Classic REXX and in Object REXX you must create a "compiled" version for Classic REXX (created for example with REXXCC) and a "compiled" version for Object REXX (created with REXXC.EXE from Object REXX). Then, to call your "compiled" REXX program you should use a "wrapper" program written in REXX (Do not "compile" the wrapper program!).

The wrapper program might look as follows:

Prevent REXX from creating a token image
Set the read-only attribute of REXX cmds for which the REXX interpreter should not create a token image (or copy them to a read-only disk or to a filesystem not supporting Extended Attributes).

Extend the program REXXTRY.CMD
The program REXXTRY.CMD (in the directory \OS2) is really useful to test some REXX statements. But it has one disadvantage: The input routine is very simple.

But, thanks to Albert Crosby, there's a simple way to overcome this disadvantage. Albert Crosby who's that you might ask. Well, Albert Crosby is the author of a REXX routine called CMDLINE1.CMD which is very suitable to extend the input routine from REXXTRY.CMD

To do this do the following:

Create a copy of the file REXXTRY.CMD and name it EREXXTRY.CMD.

Extract the source code of CMDLINE.CMD from this document (see Using the samples)

Load the file EREXXTRY.CMD into a text editor and append the source of CMDLINE1.CMD at the end of EREXXTRY.CMD.

Then insert the following lines in EREXXTRY.CMD before the line parse arg argrx: Now replace the line parse pull inputrx in EREXXTRY.CMD with Save the file EREXXTRY.CMD.

That's all! You've just created EREXXTRY.CMD - a clone of REXXTRY.CMD with a much more comfortable input routine.

See also: CMDLINE

"Undocumented" REXX functions
The following REXX functions to work with DBCS mixed Strings are only documented in the IBM: OS/2 2.0 Procedures Language/2 Reference Manual and in the Object-Oriented REXX online documentation: Well, for the "normal" REXX programmer only two of these functions are interesting (The functions also work with SBCS strings):
 * DBADJUST
 * DBBRACKET
 * DBCENTER
 * DBLEFT
 * DBRIGHT
 * DBRLEFT
 * DBRRIGHT
 * DBTODBCS
 * DBTOSBCS
 * DBUNBRACKET
 * DBVALIDATE
 * DBWIDTH

Name      DBRLEFT( string, n {,option} ) Function  Delete n chars beginning with the first char Example   DBRLEFT( "ABCDEFG", 2 ) gives "CDEFG" Note      The parameter option is only needed for DBCS strings)            For SBCS strings you should not use this parameter.

Name      DBRRIGHT( string, n {,option} ) Function  Delete n chars beginning with the last char Example   DBRRIGHT( "ABCDEFG", 3 ) gives "ABCD" Note      The parameter option is only needed for DBCS strings)            For SBCS strings you should not use this parameter.

REXX ANSI Standard
There's now an ANSI standard for REXX. The REXX Standard number is X3.274. You can get a copy of the Standard from the ANSI at:
 * American National Standards Institute Attn: Customer Service 11 West 42nd Street New York, NY 10036 Phone: +1 212 642 4900 Fax: +1 212 302 1286 (see Internet - Web Pages)

The document costs $125 (+S&H). A cheaper way for retrieving a copy of the standard is:

Download the pre-publication PostScript draft version of the standard from Mike Cowlishaw's REXX home page (see Internet - Web Pages). This version is functional identical to the ANSI version.


 * History

"Since 1991, a technical committee has been preparing a document for a proposed American National Standard (ANSI Standard) for REXX. Here is the committee's charter:

The project is for development of an American National Standard. The scope of this standard will be 'The REXX Language' described by Michael F. Cowlishaw in his book, altered as necessary to promote portability, reliability, maintainability and efficient execution of REXX programs on a variety of computing systems."

The X3J18 committee has been operationg under the procedures of the American National Standards Institute (ANSI); the addresses of the Chairman, Vice-Chairman, and Secretary are as follows:
 * Chairman:B L Marks IBM UK Laboratories Hursley Park Winchester, England SO21 2JN
 * Vice-chairman:N F N Milsted IX Corporation 575 W. Madison, Suite 3610 Chicago, IL 60661
 * Secretary:E Spire The Workstation Group 6300 River Road Rosemont, IL 60018