This REXX program generates credit card numbers (16 digits – no Amex), checks if the number is valid using Luhn algorithm and prints it to OUTDD.
/**************************** REXX *********************************/
"FREE FI(outdd)"
"ALLOC FI(outdd) DA('Z00324.OUTPUT(CUST16)') SHR REUSE"
out_ctr = 0
valid_count = 0
DO WHILE (valid_count < 500)
CALL GENERATE
ccvalid.1 = randomcc
CALL LUHN
IF LUHN(ccvalid.1) THEN
DO
"EXECIO 1 DISKW outdd (STEM ccvalid. "
out_ctr = out_ctr + 1
valid_count = valid_count + 1
END
END
IF out_ctr > 0 THEN
DO
"EXECIO 0 DISKW outdd (FINIS"
SAY 'File outdd now contains ' out_ctr' lines.'
END
ELSE
DO
"EXECIO 0 DISKW outdd (OPEN FINIS"
SAY 'File outdd is now empty.'
END
"FREE FI(outdd)"
EXIT
GENERATE:
DO x=1 to 4 by 1
randomdig.x = RANDOM(1000,9999)
END
randomcc = randomdig.1 || randomdig.2 || randomdig.3 || randomdig.4
RETURN
LUHN:
sum=0
even=0
DO i=length(randomcc) TO 1 BY -1
c=SUBSTR(randomcc,i,1)
IF even THEN DO
c=c*2
IF c>=10 THEN
c=c-9
END
even=\even
sum=sum+c
END
RETURN right(sum,1)=0