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
_________________
Tyrannosaurus-REXX
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