EXTOL RPG Program: QUOTESTR

EXTOL RPG - External Call QUOTESTR - Place Quotes Around String

     H/TITLE Place Quotes around string; qual=qoute chars left,right
     H            Y
     Z* CRTRPGPGM
     Z* OPTION(*NOXREF) GENOPT(*OPTIMIZE)
      *
     W* Warning: This program does not set on the LR indicator
      *
      * This program will put quotation marks around the non-blank
      * portion of the input parameter, and pass the result to the output.
      *
      * It may be used in either incoming or outgoing translation.
      *
      * The input string is searched for the first and last
      * non-blank characters. The output consists of a "left quote",
      * followed by the non-blank portion of the input string, followed
      * by a "right quote". The quote characters may be user-specified;
      * they both default to ".
      *
      *  Different left and right characters are allowed for.
      *  The default characters are specified in the constants
      *  LQD and RQD defined below.
      *
      *  The qualifier input may be used to specify alternate quote
      *  characters. The first two positions are used as the left and
      *  right quotation characters if they are non-blank.
      *
      * If the input is completely blank, the output will by default be
      * returned as blanks. By setting the third character of the
      * qualifier input to "Y", a null quoted string will be returned
      * for blank input.
      *
      * Since input and output are both 80-character parameters, a full
      * 80 cannot be quoted. If the input has more than 78 non-blanks,
      * only the first 78 are used in the output.
      *
     E                    DI         80  1               param string
     E                    DO         80  1               param string
      *
     I            DS
      * Parameter strings as arrays
     I                                        1  80 DI
     I                                        1  80 DIF
     I            DS
     I                                        1  80 DO
     I                                        1  80 DOF
     I                                       80  80 DOF80
     I            DS
     I                                        1   1 DQ1CH
     I                                        2   2 DQ2CH
     I                                        3   3 DQ3CH
     I                                        1   3 DQF
      *
     I            DS
      * Default quotation characters (left, right):
     I I            '"'                       1   1 LQD
     I I            '"'                       2   2 RQD
      * Parameter declarations
     I            DS
      * I :  Code trans directions    1
     I                                        1   1 P1CDTT
      * I :  Code table reference    10
     I                                        2  11 P2TABL
      * B :  Code in standard form   80
     I                                       12  91 P3CDST
      * B :  Code qualifier data     80
     I                                       92 171 P4CDQD
      * B :  Code in local form      80
     I                                      172 251 P5CDLC
      *
      /EJECT
      *****************************************************************
      * Entry parameters
     C           *ENTRY    PLIST
     C                     PARM           P0RTN   7
     C           P1CDTT    PARM           WP0001  1        Code trans dire
     C           P2TABL    PARM           WP0002 10        Code table refe
     C           P3CDST    PARM P3CDST    WP0003 80        Code in standar
     C           P4CDQD    PARM P4CDQD    WP0004 80        Code qualifier
     C           P5CDLC    PARM P5CDLC    WP0005 80        Code in local f
      *****************************************************************
      *
      * Determine quotation characters:
     C                     MOVELP4CDQD    DQF
     C           DQ1CH     IFNE ' '
      * Non-blank qualifier position 1: use as left quote char
     C                     MOVELDQ1CH     LQ      1
     C                     ELSE
     C                     MOVELLQD       LQ               use default
     C                     END
      *
     C           DQ2CH     IFNE ' '
      * Non-blank qualifier position 2: use as right quote char
     C                     MOVELDQ2CH     RQ      1
     C                     ELSE
     C                     MOVELRQD       RQ               use default
     C                     END
      *
      * CASE: PAR.Code trans directions is Inward translation
     C           P1CDTT    IFEQ 'I'
      *
     C           P3CDST    IFNE *BLANKS
     C           DQ3CH     OREQ 'Y'
      * Use Code in standard form as input
      * Find first non-blank character:
     C           ' '       CHECKP3CDST    N       30       n=non' ' pos
     C           N         IFGT 0
     C           N         ANDLT81                         if found, use
     C                     SUBSTP3CDST:N  DIF       P       from pos N
     C                     ELSE                            otherwise, use
     C                     MOVELP3CDST    DIF       P       input as-is
     C                     END
      *
      * Concatenate (left quote) + (input)
     C           LQ        CAT  DIF:0     DOF       P
      * Determine rightmost non-blank character
     C           ' '       CHEKRDOF       N                N=non' ' pos
     C           N         IFGT 0
     C           N         ANDLT80                         if found, add
     C                     ADD  1         N                quote at N+1
     C                     MOVELRQ        DO,N
     C                     ELSE                            otherwise, add
     C                     MOVELRQ        DOF80            quote at pos 80
     C                     END
      * Move to output parm:
     C                     MOVELDOF       P5CDLC
     C                     ELSE
      * Set output to blanks if input is blanks and DQ3CH is not Y
     C                     MOVE *BLANKS   P5CDLC
     C                     END
      *
      * A "Return code" of blank means there is no error
     C                     MOVEL*BLANK    P0RTN            *Return code
      *
     C                     ELSE
      * CASE: PAR.Code trans directions is Outward translation
     C           P1CDTT    IFEQ 'O'
      *
     C           P5CDLC    IFNE *BLANKS
     C           DQ3CH     OREQ 'Y'
      * Use Code in local form as input
      * Find first non-blank character:
     C           ' '       CHECKP5CDLC    N       30       n=non' ' pos
     C           N         IFGT 0
     C           N         ANDLT81                         if found, use
     C                     SUBSTP5CDLC:N  DIF       P       from pos N
     C                     ELSE                            otherwise, use
     C                     MOVELP5CDLC    DIF       P       input as-is
     C                     END
      *
      * Concatenate (left quote) + (input)
     C           LQ        CAT  DIF:0     DOF       P
      * Determine rightmost non-blank character
     C           ' '       CHEKRDOF       N                N=non' ' pos
     C           N         IFGT 0
     C           N         ANDLT80                         if found, add
     C                     ADD  1         N                quote at N+1
     C                     MOVELRQ        DO,N
     C                     ELSE                            otherwise, add
     C                     MOVELRQ        DOF80            quote at pos 80
     C                     END
      * Move to output parm:
     C                     MOVELDOF       P3CDST
     C                     ELSE
      * Set output to blanks if input is blanks and DQ3CH is not Y
     C                     MOVE *BLANKS   P3CDST
     C                     END
      *
      * A "Return code" of blank means there is no error
     C                     MOVEL*BLANK    P0RTN            *Return code
     C                     END
      *
     C                     END
      *
      * Exit program - leave active (*INLR is off)
     C                     RETRN



By: on