Quantcast
Channel: IBM Mainframe Computers Forums
Viewing all articles
Browse latest Browse all 9405

CLIST & REXX :: RE: Reasonable way of checking wildcards using REXX

$
0
0
Author: sergeyken
Subject: Adding wildcard analyzer for DSNAME
Posted: Fri Sep 09, 2016 9:43 pm (GMT 5.5)

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

Code:
/* REXX */
WILDCARD_Test:

Wild = 'A?C*3'
Str = 'ABC123'
Say "$WildCard( '"Str"', '"Wild"' ) ==>" $WildCard( Str, Wild )

Wild = 'A?C*3??5*'
Str = 'ABC---3xx5yyyyy'
Say "$WildCard( '"Str"', '"Wild"' ) ==>" $WildCard( Str, Wild )

Wild = '*A?C*3??5*'
Str = 'zzzzzzABC---3xx5yyyyy'
Say "$WildCard( '"Str"', '"Wild"' ) ==>" $WildCard( Str, Wild )

Wild = 'A?C*3??5*'
Str = 'ABC---3xxxx5yyyyy'
Say "$WildCard( '"Str"', '"Wild"' ) ==>" $WildCard( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS1.PROCLIB'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.PROCLIB'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.PROCFILE'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.SPECIAL.PROCFILE'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.*LIB'
Str = 'SYS1.PROCLIB'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.*LIB'
Str = 'SYS1.1ROCLIB'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.PR!CLIB'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.PROCFILEXXX'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

Wild = 'SYS%.**.PROC*'
Str = 'SYS2.SPECIALLONG.PROCFILE'
Say "$WildDSN( '"Str"', '"Wild"' ) ==>" $WildDSN( Str, Wild )

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 ...
*/

Parse Arg String, StrMask, StrChar, WildChar
If StrChar = '' Then StrChar = '*'
Else                 StrChar = Left( StrChar, 1 )

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 )

LowMask = Translate( WildMask, '00'x, WildChar )
HiMask  = Translate( WildMask, 'FF'x, WildChar )

LowString = BitOr( LowMask, String, ' ' )
HiString = BitAnd( HiMask,  String, ' ' )

Return (LowString == HiString)
/**********************************************************************/
$IsDSNPart: /* verify single DSN qualifier */ procedure
/* Call:
      If $IsDSNPart( String ) Then ...
*/
Parse Arg String .
StrSize = Length(String)
LeftChar = Left( String, 1 )

Return (StrSize > 0 & StrSize <= 8) ,
     & 0 = Verify( LeftChar, '@#$ABCDEFGHIJKLMNOPQRSTUVWXYZ' ) ,
     & 0 = Verify( String, '@#$ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' )
/**********************************************************************/

_________________
Tyrannosaurus-REXX


Viewing all articles
Browse latest Browse all 9405

Trending Articles