8.1.4.1 The RXSTRING structure

The SAA API interface uses Rexx string which are stored in the
structure RXSTRING. There is also a datatype PRXSTRING, which is a
pointer to RXSTRING. Their definitions are:

     typedef struct {
           unsigned char *strptr ;    /* Pointer to string
     contents */
           unsigned long strlength ;  /* Length of string */
     } RXSTRING ;

     typedef RXSTRING *PRXSTRING ;

The strptr field is a pointer to an array of characters making up
the contents of the Rexx string', while strlength holds the number
of characters in that array.

Unfortunately, there are some inconsistencies in naming of various
special kinds of strings. In REXX (TRL), a ``null string'' is a
string that has zero length. On the other hand, the SAA API
operates with two kinds of special strings: null strings and zero
length strings. The latter is a string with zero length (equals
null strings in REXX), while the former is a sort of  undefined or
empty string, which denotes a string without a value. The null
strings of SAA API are used to denote unspecified values (e.g. a
parameter left out in a subroutine call). In this chapter, when
the terms null strings and zero length strings are italicized,
they refer to the SAA API style meaning.

A number of macros are defined, which simplifies operations on
RXSTRINGs for the programmer. In the list below, all parameters
called x are of type RXSTRING.

·    MAKERXSTRING(x,content,length)]
     The parameter content must be a pointer to char, while length
     is integer. The x parameter will be set to the contents and
     length supplied. The only operations are assignments;  no new
     space is allocated and the contents of the string is not
     copied.
·    RXNULLSTRING(x)]
     Returns true only if x is a null string.
     i.e.  x.strptr is NULL.
·    RXSTRLEN(x)]
     Returns the length of the string x as an unsigned long. Zero
     is returned both when x is a null string or a zero  length
     string.
·    RXSTRPTR(x)]
     Returns a pointer to the first character in the string x, or
     NULL if x is a null string. If x is a zero length string, and
     non-NULL pointer is returned.
·    RXVALIDSTRING(x)]
     Returns true only if x is neither a null string nor a  zero
     length string
     i.e. x must have non-empty contents.
·    RXZEROLENSTRING(x)]
     Returns true only if x is a zero length string.
     i.e.  x.strptr is non-NULL, and  x.strlength is  zero.

These definitions are most likely to be defined as preprocessor
macros, so you should never call  them with parameters  having any
side effects. Also note that at least MAKERXSTRING() is likely to
be implemented as two statements, and might not work properly if
following
e.g. an if statement. Check the actual definitions in the
rexxsaa.h header file before using them in a fancy context.

One definition of these might be (don't rely on this to be the
case with your implementation):

      #define MAKERXSTRING(x,c,l)
     ((x).strptr=(c),(x).strlength=(l))
      #define RXNULLSTRING(x)     (!(x).strptr)
      #define RXSTRLEN(x)         ((x).strptr ? (x).strlength :
     0UL)
      #define RXSTRPTR(x)         ((x).strptr)
      #define RXVALIDSTRING(x)    ((x).strptr && (x).strlength)
      #define RXZEROLENSTRING(x)  ((x).strptr && !(x).strlength)

Note that these definitions of strings differ from the normal
definition in C programs; where a string is an array of
characters, and its length is implicitly given by a terminating
ASCII NUL character. In the  RXSTRING definition, a string can
contain any character, including an ASCII NUL, and the length is
explicitly given.


PREV NEXT