Scott and Bob,

What you need to do is break out the length of each &GRPUSERS(&I) string and
then loop for the quotient of that length over 256, something like this:

                LCLA  &GLEN,&GCNT,&K,&L
&GLEN           SETA  K'&GRPUSERS(&I)
&GCNT           SETA  &GLEN/256
&K              SETA  1
GRPUSR&I        DS      0CL&GLEN
.GLOOP  ANOP  ,
&L              SETA  256
                AIF   (&K LT &GCNT).DODC
&L              SETA  &GLEN-(&GCNT*256)
.DODC       ANOP  ,
                DC      C'&GRPUSERS(&I)'(((&K-1)*256)+1,&L)
&K              SETA  &K+1
                AIF   (&K LE &GCNT).GLOOP

I don't know if that takes care of leading/trailing quotes in the
&GRPUSER(&I) values, but it's a start.

Peter


-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[EMAIL PROTECTED] 
Sent: Friday, October 07, 2005 3:51 PM
To: IBM-MAIN@BAMA.UA.EDU
Subject: Assembler question

My colleague Bob Stark asked me to float a problem he's currently
experiencing at a client site out to some of the listservers for MVS and
Assember to see if anyone can help us debug this problem.

If you post back, can you please also copy your response to Bob at
[EMAIL PROTECTED] as he's in an account site and off-list with web
email.

Thanks so much!

Scott

