Sorry, I was trying to keep it simple.  Here's a slightly more complicated
example:

          MACRO
&LABEL MYMACRO CODE,RTN,&DSECT=NO
          AIF ('&DSECT' EQ 'YES').DSECT
&LABEL DS 0F
          DC    F'&CODE'
          DC    A('&RTN')
          MEXIT
.DSECT ANOP ,
MYMACRO DSECT ,
CODE   DS F
ROUTINE DS A
MYLEN EQU *-MYMACRO
           MEND


...
 TABPTRS DC A(TABLE,MYLEN,TABLE_END)
TABLE MYMACRO 1,ROUTINE1
            MYMACRO 2,ROUTINE2
            ...
TABLE_END DS F
            MYMACRO 15,ROUTINE15
...
          LM  R15,R1,TABPTRS
           USING MYMACRO,R15
JUMPER DS 0H
          C   R2,CODE
          JE  DOIT
          JXLE R15,R1,JUMPER
* bad entry code handler
DOIT DS 0H
          L     R15,ROUTINE
          BASR R14,R15
          DROP MYMACRO

I've used this nomenclature many times successfully.  It only becomes an
issue if someone changes one part of the macro (ex: add a variable before
CODE in the DSECT) but not the other.  Maybe it will get picked up during
assembly, maybe it won't.



*Mark*


On Thu, Jun 19, 2025 at 1:31 PM David Clark <dlcl...@winsupply.com> wrote:

> You don't give a use-case example.  So, it is hard to suggest a
> coding solution.  But, to my imagination, I would just code it along these
> lines.
>
>          MACRO
> &LABEL   MYMACRO VALUE,&DSECT=NO
>          AIF   ('&DSECT' NE 'YES').GEN
> MYMACRO  DSECT ,
> .GEN     ANOP  ,
> &LABEL   DC    A(VALUE)
>          MEND
>
> If you want to prevent accidental duplicate DSECT headers being generated,
> just use a global variable boolean test to bypass it as needed.
>
> Sincerely,
>
> Dave Clark
> --
> int.ext: 91078
> direct: (937) 531-6378
> home: (937) 751-3300
>
> Winsupply Group Services
> 3110 Kettering Boulevard
> Dayton, Ohio  45439  USA
> (937) 294-5331
>
>
> On Thu, Jun 19, 2025 at 1:21 PM Mark Hammack <
> 00001b4f3fed68ca-dmarc-requ...@listserv.uga.edu> wrote:
>
> > I just read Ed Jaffe's presentation from Share where he mentioned that
> they
> > have some macros that not only generate a DSECT but using the same macro,
> > generate data in the program.  I can find (and have a few) examples of
> > doing that when the data occurs once in a program but am drawing a blank
> on
> > a good way to do that for multiple occurrences of the macro.
> >
> > I've come up with two solutions but think there has to be a better way.
> > The first solution is to have a separate section in the macro for the
> DSECT
> > vs. the code generation such as:
> >
> >      MACRO
> >      MYMACRO VALUE,&DSECT=NO
> >      AIF ('&DSECT' EQ 'YES').DSECT
> >      DC     A(VALUE)
> >      MEXIT
> > .DSECT ANOP ,
> > MYMACRO DSECT ,
> > MYVALUE DS A
> >      MEND
> >
> > The problem with this is keeping the two sections 'in sync'.  We've run
> > into issues where the code gen part was updated but not the DSECT part or
> > vice versa.
> >
> > The second solution works but is kind of 'ugly':
> >
> >      MACRO
> >      MYMACRO VALUE,&DSECT=NO
> >      AIF  ('&DSECT' EQ 'YES').DSECT
> > &V SETC '&VALUE'
> > &LAB SETC '        '
> >      AGO .GEN
> > .DSECT ANOP ,
> > &V SETC '0'
> > &LAB SETC 'MYVALUE'
> > MYMACRO DSECT ,
> > .GEN ANOP ,
> > &LAB   DC A('&V')
> >     MEND
> >
> > This works ok for mapping small amounts of data, but would become
> unwieldy
> > with more than a few entries (few is relative to how patient you are).
> > Fortunately, the cases where this is convenient (table entries) tend to
> > only have a few fields (in my case).  It also gets to be a bit crazy if
> > there are positional and named variables.
> >
> > Looking through SYS1.MACLIB and SYS1.MODGEN, it looks like the macros are
> > such that there are separate macros for generating a table entry and the
> > DSECT or IBM assumes the macro will only be used one time in a program.
> >
> > Sorry for the formatting. Limitations of Gmail.
> >
> >
> > *Mark Hammack*
> > Systemware, Inc.
> > mark.hamm...@gmail.com
> > 214-478-0955 (c)
> >
>

Reply via email to