CAREY@CLEMSON.BITNET (Jim Blalock) (04/12/90)
I have a question that surely someone else has answered. I have a need to validate that data passed to my code is real packed-decimal, in an attempt to avoid program checks. I've managed to come up with a routine that should work in all cases, as follows: MACRO &TAG PACKCHK &DATA=,&L= DATA=address,L=integer &TAG XC WORKAREA,WORKAREA Clear workarea first MVN WORKAREA(&L),&DATA Move 'numerics' TRT WORKAREA(&L.-1),PACKTBL All numerics but last 00-09? BNE F1&SYSNDX No, bad input. CLI WORKAREA+&L.-1,X'0A' Last digit less than x'0a'? BL F1&SYSNDX Yes, bad sign. CLI WORKAREA+&L.-1,X'0F' Last digit more than x'0f'? BNH S1&SYSNDX No: ok so far. F1&SYSNDX BAS R14,ERRORMSG Issue messages, etc. passing DC AL2(reasoncode) reason code for error routine S1&SYSNDX DS 0H Numerics ok: XC WORKAREA,WORKAREA Wipe workarea again MVZ WORKAREA+1(&L),&DATA Move zones this time to +1 MVO WORKAREA(&L.+1),WORKAREA(&L.+1) Shift left 4 bits TRT WORKAREA(&L),PACKTBL 'Zones' within 00-09? BE S2&SYSNDX Looks ok. BAS R14,ERRORMSG Issue messages, etc. passing DC AL2(reasoncode) errexit code S2&SYSNDX DS 0H Valid packed data: proceed. MEND : PACKTBL DC XL10'00',XL246'FF' Table for 00-09. WORKAREA DS CL16 This seems to work OK, but it seems like there's a more "elegant" solution. Anyone have a more clever method that can be generalized a little?