What the Sample Input Module does
The following sample edit module verifies dates supplied by the terminal operator and, if necessary, strips out slashes to make the operator's input conform to mmddyy format. The sample edit module verifies that the date conforms to the following rules:
If the Date is in Error
If the sample edit module determines that the date is valid, the date is transposed from mmddyy to yymmdd format for storage. If the date is in error, an error indicator is sent to the map. The erroneous date appears on the map as ?00000 if the map is redisplayed to the user for correction.
The following sample edit module is not reentrant.
The #MOPT macro that is included in this sample module generates register equates for use in coding the module, sets up a CSECT name for the module, and includes the name of the macro and its date/time stamp in future listings of the module. Use of the #MOPT macro is optional.
Edit modules can be either SYSTEM or USER MODE programs; the majority are USER MODE. To specify a user-written edit module mode, use the #MOPT macro. Set the ENV parameter to USER for the USER MODE program or to SYS or SYSTEM for SYSTEM MODE. If you do not set the ENV parameter, the defaults imply that it is set to USER.
If a DC request is issued, USER MODE programs need to be link edited with IDMSBALI or need to issue a #BALI macro within the user-written edit module. If a DC request is not issued in the program, there is no need to link edit the program with IDMSBALI or to issue a #BALI macro within the code.
You don't need to link edit SYSTEM MODE edit modules with IDMSBALI or have the program contact the #BALI macro. However, the CSA DSECT must be copied into your code if you issue any DC request. If you issue a DC request, R9 and R10 must point to the TCE and CSA at the time of the request.
COPY #CSADS 00000100 COPY #MRBDS 00000200 #MOPT CSECT=CSYPDTE0,ENV=SYS 00000300 DTE0NTRY #START MPMODE=ANY 00000400 ********************************************************************** 00000500 * R1 POINTS TO AN TEN WORD PARAMETER LIST FOR MAPIN AS FOLLOWS: * 00000600 * * 00000700 * WORD1 0(R1) ───► ADDRESS OF DATA FIELD IN TARGET DATA RECORD * 00000800 * WORD2 4(R1) ───► ADDRESS OF HEADER FOR NEXT INPUT BUFFER * 00000900 * WORD3 8(R1) ───► ADDRESS OF END OF CURRENT INPUT BUFFER * 00001000 * WORD4 12(R1) ───► ADDRESS OF START OF INPUT DATA FOR FIELD * 00001100 * WORD5 16(R1) ───► ADDRESS OF MRE * 00001200 * WORD6 20(R1) ───► ADDRESS OF MCE * 00001300 * WORD7 24(R1) ───► ADDRESS OF PTE * 00001400 * WORD8 28(R1) ───► ADDRESS OF MRB * 00001500 * WORD9 32(R1) ───► ADDRESS OF START OF DATA IN THE WORK AREA * 00001600 * WORD10 36(R1) ───► ADDRESS OF LAST BYTE OF DATA IN THE WORK AREA * 00001700 ********************************************************************** 00001800 L R2,0(R1) GET ADDRESS OF DATA FIELD 00001900 L R3,32(R1) GET ADDRESS OF INPUT FIELD 00002000 L R4,16(R1) GET ADDRESS OF MAP REQUEST ELMT 00002100 USING CSA,R10 BASES DC CSA STORAGE 00002200 USING MRE,R4 BASES MAPPING MRE BLOCK 00002300 LH R6,MREINLEN R6 <- LENGTH OF INPUT FIELD 00002400 CHKLEN8 LA R5,8 R5 <- 8 00002500 CR R5,R6 LENGTH=8? 00002600 BNE CHKLEN6 NO, CHECK FOR LENGTH=6 00002700 CLI 2(R3),C'/' FORMAT OF XX/.....? 00002800 BNE SETERROR NO, SET INPUT ERROR 00002900 CLI 5(R3),C'/' FORMAT OF XX/XX/..? 00003000 BNE SETERROR NO, SET INPUT ERROR 00003100 MVC 2(2,R3),3(R3) MOVE DAYS OVER 00003200 MVC 4(2,R3),6(R3) MOVE YEAR OVER 00003300 B CHKNUMS GO CHECK FOR NUMERIC CHARACTERS 00003400 CHKLEN6 LA R5,6 R5 <- 6 00003500 CR R5,R6 LENGTH=6? 00003600 BNE SETERROR NO, SET INPUT ERROR 00003700 CHKNUMS LR R7,R3 R7 ─► FIRST CHARACTER OF DATE 00003800 LA R8,6(,R7) R8 ─► FIRST CHARACTER PAST DATE 00003900 CHKNLOOP CLI 0(R7),C'0' CHARACTER LOWER THAN 'F0'? 00004000 BL SETERROR YES, SET INPUT ERROR 00004100 CLI 0(R7),C'9' CHARACTER HIGHER THAN X'F9'? 00004200 BH SETERROR YES, SET INPUT ERROR 00004300 LA R7,1(,R7) INCREMENT CHARACTER POINTER 00004400 CR R7,R8 END OF DATE? 00004500 BL CHKNLOOP NO, CHECK NEXT DATE CHARACTER 00004600 CLC 0(6,R3),=C'000000' IS DATE ZERO? 00004700 BE FLIPDATE YES, MOVE DATE TO USER RECORD 00004800 CLC 0(6,R3),=C'999999' IS DATE ALL NINES? 00004900 BE FLIPDATE YES, MOVE DATE TO USER RECORD 00005000 CLC 0(2,R3),=C'12' MONTH > 12? 00005100 BH SETERROR 00005200 CLC 0(2,R3),=C'00' MONTH = 0? 00005300 BE SETERROR 00005400 CLC 2(2,R3),=C'00' DAY = 0? 00005500 BE SETERROR 00005600 CLC 4(2,R3),=C'00' YEAR = 0? 00005700
BE SETERROR 00005800 CLC 0(2,R3),=C'04' APRIL? 00005900 BE CHK30DAY 00006000 CLC 0(2,R3),=C'06' JUNE? 00006100 BE CHK30DAY 00006200 CLC 0(2,R3),=C'09' SEPTEMBER? 00006300 BE CHK30DAY 00006400 CLC 0(2,R3),=C'11' NOVEMBER? 00006500 BE CHK30DAY 00006600 CLC 0(2,R3),=C'02' FEBRUARY? 00006700 BE CHKLEAP YES, CHECK FOR LEAP YEAR 00006800 CLC 2(2,R3),=C'31' 31 DAYS OR FEWER FOR OTHER MONTHS 00006900 BH SETERROR IF BAD, SET INPUT ERROR 00007000 B FLIPDATE MOVE DATE TO USER RECORD 00007100 CHK30DAY CLC 2(2,R3),=C'30' 30 DAYS OR FEWER FOR SOME MONTHS 00007200 BH SETERROR IF BAD, SET INPUT ERROR 00007300 B FLIPDATE MOVE DATE TO USER RECORD 00007400 CHKLEAP #GETSTK =(2) GET 2 WORDS OF STORAGE (R11 BASED) 00007500 PACK 0(8,R11),4(2,R3) PACK THE YEAR 00007600 CVB R9,0(,R11) R9 <- CONVERTED BINARY YEAR 00007700 SR R8,R8 R8 <- ZERO 00007800 LA R15,4 R15 <- 4 00007900 DR R8,R15 DIVIDE YEAR BY 4 00008000 LTR R8,R8 ZERO REMAINDER? 00008100 BZ CHK29DAY YES, CHECK FOR 29 OR FEWER DAYS 00008200 CLC 2(2,R3),=C'28' 28 DAYS OR FEWER FOR NON-LEAP YEAR 00008300 BH SETERROR IF BAD, SET INPUT ERROR 00008400 B FLIPDATE MOVE DATE TO USER RECORD 00008500 CHK29DAY CLC 2(2,R3),=C'29' 29 DAYS OR FEWER FOR LEAP YEAR 00008600 BH SETERROR IF BAD, SET INPUT ERROR 00008700 FLIPDATE MVC 0(2,R2),4(R3) MOVE YEAR TO USER RECORD 00008800 MVC 2(4,R2),0(R3) MOVE MONTH AND DAY TO USER RECORD 00008900 B RETURN RETURN 00009000 SETERROR #SET MRETERR INDICATE INPUT ERROR TO USER 00009600 RETURN #RTN 00009200 END DTE0NTRY 00009300
Copyright © 2013 CA.
All rights reserved.
|
|