Exemple #1
0
int
scanmatchtable(HashTable ht, Comp com, int flags1, int flags2, ScanFunc scanfunc, int scanflags)
{
    HashNode hn;
    int i, match = 0;

    /* ignore the flags */
    if (!flags1 && !flags2) {
	for (i = 0; i < ht->hsize; i++) {
	    for (hn = ht->nodes[i]; hn; hn = hn->next) {
		if (domatch(hn->nam, com, 0)) {
		    scanfunc(hn, scanflags);
		    match++;
		}
	    }
	}
    return match;
    }

    /* flags in flags1 must be set */
    if (flags1 && !flags2) {
	for (i = 0; i < ht->hsize; i++) {
	    for (hn = ht->nodes[i]; hn; hn = hn->next) {
		if (domatch(hn->nam, com, 0) && (hn->flags & flags1)) {
		    scanfunc(hn, scanflags);
		    match++;
		}
	    }
	}
    return match;
    }

    /* flags in flags2 must NOT be set */
    if (!flags1 && flags2) {
	for (i = 0; i < ht->hsize; i++) {
	    for (hn = ht->nodes[i]; hn; hn = hn->next) {
		if (domatch(hn->nam, com, 0) && !(hn->flags & flags2)) {
		    scanfunc(hn, scanflags);
		    match++;
		}
	    }
	}
    return match;
    }

    /* flags in flags1 must be set,    *
     * flags in flags2 must NOT be set */
    for (i = 0; i < ht->hsize; i++) {
	for (hn = ht->nodes[i]; hn; hn = hn->next) {
	    if (domatch(hn->nam, com, 0) && (hn->flags & flags1) && !(hn->flags & flags2)) {
		scanfunc(hn, scanflags);
		match++;
	    }
	}
    }
    return match;
}
Exemple #2
0
/* Find the pattern (p) in the text string (t). */
int wildmatch(const char *p, const char *t)
{
#ifdef WILD_TEST_ITERATIONS
    wildmatch_iteration_count = 0;
#endif
    return domatch((const uchar*)p, (const uchar*)t) == TRUE;
}
Exemple #3
0
// Public API to matcher
bool fxfilematch(const char *pattern,const char *string,FXuint flags){
  register const char *p=pattern;
  register const char *q=string;
  register int level;
  if(p && q){
nxt:if(domatch(p,q,flags)) return true;
    for(level=0; *p && 0<=level; ){
      switch(*p++){
        case '\\': if(*p) p++; break;
        case '(': level++; break;
        case ')': level--; break;
        case '|':
        case ',': if (level==0) goto nxt;
        }
      }
    }
  return false;
  }
