Okay, macro time. I have a string that can end with any of several different characters.
How do I find the length of the string, and the ending character. AND, I might do this several places.
Oh, I know, I could write a macro. OH, OH, and include branch instructions to different places.
It uses both SUBSTRING, and SUBLIST notation. SUBSTRING has the index outside the quotes,
and selects 1, 2, 3, ?? characters from within a list.
SUBLIST has the index inside the quotes, and selects 1 entry from a list of multiple entries.
In both cases, &N is the index.
The strings that I'm parsing, following LABEL=, separated by commas, look like:
LABEL=RECORD 120
LABEL=CARD 80,LINE 120,LGETMAIN 16
LABEL=CARD 12,LINE+12,CARD 8,LINE-8,CARD 8
LABEL=SAVECARD,GOTSY*,GETSY,GETSY+6
LABEL=GOTSYSIN,GOTLABEL*,DW 16
------------------------THIS IS WHAT'S IN THE SOURCE CODE. -----------------
F2 includes 'goto' labels. F1 just returns an undex.
LA R14,DW BEGINNING OF THE STRING
TESTF2 FINDEND (14),16,PARAMS='+ ,-', X
GOTO=(0,SAVEPM,0,GETNEXT-4,SAVEPM,0)
----------------------------------------------------------
TESTF1 FINDEND (14),16,PARAMS='+ ,-'
------------------------------------------------------
LTR R15,R1 Q. DID IT WORK?
BZ ERR NO.
SR R15,R14 YES, CALC LENGTH
* WHEN DONE, REG-14 = BEG OF STRING
* REG-1 = ENDING CHARACTER
* REG-15 = LENGTH OF STRING
------------------- I put this in my program ----------------------------------
$$LA R14,card BEGINNING OF THE STRING
TESTF2 FINDEND (14),16,PARAMS='+ ,-',GOTO=(0,SAVEPM,0,GETNEXT-4,SAVEPM,0)
--------------------------This is what's generated--------------------
TESTF2 LA 1,0(14)
SYS0004A LA 1,1(1)
LA 0,2*4
CLI 0(1),C'+'
BE SAVEPM
LA 0,3*4
CLI 0(1),C' '
BE SYS0004X+2
LA 0,4*4
CLI 0(1),C','
BE GETNEXT-4
LA 0,5*4
CLI 0(1),C'-'
BE SAVEPM
BCT 0,SYS0004A
SYS0004X SR 1,1
----------------------------------------------------
TESTF1 FINDEND (14),16,PARAMS='+ ,-' <== macro call (no GOTO=)
*-----------------------------------------------------------------
TESTF1 LA 1,0(14) <====== generated
LA 0,16
SYS0002A LA 1,1(1)
CLI 0(1),C'+'
BE SYS0002X+2
CLI 0(1),C' '
BE SYS0002X+2
CLI 0(1),C','
BE SYS0002X+2
CLI 0(1),C'-'
BE SYS0002X+2
BCT 0,SYS0002A
SYS0002X SR 1,1
------------------------AND THEN I DID THIS FOR THIS SPECIFIC APPLICATION
LTR R15,R1 Q. DID IT WORK?
BZ ERR NO.
SR R15,R14 YES, CALC LENGTH
WHEN DONE, REG-14 = BEG OF STRING
REG-1 = END OF STRING
REG-15 = LENGTH OF STRING
-----------------------------but the MACRO does the magic--------------
MACRO
&LBL FINDEND &FLD,&LEN,®=1,&PARAMS='+ ,-',&GOTO=
LCLC &L,&C,&G
&L SETC 'SYS&SYSNDX'
LCLA &N,&M
&N SETA 2
&M SETA K'&PARAMS
&LBL $$LA 1,&FLD
&L.A LA 1,1(1)
.LOOP LA 0,&N*4
&C SETC '&PARAMS'(&N,1)
&G SETC '&GOTO(&N)'
.* MNOTE ,' &N &M &PARAMS &C &G '
CLI 0(1),C'&C'
AIF (T'&GOTO EQ 'O').BE
AIF ('&GOTO(&N)' EQ '0').BE
BE &G
AGO .NEX
.BE BE &L.X+2
.NEX ANOP
&N SETA &N+1
AIF (&N LT &M).LOOP
BCT 0,&L.A
&L.X SR 1,1
MEND
-----------------yes, I'm a happy camper. I still got it. :)---------