`CLCLRGVAR       CALCULATE LARGE VARIABLE               TAACLUB`
```
The Calculate Large Variable  command allows CL to work  with character
variables that  exceed 15 bytes in length and  contain up to 30 digits.
Simple  operations  of Add,  Sub, Multiply,  and Divide  are supported.
Any values  placed  in  the Factors  are  right  aligned.   The  return
result must  be specified  as *CHAR LEN(30)  and will be  right aligned
by  default with  leading blanks.   A return  value exists  for a minus
sign.

Some system  functions  now  return  large  size  variables  containing
decimal  values that  exceed the  largest size  that CL  supports as  a
*DEC  type which is  15 digits.   CLCLRGVAR allows operations  on these
large variables.

Either or both  factors may contain  a leading or  trailing minus  sign
(but both  may not  be in  the same  factor).   CLCLRGVAR right  aligns
both factors.   Leading blanks  are treated as zeros  (including an all
blank  value).   No embedded  characters of  blank or minus  may exist.
No decimal  point  may exist.    The result  field can  hold  up to  30
digits.

A typical series of commands would be:

DCL       &FACTOR1 *CHAR LEN(31)
DCL       &FACTOR2 *CHAR LEN(31)
DCL       &RESULT *CHAR LEN(30)
.
CHGVAR    &FACTOR1 nnn
CHGVAR    &FACTOR2 nnn
RESULT(&RESULT)

The factor values  would be right adjusted and  ensured to contain only
valid  digits.  A leading  or trailing minus would  indicate a negative
value.

If a negative result exists, the SIGN return variable will be '-'.

If OPER(*DIV)  is  used,  the  optional  return  variable  REMNDR  will
contain the remainder.

Factor examples (b = blank)
---------------------------

Valid             Invalid      Invalid reason
-----             -------      --------------

3bbbbb              2b1         Embedded blank
23-bbbb              2A3         Non digit
-2323bbb              -2-         Multiple minus signs
4              -bb23       Embedded blanks
4-              1.23        Decimal point
bbbbb              000-4       Embedded minus
-       Only a minus sign

Decimal overflow
----------------

No check is  made for a decimal  overflow.  If it  occurs, the overflow
is  truncated.   You must  ensure that  your values  will not  cause an
overflow.

CLCLRGVAR escape messages you can monitor for
---------------------------------------------

TAA9891    An attempt to divide by 0

Escape messages from based on functions will be re-sent.

CLCLRGVAR Command parameters                          *CMD
----------------------------

OPER          The operation to be performed.

*SUB     Subtracts Factor 2 from Factor 1
*MULT    Multiplies Factor 1 by Factor 2
*DIV     Divides Factor 1 by Factor 2
See optional REMNDR parameter also

FACTOR1       The Factor  1 value.   It  must be  declared as  *CHAR
LEN(31), but cannot  contain more than 30 digits.   It
or  trailing minus sign.   The value  is right aligned
before performing any  calculations.  Embedded  blanks
are not valid nor is a decimal notation.

FACTOR2       The  Factor 2  value.   It must  be declared  as *CHAR
LEN(31),  but cannot contain more than  30 digits.  It
or trailing  minus sign.   The value is  right aligned
before  performing any calculations.   Embedded blanks
are not valid nor is a decimal notation.

RESULT        The Result of  the calculation.   This  is a  required
return  variable  that  must  be   declared  as  *CHAR
LEN(30).     The  value  will  be   right  aligned  by
default,  preceded by leading  blanks, and will always
be positive.   Negative  values are  indicated in  the
SIGN  return parameter.   If the  result is  zero, one
zero will be returned.

ALIGNRES      Whether  to align the  result to the left  or right in
the RESULT  return variable.   *RIGHT  is the  default
to align  to the  right.   *LEFT may  be specified  to
align to the left.

SIGN          An  optional  return variable  that  will  contain the
sign  of  the  result  (and  the  remainder  if  any).
Either  blank  (plus)   or  '-'  for  minus   will  be
returned.     If  specified,  the   variable  must  be
declared as *CHAR LEN(1).

REMNDR        An  optional  return  variable that  will  contain the
remainder if  OPER(*DIV)  is used.    If the  OPER  is
other  than  *DIV,  blanks   will  be  returned.    If
specified,  the  variable must  be  declared  as *CHAR
LEN(30).

The value is  right aligned with  leading blanks.   If
a divide  produces a 0 remainder,  a single 0  will be

Note  that the  value will  always be  plus.   Use the
SIGN return variable to determine the true sign.

Restrictions
------------

Because CLCLRGVAR returns  values, the command  may only be  used in  a
CL like program.

No check is  made for a decimal overflow.   If it occurs,  the overflow
is  truncated.   You must  ensure that  your values  will not  cause an
overflow.

Prerequisites
-------------

The following TAA Tools must be on your system:

SNDESCINF       Send escape information
SNDESCMSG       Send escape message

Implementation
--------------

None, the tool is ready to use.

Objects used by the tool
------------------------

Object        Type    Attribute      Src member    Src file
------        ----    ---------      ----------    ----------

CLCLRGVAR     *CMD                   TAACLUB       QATTCMD
TAACLUBC      *PGM       CLP         TAACLUBC      QATTCL
TAACLUBR      *PGM       RPG         TAACLUBR      QATTCL
```

Added to TAA Productivity tools January 15, 2013