Exemple #4
0
// Perform match
static bool domatch(const char *pattern,const char *string,FXuint flags){
  register const char *p=pattern;
  register const char *q=string;
  register const char *s;
  register char c,cs,ce,cc,neg;
  register int level;
  while((c=*p++)!='\0'){
    switch(c){
      case '?':
        if(*q=='\0') return false;
        if((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(*q)) return false;
        if((flags&FILEMATCH_PERIOD) && (*q=='.') && ((q==string) || ((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(*(q-1))))) return false;
        q++;
        break;
      case '*':
        c=*p;
        while(c=='*') c=*++p;
        if((flags&FILEMATCH_PERIOD) && (*q=='.') && ((q==string) || ((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(*(q-1))))) return false;
        if(c=='\0'){    // Optimize for case of trailing '*'
          if(flags&FILEMATCH_FILE_NAME){ for(s=q; *s; s++){ if(ISPATHSEP(*s)) return false; } }
          return 1;
          }
        while(!domatch(p,q,flags&~FILEMATCH_PERIOD)){
          if((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(*q)) return false;
          if(*q++=='\0') return false;
          }
        return 1;
      case '[':
        if(*q=='\0') return false;
        if((flags&FILEMATCH_PERIOD) && (*q=='.') && ((q==string) || ((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(*(q-1))))) return false;
        cc=FOLD(*q);
        neg=((*p=='!') || (*p=='^'));
        if(neg) p++;
        c=*p++;
        do{
          if(c=='\\' && !(flags&FILEMATCH_NOESCAPE)) c=*p++;
          cs=ce=FOLD(c);
          if(c=='\0') return false;
          c=*p++;
          c=FOLD(c);
          if((flags&FILEMATCH_FILE_NAME) && ISPATHSEP(c)) return false;
          if(c=='-' && *p!=']'){
            c = *p++;
            if(c=='\\' && !(flags&FILEMATCH_NOESCAPE)) c=*p++;
            if(c=='\0') return false;
            ce=FOLD(c);
            c=*p++;
            }
          if(((FXuchar)cs)<=((FXuchar)cc) && ((FXuchar)cc)<=((FXuchar)ce)) goto match;
          }
        while(c!=']');
        if(!neg) return false;
        q++;
        break;
match:  while(c!=']'){
          if(c=='\0') return false;
          c=*p++;
          if(c=='\\' && !(flags&FILEMATCH_NOESCAPE)) p++;
          }
        if(neg) return false;
        q++;
        break;
      case '(':
nxt:    if(domatch(p,q,flags)) return true;
        for(level=0; *p && 0<=level; ){
          switch(*p++){
            case '\\': if(*p) p++; break;
            case '(': level++; break;
            case ')': level--; break;
            case '|':
            case ',': if (level==0) goto nxt;
            }
          }
        return false;
      case ')':
        break;
      case '|':
      case ',':
        for(level=0; *p && 0<=level; ){
          switch(*p++){
            case '\\': if(*p) p++; break;
            case '(': level++; break;
            case ')': level--; break;
            }
          }
        break;
      case '\\':
        if(*p && !(flags&FILEMATCH_NOESCAPE)) c=*p++;   // Trailing escape represents itself
      default:
        if(FOLD(c)!=FOLD(*q)) return false;
        q++;
        break;
      }
    }
  return (*q=='\0') || (ISPATHSEP(*q) && (flags&FILEMATCH_LEADING_DIR));
  }
Exemple #5
0
static int domatch(const uchar *p, const uchar *text)
{
    int matched, special;
    uchar ch, prev;

#ifdef WILD_TEST_ITERATIONS
    wildmatch_iteration_count++;
#endif

    for ( ; (ch = *p) != '\0'; text++, p++) {
	if (*text == '\0' && ch != '*')
	    return FALSE;
	switch (ch) {
	  case '\\':
	    /* Literal match with following character.  Note that the test
	     * in "default" handles the p[1] == '\0' failure case. */
	    ch = *++p;
	    /* FALLTHROUGH */
	  default:
	    if (*text != ch)
		return FALSE;
	    continue;
	  case '?':
	    /* Match anything but '/'. */
	    if (*text == '/')
		return FALSE;
	    continue;
	  case '*':
	    if (*++p == '*') {
		while (*++p == '*') {}
		special = TRUE;
	    }
	    else
		special = FALSE;
	    if (*p == '\0') {
		/* Trailing "**" matches everything.  Trailing "*" matches
		 * only if there are no more slash characters. */
		return special? TRUE : strchr((char*)text, '/') == NULL;
	    }
	    for ( ; *text; text++) {
		if ((matched = domatch(p, text)) != FALSE) {
		    if (!special || matched != ABORT_TO_STARSTAR)
			return matched;
		}
		else if (!special && *text == '/')
		    return ABORT_TO_STARSTAR;
	    }
	    return ABORT_ALL;
	  case '[':
	    ch = *++p;
#ifdef NEGATE_CLASS2
	    if (ch == NEGATE_CLASS2)
		ch = NEGATE_CLASS;
#endif
	    /* Assign literal TRUE/FALSE because of "matched" comparison. */
	    special = ch == NEGATE_CLASS? TRUE : FALSE;
	    if (special) {
		/* Inverted character class. */
		ch = *++p;
	    }
	    prev = 0;
	    matched = FALSE;
	    do {
		if (!ch)
		    return ABORT_ALL;
		if (ch == '\\') {
		    ch = *++p;
		    if (!ch)
			return ABORT_ALL;
		    if (*text == ch)
			matched = TRUE;
		}
		else if (ch == '-' && prev && p[1] && p[1] != ']') {
		    ch = *++p;
		    if (ch == '\\') {
			ch = *++p;
			if (!ch)
			    return ABORT_ALL;
		    }
		    if (*text <= ch && *text >= prev)
			matched = TRUE;
		    ch = 0; /* This makes "prev" get set to 0. */
		}
		else if (ch == '[' && p[1] == ':') {
		    const uchar *s;
		    int i;
		    for (s = p += 2; (ch = *p) && ch != ']'; p++) {}
		    if (!ch)
			return ABORT_ALL;
		    i = p - s - 1;
		    if (i < 0 || p[-1] != ':') {
			/* Didn't find ":]", so treat like a normal set. */
			p = s - 2;
			ch = '[';
			if (*text == ch)
			    matched = TRUE;
			continue;
		    }
		    if (CC_EQ(s,i, "alnum")) {
			if (ISALNUM(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "alpha")) {
			if (ISALPHA(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "blank")) {
			if (ISBLANK(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "cntrl")) {
			if (ISCNTRL(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "digit")) {
			if (ISDIGIT(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "graph")) {
			if (ISGRAPH(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "lower")) {
			if (ISLOWER(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "print")) {
			if (ISPRINT(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "punct")) {
			if (ISPUNCT(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "space")) {
			if (ISSPACE(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "upper")) {
			if (ISUPPER(*text))
			    matched = TRUE;
		    }
		    else if (CC_EQ(s,i, "xdigit")) {
			if (ISXDIGIT(*text))
			    matched = TRUE;
		    }
		    else /* malformed [:class:] string */
			return ABORT_ALL;
		    ch = 0; /* This makes "prev" get set to 0. */
		}
		else if (*text == ch)
		    matched = TRUE;
	    } while (prev = ch, (ch = *++p) != ']');
	    if (matched == special || *text == '/')
		return FALSE;
	    continue;
	}
    }

    return *text == '\0';
}