Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Examples

&pagelevel(4)&pagelevel

The following function is to be implemented in Assembler and C:

XSUBSTRING[2/3](STRING = <string_expression>
                ,START = <arithm_expression>
                ,LENGTH = <arithm_expression> / *REST-LENGTH
               )

Assembler interface

Title of the function:

XSUBSTRING2

Entry:

XSUBEX2

Input data:

STRING, START POSITION, LENGTH

Output data:

SUBSTRING

First step: syntax specification.

BIFDESC    NAME='XSUBSTRING2',                -
           ENTRYN=(*CSECT,XSUBDEF2),          -
           PARLIST=                           -
            ((STRING,*STRING),                -
              (START,*INTEGER,1),             -
              (LENGTH,*INTEGER,*REST-LENGTH,  -
               (*REST-LENGTH))                -
              ),                              -
           PARFORM=BY-VALUE,
           VALTYPE=*STRING
END

Second step: execution program

XSUBEX2    CSECT
XSUBEX2    AMODE    ANY
XSUBEX2    RMODE    ANY
           STM      14,12,12(13)            Save the caller’s registers
           BASR     10,0                    R10: base register
           USING    *,10
           USING    DSMDL1,4
           USING    DSMDL2,5
*
           L        1,0(0,1)                R1 ->a(p1)    => R1=a(p1)
*
           LA       5,48(1)                 R5 -> fifth element of the 
                                            operand list (e.g. RC)
           L        5,4(5)                  R5 -> RC
           MVC      0(9,5),OKRC             Set RC = OK
*
           LA       4,0(1)                  operand list starts at R4
           L        6,BIF1VLG               R6: length of the STRING operand
           L        7,BIF1VPT               R7: addr. of the STRING operand
           LTR      6,6                     Is the length of STRING=0?
           BE       MSGNULL                 Send a message NULL_STRING
*
           LA       4,12(1)                 Second element of the operand 
                                            list follows at R4 (e.g. START)
           LA       2,1(0,0)                R2 = 1
           L        8,BIF1VPT               R8: address of the START value
           L        8,0(8)                  R8: value of START
           CR       8,2                     If START < 1
           BL       MSGBOUN                 Send message OUT_OF_BOUNDS
           CR       8,6                     If START > length of STRING
           BH       MSGBOUN                 Send message OUT_OF_BOUNDS
*
           LA       4,24(1)                 Third element of the operand 
                                            list follows at R4 (e.g. LENGTH)
*                                           R3 = len. of STRING - START + 1
           LA       3,1(0,0)                R3 = 1
           AR       3,6                     R3 = R3 + length of STRING
           SR       3,8                     R3 = R3 - START
           CLI      BIF1VTY,BIF1INT
           BE       LENINT
LENKEYW    DS       OH
*                                           *Look for REST-LENGTH
           LR       9,3
           B        @0001
LENINT     DS       OH
*                                           LENGTH = *INTEGER
           L        9,BIFTVPT               R9: address of the LENGTH value
           L        9,0(9)                  R9: value of LENGTH
           CR       9,2                     If LENGTH < 1
           BL       MSGBOUN                 Send message OUT_OF_BOUNDS
           CR       9,3                     If LENGTH < REST-LENGTH
           BNH      @0001                   Then ok
           LR       9,3                     LENGTH is truncated
           MVC      0(9,5),TRUNCRC          Set RC = TRUNCATED
@0001      DS       OH
                                            Calculate the function value
           LA       4,36(1)                 Fourth element of the operand 
                                            list (e.g. FUNCTION_VALUE) 
                                            follows at R4
           L        6,BIF1VPT               R6 : address of function value
           AR       8,7                     R8 = address of STRING + START
           SR       8,2                     R8 = R8-1
           LR       7,9                     R7 = length of function value
           ST       7,BIF1VLG
           MVCL     6,8                     Copy into function value
*          B        RETURN
MSGNULL
           MSG7X    MF=E,PARAM=NULLPL
           MVC      0(9,5),NULLRC           Set RC = NULL_STRING
*          B        RETURN
MSGBOUN
           MSG7X    MF=E,PARAM=BOUNDPL      Set RC = OUT OF BOUNDS
*          MVC      0(9,5),BOUNDRC
RETURN
           LM       14,12,12(13)            Write back caller’s registers
OKRC       BR       14                      Return to the caller
           DC       XL1'00'
           DC       XL1'00'
TRUNCRC    DC       CL7'CMD0001'
           DC       XL1'02'
           DC       XL1'00'
BOUNDRC    DC       CL7'SDP0414'
           DC       XL1'00'
           DC       XL1'01'
NULLRC     DC       CL7'SDP0412'
           DC       XL1'00'
           DC       XL1'01'
           DC       CL7'SDP0411'
           DS       OF
NULLPL     MSG7X    MF=L,ID=SDP0411
BOUNDPL    MSG7X    MF=L,ID=SDP0412
           DS       OF
DSMDL1     BIFMDL1  MF=D
           DS       OF
DSMDL2     BIFMDL2  MF=D
           END

Third step: update BIFTAB

BIFTAB     CSECT
           .....
XSUBSTR2   BIFDEF   MF=L,NAME=XSUBSTRING2,SYNTAX=XSUBDEF2,CODE=XSUBEX2
           .....
           END