My post has been deleted from wrong forum by moderators.
Here is slightly updated copy FYI.
My version is using REXX as REXX, neither as COBOL, nor as C/C++, nor anything else.
For nails, a hammer is the best tool, while for screws a screwdriver is more suitable. For bolts the best tool is a wrench. Not vice versa; do not mix them!
If WildChar = '' Then WildChar = '?'
Else WildChar = Left( WildChar, 1 )
Do While StrMask > ''
Parse var StrMask, /* split by the first '*' */
PreWild (StrChar) StrMask
If PreWild > '' Then Do /* check left from '*' as simple wildcard */
LeftStr = Left( String, Length(PreWild) ) /* same size fragment */
If ¬ $WildEq( LeftStr, PreWild, WildChar ) Then
Return 0
End
If StrMask = '' Then /* whole string verified successfully */
Return 1
/* try to match the '*' found as next part */
Do i = (Length(PreWild) + 1) To Length(String)
/* skip left characters one by one; verify the rest recursively */
RestStr = Substr( String, i )
If $WildStr( RestStr, StrMask, StrChar, WildChar ) Then
Return 1
End i
End
Return 0
/**********************************************************************/
$WildEQ: /* verify String against simple WildMask */ procedure
/* Call:
If $WildEQ( MemberName, 'ABC???01' ) Then ...
If $WildEQ( MemberName, 'ABC%%%01', '%' ) Then ...
*/
Parse Arg String, WildMask, WildChar
If WildChar = '' Then WildChar = '?'
Else WildChar = Left( WildChar, 1 )
Three types of wildcard handler:
1) If $WildDSN(...) - to verify specific zOS DSNAME syntax rules, with '**', '*', and '%' masks
2) If $WildCard(...) - to verify complex string wildcard with '*', and '?' masks
3) If $WildWord(...) - to verify simple words with '?' masks only
return
/**********************************************************************/
$WildDSN: /* verify DSNAME against complex StrMask */ procedure
/* Call:
If $WildDSN( DSNAME, 'SYSXXX.A*.B%C.*.TASK*.**.PROCLIB' ) Then ...
*/
Parse Arg DSNAME, DSNMask
If Length(DSNAME) > 44,
| Length(DSNAME) < 1 Then
Return 0
Do While DSNMask > ''
Parse var DSNAME PreDSN '.' .
If ¬ $IsDSNPart( PreDSN ) Then /* bad part of DSNAME found */
Return 0
Parse var DSNMask PreQual '.' DSNMask
If PreQual = '**' Then Do /* handle DSN part of any size */
Do While PreDSN > ''
If $WildDSN( DSNAME, DSNMask ) Then
Return 1
Else
Parse var DSNAME PreDSN '.' DSNAME
End
End
Else If $WildCard( PreDSN, PreQual, '*', '%' ) Then Do
Parse var DSNAME . '.' DSNAME /* skip good part */
If DSNAME = '' Then
Return (DSNMask = '')
End
Else
Return 0 /* non-matching part detected */
End /* DSNMask > '' */
Return 0
/**********************************************************************/
$WildCard: /* verify String against complex StrMask */ procedure
/* Call:
If $WildCard( MemberName, '*AB*C???0*1*' ) Then ...
If $WildCard( MemberName, '*AB*C%%%0*1*', , '%' ) Then ...
If $WildCard( MemberName, '~AB~C???0~1~', '~' ) Then ...
*/
If WildChar = '' Then WildChar = '?'
Else WildChar = Left( WildChar, 1 )
Do While StrMask > ''
Parse var StrMask, /* split by the first '*' */
PreWild (StrChar) StrMask
If PreWild > '' Then Do /* check left from '*' as simple wildcard */
LeftStr = Left( String, Length(PreWild) ) /* same size fragment */
If ¬ $WildWord( LeftStr, PreWild, WildChar ) Then
Return 0
End
If StrMask = '' Then /* whole string verified successfully */
Return 1
/* try to match the '*' found as next part */
Do i = (Length(PreWild) + 1) To Length(String)
/* skip left characters one by one; verify the rest recursively */
RestStr = Substr( String, i )
If $WildCard( RestStr, StrMask, StrChar, WildChar ) Then
Return 1
End i
End
Return 0
/**********************************************************************/
$WildWord: /* verify String against simple WildMask */ procedure
/* Call:
If $WildWord( MemberName, 'ABC???01' ) Then ...
If $WildWord( MemberName, 'ABC%%%01', '%' ) Then ...
*/
Parse Arg String, WildMask, WildChar
If WildChar = '' Then WildChar = '?'
Else WildChar = Left( WildChar, 1 )