>Date: Fri, 07 Oct 2005 14:49:13 -0400
>From: "Bob Stark" <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>Subject: S/390 Assembler Macro problem
>X-Mailer: IceWarp Web Mail 5.4.3
>X-Originating-IP: 208.165.251.16
>
>I wrote the set of macros below which generate a linked list for a 
>control block module a month back, and now I am adding more userids. I 
>hit a limit that I didn't realize:
>
>xx    DC   C'THIS MUST BE 256 BYTES OR LESS'
>
>My list is now over 256 bytes, so I have to split that up unto multiple 
>DC instructions, and my technique of generating the length will no 
>longer be correct.  When I wrote these two macros, I scoured the 
>Internet looking for examples, but didn't find much pay dirt, and the 
>High Level Assembler Programmer's Guide and Language reference are 
>short on examples that put everything together.
>
>So I am looking for:
>1. A suggested approach, withe a few actual lines of macro code, that 
>show how to split these DC's up and loop through them.
>
>2. A Source of really good example assembler macros that I could copy 
>techniques from.
>
>Here is a sample invocation of both macros:
>
>  $GRP TEST,USERS='T045022 T046726 T047542 T056131 T056313 T057345     +
>                T093897 T094643 T095122 T095507 T095556 T096058         +
>                T096148 T096199 T096255 T096518 T097282 T097579         +
>                T097617 T097623 T098914 T099268 T099301 T100052         +
>                '
>
>GRPTABLE $GRPTBL           THIS ENTRY MUST FOLLOW ALL $GRP MEMBERS
>
>Here is the $GRP macro, which keeps an array of group data:
>
>          MACRO
>&MACNAME $GRP &NAME,&USERS=''
>.*-------------------------------------------------------------------*
>.*                                                                   *
>.* FUNCTION    - BUILDS ASSEMBLER TABLE FOR LINKAGE INTO LNKLST LIB. *
>.*                                                                   *
>.* EXAMPLE: $GRP LANDUSR,USERS='T12345 TZ99999'                      *
>.*                                                                   *
>.*-------------------------------------------------------------------*
>          GBLC  &GRPNAMES(500)
>          GBLC  &GRPUSERS(500)
>          GBLA  &GRPCNTR
>          AIF   (T'&NAME NE 'O').GOTNAME
>          MNOTE 12,'****** NO GROUP NAME ENTERED'
>          MEXIT
>.GOTNAME ANOP
>.*
>          AIF   (T'&USERS NE 'O').GOTUSER
>          MNOTE 12,'****** NO USER NAME(S) ENTERED'
>          MEXIT
>.GOTUSER ANOP
>.*
>&GRPCNTR SETA  &GRPCNTR+1
>.* THE NEXT LINE PADS THE NAME TO 8 CHARACTERS, SO IT COMPARES OK
>.*&GRPNAMES(&GRPCNTR) SETC '&NAME'.'        '(K'&NAME,8)
>&GRPNAMES(&GRPCNTR) SETC '&NAME'
>&GRPUSERS(&GRPCNTR) SETC '&USERS'
>.END     MEND
>
>Here is the $GRPTBL Macro, where my problem lies. It sorts the array 
>into order (that part works okay), then generates control blocks from the
data.
>See the very bottom for what I think I need to do.
>
>          MACRO
>&MACNAME $GRPTBL &DSECT=NO
>.*-------------------------------------------------------------------*
>.*                                                                   *
>.* FUNCTION    - BUILDS ASSEMBLER TABLE FOR LINKAGE INTO LNKLST LIB. *
>.*                                                                   *
>.* EXAMPLE: $GRPTBL DSECT=YES                                        *
>.*-------------------------------------------------------------------*
>          GBLC  &GRPNAMES(500)
>          GBLC  &GRPUSERS(500)
>          GBLA  &GRPCNTR
>
>          LCLA  &I,&J
>          LCLA  &NEXT
>          LCLB  &SWAP
>          LCLC  &SAVEC
>          AIF   ('&DSECT' EQ 'YES').DGEN
>.*       MNOTE 0,'*** TABLE CONTAINS &GRPCNTR GROUPS'
>.* TOP OF "I" LOOP
>&I       SETA  1
>.SRTLOOPI ANOP
>&SWAP    SETB  0
>.* TOP OF "J" LOOP
>&J       SETA  1
>.SRTLOOPJ ANOP
>&NEXT    SETA  &J+1
>          AIF  ('&GRPNAMES(&J)'.'        '(K'&GRPNAMES(&J),8) LE        +
>                '&GRPNAMES(&NEXT)'.'        '(K'&GRPNAMES(&NEXT),8)).NOS+
>                WAP
>.* ENTRIES OUT OF ORDER, MUST SWAP THEM
>&SWAP    SETB  1
>.*       MNOTE 0,'*** SWAP &J &GRPNAMES(&J) W/ &NEXT &GRPNAMES(&NEXT)'
>&SAVEC   SETC  '&GRPNAMES(&J)'
>&GRPNAMES(&J) SETC '&GRPNAMES(&NEXT)'
>&GRPNAMES(&NEXT) SETC '&SAVEC'
>.*
>&SAVEC   SETC  '&GRPUSERS(&J)'
>&GRPUSERS(&J) SETC '&GRPUSERS(&NEXT)'
>&GRPUSERS(&NEXT) SETC '&SAVEC'
>.NOSWAP  ANOP
>.*
>.* BOTTOM OF "J" LOOP
>&J       SETA  &J+1
>.*       MNOTE 0,'*** BOTTOM OF J LOOP, J=&J'
>          AIF   (&J LT &GRPCNTR).SRTLOOPJ
>.*
>.* BOTTOM OF "I" LOOP
>.*       MNOTE 0,'*** BOTTOM OF I LOOP, I=&I'
>          AIF   (&SWAP EQ 0).SORTED
>&I       SETA  &I+1
>          AIF   (&I LT &GRPCNTR).SRTLOOPI
>.* THE ARRAY IS SORTED
>.SORTED  ANOP
>.*
>&I       SETA  1
>&MACNAME DS    0F                       ALIGN CONTROL BLOCK TO FULLWORD
>.GRPLOOPI ANOP
>&NEXT    SETA  &I+1
>          AIF   (&I EQ &GRPCNTR).LASTGRP
>GRP&GRPNAMES(&I) DC A(GRP&GRPNAMES(&NEXT)) POINTER TO NEXT GROUP OR 0
>          AGO   .DIDGRP
>.LASTGRP ANOP
>GRP&GRPNAMES(&I) DC A(0)                     POINTER TO NEXT GROUP IS 0
>.DIDGRP  ANOP
>          DC    A(&GRPNAMES(&I))         POINTER TO AUTH ENTRY
>          DC    CL8'&GRPNAMES(&I)'       GROUP NAME
>          DC    AL2(L'GRPUSR&I)          LENGTH OF USER LIST
>GRPUSR&I DC    C&GRPUSERS(&I)
>*
>&I       SETA  &I+1
>          AIF   (&I LE &GRPCNTR).GRPLOOPI
>          AGO   .END
>.*
>.DGEN    ANOP
>GRPTBL   DSECT
>GRPNEXT  DS    A                       POINTER TO NEXT GROUP OR 0
>GRPAUTH  DS    A                       POINTER TO JOBTRAC AUTH ENTRY
>GRPNAME  DS    CL8                     GROUP NAME
>GRPUSRLN DS    AL2                     LENGTH OF USER LIST
>GRPUSERS DS    0C                      BEGINNING OF USER LIST
>.END     MEND
>
>The following two lines
>
>          DC    AL2(L'GRPUSR&I)          LENGTH OF USER LIST
>GRPUSR&I DC    C&GRPUSERS(&I)
>
>need to be split into something like:
>
>          DC    AL2(GRPEND&I-GRPUSR&I)          LENGTH OF USER 
> LIST
>GRPUSR&I EQU *
>             DC    CL256'&GRPUSERS(&I)(1,256)            First 
> part
>             DC    CL256'&GRPUSERS(&I)(257,512)         Second 
> part
>             DC    C'&GRPUSERS(&I)(257,MAXLENGTH)   Last 
> part
>GRPEND&I EQU *
>
>Notice that this is pseudo code because I can't figure out the 
>technique here; I need a loop which generated out the accumulated data 
>and deals with the leading and trailing quote on the original input data.
>
>Many many thanks and Regards,
>
>Bob S.




Scott McFall
ProTechTraining, a division of
ProTech Professional Technical Svcs, Inc.
800-373-9188x113 cell 412-445-8070
"Charting the Course...to Your Success!"

Over 100,000 successfully trained IT professionals since 1990!

Class schedules and course information online at:
http://www.protechtraining.com

Think BIG iron..."I think there is a world market for about five computers."
-- Thomas J. Watson, Chairman of IBM, 1943  

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email
to [EMAIL PROTECTED] with the message: GET IBM-MAIN INFO Search the
archives at http://bama.ua.edu/archives/ibm-main.html

_
This message and any attachments are intended only for the use of the addressee 
and
may contain information that is privileged and confidential. If the reader of 
the 
message is not the intended recipient or an authorized representative of the
intended recipient, you are hereby notified that any dissemination of this
communication is strictly prohibited. If you have received this communication in
error, please notify us immediately by e-mail and delete the message and any
attachments from your system.

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [EMAIL PROTECTED] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html

Reply via email to