*> ============================================================ *> main-validation-halfwidth : 电话号码校验 (Phone Validation) *> Input : FILE-IN (INPUT.DAT: 电话号码文字列) *> Output: FILE-PASS (PASS.DAT: 校验通过) *> Coverage: VF-N005, VF-N006, VF-A001, VF-A002, VF-R001 *> ============================================================ IDENTIFICATION DIVISION. PROGRAM-ID. VALIDATE-HALF. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE-IN ASSIGN TO "INPUT.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS WS-FS. SELECT FILE-PASS ASSIGN TO "PASS.DAT" ORGANIZATION IS SEQUENTIAL. SELECT FILE-FAIL ASSIGN TO "FAIL.DAT" ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD FILE-IN RECORD CONTAINS 60 CHARACTERS. 01 IN-RECORD. 05 IN-ID PIC X(10). 05 IN-HALF20 PIC X(20). 05 IN-HALF4 PIC X(4). 05 IN-CHECK-TYPE PIC X(1). 05 IN-FILLER PIC X(25). FD FILE-PASS RECORD CONTAINS 60 CHARACTERS. 01 PASS-REC PIC X(60). FD FILE-FAIL RECORD CONTAINS 80 CHARACTERS. 01 FAIL-REC. 05 FAIL-ID PIC X(10). 05 FAIL-REASON PIC X(30). 05 FAIL-DATA PIC X(40). WORKING-STORAGE SECTION. 01 WS-FS PIC X(2). 01 WS-EOF PIC X(1) VALUE 'N'. 88 WS-EOF-Y VALUE 'Y' FALSE 'N'. 01 WS-READ-COUNT PIC 9(10). 01 WS-PASS-COUNT PIC 9(10). 01 WS-FAIL-COUNT PIC 9(10). 01 WS-I PIC 9(2). 01 WS-CHAR PIC X(1). 01 WS-IS-HALF PIC X(1) VALUE 'Y'. 88 WS-IS-HALF-Y VALUE 'Y' FALSE 'N'. 01 WS-CHECK-20 PIC X(20). 01 WS-CHECK-4 PIC X(4). 01 WS-HALF-LOWER PIC X(26) VALUE 'abcdefghijklmnopqrstuvwxyz'. 01 WS-HALF-UPPER PIC X(26) VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. 01 WS-HALF-DIGIT PIC X(10) VALUE '0123456789'. 01 WS-HALF-SYMBOL PIC X(33) VALUE ' !"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'. 01 WS-TELECOM-REC. COPY "telecom/TEL-BILLING.cpy". PROCEDURE DIVISION. MAIN. DISPLAY "VALIDATE-HALF: Starting halfwidth validation" OPEN INPUT FILE-IN. OPEN OUTPUT FILE-PASS FILE-FAIL. PERFORM UNTIL WS-EOF-Y READ FILE-IN INTO IN-RECORD AT END SET WS-EOF-Y TO TRUE NOT AT END ADD 1 TO WS-READ-COUNT MOVE IN-HALF20 TO WS-CHECK-20 PERFORM CHECK-HALF20 IF WS-IS-HALF-Y MOVE IN-HALF4 TO WS-CHECK-4 PERFORM CHECK-HALF4 END-IF IF WS-IS-HALF-Y ADD 1 TO WS-PASS-COUNT MOVE IN-RECORD TO PASS-REC WRITE PASS-REC DISPLAY "PASS: " IN-ID " - halfwidth OK" ELSE ADD 1 TO WS-FAIL-COUNT MOVE IN-ID TO FAIL-ID STRING "HALFWIDTH CHECK FAILED - data contains " "non-halfwidth characters" DELIMITED BY SIZE INTO FAIL-REASON END-STRING MOVE IN-HALF20 TO FAIL-DATA WRITE FAIL-REC DISPLAY "FAIL: " IN-ID " - non-halfwidth detected" END-IF END-READ END-PERFORM. CLOSE FILE-IN FILE-PASS FILE-FAIL. DISPLAY "VALIDATE-HALF: READ=" WS-READ-COUNT " PASS=" WS-PASS-COUNT " FAIL=" WS-FAIL-COUNT DISPLAY "VALIDATE-HALF: Total = READ (R001)" IF WS-READ-COUNT = WS-PASS-COUNT + WS-FAIL-COUNT DISPLAY "VALIDATE-HALF: PASS" STOP RUN RETURNING 0 ELSE DISPLAY "VALIDATE-HALF: FAIL - count mismatch" STOP RUN RETURNING 1 END-IF . CHECK-HALF20. SET WS-IS-HALF TO TRUE PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 20 MOVE WS-CHECK-20(WS-I:1) TO WS-CHAR IF WS-CHAR = SPACE CONTINUE ELSE IF WS-CHAR >= 'a' AND <= 'z' CONTINUE ELSE IF WS-CHAR >= 'A' AND <= 'Z' CONTINUE ELSE IF WS-CHAR >= '0' AND <= '9' CONTINUE ELSE MOVE 'N' TO WS-IS-HALF EXIT PERFORM END-IF END-IF END-PERFORM . CHECK-HALF4. SET WS-IS-HALF TO TRUE PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 4 MOVE WS-CHECK-4(WS-I:1) TO WS-CHAR IF WS-CHAR = SPACE CONTINUE ELSE IF WS-CHAR >= 'a' AND <= 'z' CONTINUE ELSE IF WS-CHAR >= 'A' AND <= 'Z' CONTINUE ELSE IF WS-CHAR >= '0' AND <= '9' CONTINUE ELSE MOVE 'N' TO WS-IS-HALF EXIT PERFORM END-IF END-IF END-PERFORM . END PROGRAM VALIDATE-HALF.