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.
|
|