Last active
March 20, 2022 18:09
-
-
Save RainerRoss/a36f9a9c7667b03ca0cd572b239ff211 to your computer and use it in GitHub Desktop.
regexForEmail
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ctl-opt main(main) dftactgrp(*no) alloc(*teraspace); | |
//------------------------------------------------------------------// | |
// // | |
// Test - Regex - EMail // | |
// // | |
//----------------- // | |
// R.Ross 07.2020 * // | |
//------------------------------------------------------------------// | |
// Send Program Message // | |
//------------------------------------------------------------------// | |
dcl-pr SndPgmMsg extpgm('QMHSNDPM'); | |
Id char(07) const; | |
File char(20) const; | |
Data char(256) const; | |
DataLength int(10) const; | |
Type char(10) const; | |
CStEnt char(10) const; | |
CStCnt int(10) const; | |
Key char(04); | |
Error like(DsApierr); | |
end-pr; | |
//------------------------------------------------------------------// | |
// Array - regex_t // | |
//------------------------------------------------------------------// | |
dcl-ds regex_t qualified align based(template); | |
re_nsub int(10); | |
re_comp pointer; | |
re_cflags int(10); | |
re_erroff int(10); | |
re_len int(10); | |
re_ucoll int(10) dim(02); | |
re_lsub pointer dim(reg_count); | |
re_esub pointer dim(reg_count); | |
re_map char(256); | |
re_shift int(05); | |
re_dbcs int(05); | |
end-ds; | |
//------------------------------------------------------------------// | |
// Array - regmatch // | |
//------------------------------------------------------------------// | |
dcl-ds regmatch_t qualified align based(template); | |
rm_so int(10); // Start Offset | |
rm_ss int(05); | |
rm_eo int(10); // End Offset | |
rm_es int(05); | |
end-ds; | |
//------------------------------------------------------------------// | |
// regcomp() - Compile a Regular Expression // | |
//------------------------------------------------------------------// | |
dcl-pr regcomp int(10) extproc(*dclcase); | |
preg like(regex_t); | |
pattern pointer value options(*string); | |
cflags int(10) value; | |
end-pr; | |
//------------------------------------------------------------------// | |
// regexec() - Execute a Regular Expression // | |
//------------------------------------------------------------------// | |
dcl-pr regexec int(10) extproc(*dclcase); | |
preg like(regex_t); | |
string pointer value options(*string); | |
nmatch uns(10) value; | |
pmatch pointer value; | |
eflags int(10) value; | |
end-pr; | |
//------------------------------------------------------------------// | |
// regerror() - Return Error Information // | |
//------------------------------------------------------------------// | |
dcl-pr regerror uns(10) extproc(*dclcase); | |
errcode int(10) value; | |
preg like(regex_t); | |
errbuf pointer value; | |
errbuf_size int(10) value; | |
end-pr; | |
//------------------------------------------------------------------// | |
// regfree() - Free Memory locked by Regular Expression // | |
//------------------------------------------------------------------// | |
dcl-pr regfree extproc(*dclcase); | |
preg like(regex_t); | |
end-pr; | |
//------------------------------------------------------------------// | |
// Array API-Error // | |
//------------------------------------------------------------------// | |
dcl-ds DsApierr qualified inz; // API-Error | |
BytesProv int(10) inz(%size(DsApierr)); // Bytes Provided | |
BytesAvail int(10); // Bytes Avail | |
MsgId char(07); // ErrorMessageId | |
*n char(01); | |
ErrData char(256); // ErrorData | |
end-ds; | |
//------------------------------------------------------------------// | |
// regex Elements Counter // | |
//------------------------------------------------------------------// | |
dcl-c reg_count 20; | |
//------------------------------------------------------------------// | |
// regcomp() flags // | |
//------------------------------------------------------------------// | |
dcl-c reg_basic 0; // Basic RE rules | |
dcl-c reg_extended 1; // Extended RE rules | |
dcl-c reg_icase 2; // Ignore case in match | |
dcl-c reg_newline 4; // Convert <backslash><n> to newline | |
dcl-c reg_nosub 8; // regexec() not report subexpressions | |
//------------------------------------------------------------------// | |
// regexec() flags // | |
//------------------------------------------------------------------// | |
dcl-c reg_notbol 256; // First character not start of line | |
dcl-c reg_noteol 512; // Last character not end of line | |
//------------------------------------------------------------------// | |
// Error-Codes // | |
//------------------------------------------------------------------// | |
dcl-c reg_nomatch 1; // Pattern not found | |
dcl-c reg_badpat 2; // Invalid Regular Expression | |
dcl-c reg_ecollate 3; // Invalid collecting Element | |
dcl-c reg_ectype 4; // Invalid character class | |
dcl-c reg_eescape 5; // Last Character is \ | |
dcl-c reg_esubreg 6; // Invalid number in \digit | |
dcl-c reg_ebrack 7; // Imbalance | |
dcl-c reg_eparen 8; // \( \) or () imbalance | |
dcl-c reg_ebrace 9; // \{ \} or { } imbalance | |
dcl-c reg_badbr 10; // Invalid \{ \} range exp | |
dcl-c reg_erange 11; // Invalid range exp endpoint | |
dcl-c reg_espace 12; // Out of memory | |
dcl-c reg_badrpt 13; // ?*+ not preceded by valid RE | |
dcl-c reg_echar 14; // Invalid multibyte character | |
dcl-c reg_ebol 15; // (shift 6 caret or not) anchor | |
dcl-c reg_eeol 16; // $ anchor and not EOL | |
dcl-c reg_ecomp 17; // Unknown error in regcomp() | |
dcl-c reg_eexec 18; // Unknown error in regexec() | |
//------------------------------------------------------------------// | |
// Main // | |
//------------------------------------------------------------------// | |
dcl-proc main; | |
dcl-ds DsRs likeds(regex_t) inz; // Regex-String | |
dcl-ds DsRm likeds(regmatch_t) dim(20) inz; // Regex-Match | |
dcl-s LocString varchar(128); | |
dcl-s LocPattern varchar(128); | |
dcl-s LocRc int(10); // Return-Code | |
dcl-s LocBuf char(256); // Buffer | |
LocPattern = '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$'; | |
LocString = 'rainer_ross@web.de'; | |
LocRc = regcomp(DsRs:LocPattern:reg_extended + reg_icase); | |
if LocRc <> 0; // Compile Error | |
regerror(LocRc:DsRs:%addr(LocBuf):256); | |
sendPgmMsg('regcomp() failed with: ' + %str(%addr(LocBuf)): | |
'*ESCAPE':'*PGMBDY'); | |
endif; | |
LocRc = regexec(DsRs:LocString:1:%addr(DsRm):0); | |
if LocRc <> 0; // Regex Error | |
regerror(LocRc:DsRs:%addr(LocBuf):256); | |
sendPgmMsg('regexec() failed with: ' + %str(%addr(LocBuf)): | |
'*ESCAPE':'*PGMBDY'); | |
else; | |
sendPgmMsg('regexec(): ' + LocString + ' is true': | |
'*DIAG':'*EXT'); | |
endif; | |
regfree(DsRs); | |
end-proc; | |
//------------------------------------------------------------------// | |
// Send Program Message // | |
//------------------------------------------------------------------// | |
dcl-proc sendPgmMsg export; | |
dcl-pi *n; | |
PiMessage like(LocMessage) const options(*varsize:*trim); | |
PiType char(10) const; | |
PiCStEnt char(10) const; | |
end-pi; | |
dcl-s LocMessage varchar(80); // Message | |
dcl-s LocMsgKey char(04); // Message-Key | |
SndPgmMsg('CPF9898':'QCPFMSG QSYS':PiMessage:%len(PiMessage): | |
PiType:PiCStEnt:1:LocMsgKey:DsApierr); | |
end-proc; | |
//------------------------------------------------------------------// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment