#include #include #include #include #include #include #include #define INIT_SDESC(dsc, len, ptr) {(dsc).dsc$b_dtype = DSC$K_DTYPE_T;\ (dsc).dsc$b_class = DSC$K_CLASS_S; (dsc).dsc$w_length = (len);\ (dsc).dsc$a_pointer = (ptr);} int strelem ( char *dst, char *src, int src_len, char *sep_set, int elem ) { char *cp0,*cp1; int pos; int new_len = 0; cp0 = cp1 = src; *(src+src_len) = 0; for ( ; elem >= 0; elem--) { cp0 = cp1; /* * Search for start of element; */ if ( src_len <= (pos = strspn (cp0,sep_set)) ) return 0; if (*(cp0 +=pos) == 0) return 0; /* * Search for end of element; */ if ( NULL == (cp1 = strpbrk(cp0,sep_set)) ) cp1 = src+src_len; } /* * Compute length of element and coping it to *dst; */ if ( new_len = cp1-cp0 ) { memcpy(dst,cp0,new_len); *(dst+new_len) = 0; } return (new_len); } int strmatch (char *grp,char *pat) { char buf[64]; long status,n; long len; int match_f = 0; int match_ok= 0; struct dsc$descriptor dsc_grp; struct dsc$descriptor dsc_pat; struct dsc$descriptor dsc_buf; INIT_SDESC (dsc_grp,strlen(grp),grp); INIT_SDESC (dsc_pat,strlen(pat),pat); INIT_SDESC (dsc_buf,sizeof(buf),buf); for ( n = 0;;n++ ) { INIT_SDESC (dsc_buf,sizeof(buf),buf); match_f = 1; /* * Get next wildcard pattern from list */ /* * Strip any blank and tabulation characters */ if ( !(len = strelem (buf,pat,dsc_pat.dsc$w_length,", \t",n)) ) break; INIT_SDESC (dsc_buf,len,buf); /* * Check inversion flag */ if ( buf[0] == '!' ) { INIT_SDESC (dsc_buf,--len,&buf[1]); match_f = 0; } printf("\n'%.*s' len= %d ",dsc_buf.dsc$w_length, dsc_buf.dsc$a_pointer, dsc_buf.dsc$w_length); /* * Performing math and check result */ status = str$match_wild(&dsc_grp,&dsc_buf); if (STR$_MATCH == status) { puts("1"); if ( match_f ) { match_ok = 1; } else { return 0; } } printf("\nMatch:%d",match_ok); } printf("\nResult:%d",match_ok); return match_ok; } void main (void) { char *mask = "comp.*,relcom.*,fido7.*,vmsnet.*,!*.binaries"; char *group="comp.os.vms.binaries"; printf("\n %s - %s - ",group,mask); printf("%s ",(strmatch (group,mask))?"+Match":"-No Match"); printf("\n %s %s - ",mask,group); }