Skip to content

Instantly share code, notes, and snippets.

@RainerRoss
Last active March 20, 2022 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save RainerRoss/a36f9a9c7667b03ca0cd572b239ff211 to your computer and use it in GitHub Desktop.
Save RainerRoss/a36f9a9c7667b03ca0cd572b239ff211 to your computer and use it in GitHub Desktop.
regexForEmail
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