Пример #1
0
char *test_simple_matches()
{
    m = pattern_match("ZED", strlen("ZED"), "ZED");
    mu_assert(m != NULL, "Should match literal identically.");

    m = pattern_match("ZED", strlen("ZED"), "Z.D");
    mu_assert(m != NULL, "Should match wildcard.");

    m = pattern_match("ZED", strlen("ZED"), "FOO");
    mu_assert(m == NULL, "Should not match.");

    return NULL;
}
Пример #2
0
char *test_anchors()
{
    m = pattern_match("ZED", strlen("ZED"), "ZED$");
    mu_assert(m != NULL, "Should match. Anchor at the end.");

    m = pattern_match("ZED", strlen("ZED"), "ZE$");
    mu_assert(m == NULL, "Should not match. Should have ended at $.'");

    m = pattern_match("ZED", strlen("ZED"), "ED");
    mu_assert(m == NULL, "Should not match. Implicit anchor at the start of pattern.");

    return NULL;
}
Пример #3
0
char *test_set()
{
    m = pattern_match("ZED", strlen("ZED"), "Z[OE]D");
    mu_assert(m != NULL, "Should match.");

    m = pattern_match("ZED", strlen("ZED"), "Z[^OE]D");
    mu_assert(m == NULL, "Should not match.");

    m = pattern_match("ZED", strlen("ZED"), "Z[A-Z]D");
    mu_assert(m != NULL, "Should match.");

    return NULL;
}
Пример #4
0
char *test_optional()
{
    m = pattern_match("ZED", strlen("ZED"), "ZEE?D");
    mu_assert(m != NULL, "Should match.");

    m = pattern_match("ZEED", strlen("ZEED"), "ZEE?D");
    mu_assert(m != NULL, "Should match wildcard.");

    m = pattern_match("ZEEED", strlen("ZEEED"), "ZEE?D");
    mu_assert(m == NULL, "Should not match.");

    return NULL;
}
Пример #5
0
char *test_balance()
{
    // balanced string match, matches the {...} contents
    m = pattern_match("/users/{1234}", strlen("/users/{1234}"), "/users/\\b{}");
    mu_assert(m != NULL, "Should match balanced chars.");

    m = pattern_match("/users/{1234", strlen("/users/{1234}"), "/users/\\b{}");
    mu_assert(m == NULL, "Should not match balanced unchars.");

    m = pattern_match("/users/1234}", strlen("/users/{1234}"), "/users/\\b{}");
    mu_assert(m == NULL, "Should not match balanced unchars.");

    return NULL;
}
Пример #6
0
static bool
pattern_match (const char *pattern, const char *string)
{
  const char *p = pattern, *n = string;
  char c;
  for (; (c = TOLOWER (*p++)) != '\0'; n++)
    if (c == '*')
      {
        for (c = TOLOWER (*p); c == '*'; c = TOLOWER (*++p))
          ;
        for (; *n != '\0'; n++)
          if (TOLOWER (*n) == c && pattern_match (p, n))
            return true;
#ifdef ASTERISK_EXCLUDES_DOT
          else if (*n == '.')
            return false;
#endif
        return c == '\0';
      }
    else
      {
        if (c != TOLOWER (*n))
          return false;
      }
  return *n == '\0';
}
Пример #7
0
/*
 * This does the UNIx style ^xx^yy replace search. Only affects last
 * command and display "Modified failed." on a no match.
 */
void history_sub(char *args)
{
    char *p;
    char buf[MAXSIZ];
    char pat[MAXSIZ];

    p = strchr(args, '^');

    if (!p) {
        msg("-- No specified modifier.");

        return;
    }

    *p = '\0';
    sprintf(pat, "*%s*", args);

    if (!pattern_match(hist_cur->prev->line, pat, pattern)) {
        msg("-- Modifier failed.");

        return;
    } else {
        sprintf(buf, "%s%s%s", pattern1, p + 1, pattern2);
        msg("%s", buf);
        process_key(buf, false);
        add_history(buf);
    }
}
Пример #8
0
 vector<vector<string>> groupStrings(vector<string>& strings) {
     vector<vector<string>> result;
     
     for(int i = 0;i < strings.size();i++)
     {
         string cur = strings[i];
         bool match(false);
         for(int j = 0;j < result.size();j++)
         {
             if(pattern_match(cur, result[j][0]))
             {
                 result[j].push_back(cur);
                 match = true;
                 break;
             }
         }
         if(!match)
         {
             vector<string> pattern;
             pattern.push_back(cur);
             result.push_back(pattern);
         }
     }
     
     for(int i = 0;i < result.size();i++)
         sort(result[i].begin(), result[i].end());
     return result;
 }
Пример #9
0
static int check_exception(struct patterns_data* pdata, const char* message, int pattern_id, enum auth_credentials credentials)
{
	sqlite3_stmt *res;
	char query[50];
	int error = 0;
	int exception = 0;
	const char *tail;
	enum auth_credentials mincred;
	enum auth_credentials maxcred;

	int n = sprintf(query, "SELECT * FROM pattern_exceptions WHERE pattern_id=%d;", pattern_id);

	error = sqlite3_prepare_v2(pdata->db, query, n, &res, &tail);

	while (sqlite3_step(res) == SQLITE_ROW)
	{
		auth_string_to_cred((char*) sqlite3_column_text(res, 3), &mincred);
		auth_string_to_cred((char*) sqlite3_column_text(res, 4), &maxcred);

		if (maxcred >= credentials && mincred <= credentials && pattern_match(message, (char*) sqlite3_column_text(res, 1)))
		{
			exception = 1;
		}
	}

	sqlite3_finalize(res);

	return exception;
}
Пример #10
0
int	HttpsRetriever::pattern_match (const char *pattern, const char *string)
{

	  const char *p = pattern, *n = string;
	  char c;
	  for (; (c = tolower(*p++)) != '\0'; n++)
	    if (c == '*')
	      {
		for (c = tolower (*p); c == '*'; c = tolower (*++p))
		  ;
		for (; *n != '\0'; n++)
		  if (tolower (*n) == c && pattern_match (p, n))
		    return 1;
#ifdef ASTERISK_EXCLUDES_DOT
		  else if (*n == '.')
		    return 0;
#endif
		return c == '\0';
	      }
	    else
	      {
		if (c != tolower (*n))
		  return 0;
	      }
	  return *n == '\0';
}
Пример #11
0
int main(int argc, char **argv)
{
  char line[MAXLINE];
  char *pattern;
  progn = argv[0];

  if(argc!=2) {
    usage();
    return EXIT_FAILURE;
  }
  pattern = argv[1];

  while(!feof(stdin) && !ferror(stdin)) {
    if(!fgets(line,sizeof(line),stdin)) {
      break;
    }
    if(pattern_match(pattern,line)) {
      printf("%s",line);
    }
  }
  if(ferror(stdin)) {
    perror(progn);
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}
Пример #12
0
int connection_msg_to_handler(Connection *conn)
{
    Handler *handler = Request_get_action(conn->req, handler);
    int rc = 0;
    int header_len = Request_header_length(conn->req);
    // body_len will include \0
    int body_len = Request_content_length(conn->req);

    check(handler, "JSON request doesn't match any handler: %s", 
            bdata(Request_path(conn->req)));

    if(pattern_match(IOBuf_start(conn->iob), header_len + body_len, bdata(&PING_PATTERN))) {
        Register_ping(IOBuf_fd(conn->iob));
    } else {
        check(body_len >= 0, "Parsing error, body length ended up being: %d", body_len);

        bstring payload = Request_to_payload(conn->req, handler->send_ident,
                IOBuf_fd(conn->iob), IOBuf_start(conn->iob) + header_len,
                body_len - 1);  // drop \0 on payloads


        rc = Handler_deliver(handler->send_socket, bdata(payload), blength(payload));
        bdestroy(payload);
    
        check(rc == 0, "Failed to deliver to handler: %s", bdata(Request_path(conn->req)));
    }

    // consumes \0 from body_len
    IOBuf_read_commit(conn->iob, header_len + body_len);

    return REQ_SENT;

error:
    return CLOSE;
}
Пример #13
0
/* la sortie...								   */
int read_server_for_list (char *ligne, int deb, int max) {
    int ret;
    char *buf;

    if (renvoie_courte_liste==1) {
       renvoie_courte_liste=0;
       strcpy(ligne,".\r\n");
       return 3;
    } else if (renvoie_courte_liste==2) {
       if (ligne!=tcp_line_read) strcpy(ligne,tcp_line_read);
       renvoie_courte_liste=1;
       return strlen(tcp_line_read);
    }
    if (filter_cmd_list[0]=='\0') return read_server(ligne,deb,max);
    while (1) {
      ret=read_server(ligne,deb,max);
      if (ligne[1]=='\r') return ret;
      buf=strchr(ligne,' ');
      if (buf) *buf='\0';
      if (pattern_match(ligne,filter_cmd_list)) {
         if (buf) *buf=' ';
	 return ret;
      }
    }
}
Пример #14
0
int
ListCatalogues(const char *pattern, int patlen, int maxnames,
	       char **catalogues, int *len)
{
    int         count = 0;
    char       *catlist = NULL;
    int         size = 0;

    if (maxnames) {
	if (pattern_match(pattern, patlen, catalogue_name)) {
	    size = strlen(catalogue_name);
	    catlist = (char *) fsalloc(size + 1);
	    if (!catlist)
		goto bail;
	    *catlist = size;
	    memmove( &catlist[1], catalogue_name, size);
	    size++;		/* for length */
	    count++;
	}
    }
bail:
    *len = size;
    *catalogues = catlist;
    return count;
}
Пример #15
0
void cfs_normalize(char url[CHIRP_PATH_MAX])
{
	char *root = NULL;
	char *rest = NULL;

	if(strprfx(url, "chirp:")) {
		return;
	} else if(strprfx(url, "hdfs:")) {
		return;
	} else if(pattern_match(url, "^confuga://([^?]*)(.*)", &root, &rest) >= 0) {
		char absolute[PATH_MAX];
		path_absolute(root, absolute, 0);
		debug(D_CHIRP, "normalizing url `%s' as `confuga://%s%s'", url, absolute, rest);
		snprintf(url, CHIRP_PATH_MAX, "confuga://%s%s", absolute, rest);
	} else {
		char absolute[PATH_MAX];
		if(strprfx(url, "file:") || strprfx(url, "local:"))
			path_absolute(strstr(url, ":") + 1, absolute, 0);
		else
			path_absolute(url, absolute, 0);
		debug(D_CHIRP, "normalizing url `%s' as `local://%s'", url, absolute);
		strcpy(url, "local://");
		strcat(url, absolute);
	}
	free(root);
	free(rest);
}
Пример #16
0
static int do_ls(int argc, char **argv)
{
	u8 buf[256], *cur = buf;
	int r, count;

	r = sc_list_files(card, buf, sizeof(buf));
	if (r < 0) {
		check_ret(r, SC_AC_OP_LIST_FILES, "unable to receive file listing", current_file);
		return -1;
	}
	count = r;
	printf("FileID\tType  Size\n");
	while (count >= 2) {
		sc_path_t path;
		sc_file_t *file = NULL;
		char filename[10];
		int i = 0;
		int matches = 0;

		/* construct file name */
		sprintf(filename, "%02X%02X", cur[0], cur[1]);

		 /* compare file name against patterns */
		for (i = 0; i < argc; i++) {
			if (pattern_match(argv[i], filename)) {
				matches = 1;
				break;
			}
		}

		/* if any filename pattern were given, filter only matching file names */
		if (argc == 0 || matches) {
			if (current_path.type != SC_PATH_TYPE_DF_NAME) {
				path = current_path;
				sc_append_path_id(&path, cur, 2);
			} else {
				if (sc_path_set(&path, SC_PATH_TYPE_FILE_ID, cur, 2, 0, 0) != SC_SUCCESS) {
					printf("unable to set path.\n");
					die(1);
				}
			}

			r = sc_select_file(card, &path, &file);
			if (r) {
				printf(" %02X%02X unable to select file, %s\n", cur[0], cur[1], sc_strerror(r));
			} else {
				file->id = (cur[0] << 8) | cur[1];
					print_file(file);
				sc_file_free(file);
			}
		}
		cur += 2;
		count -= 2;
		select_current_path_or_die();
	}
	return 0;
}
Пример #17
0
char *test_frontier()
{
    // the frontier pattern, kinda weird, could be useful
    // used to find patterns between two other patterns
    m = pattern_match("THE (QUICK) brOWN FOx JUMPS",
             strlen("THE (QUICK) brOWN FOx JUMPS"), "\\f[\\a]\\u-\\f[\\a]");
    mu_assert(m != NULL, "Should match.");

    return NULL;
}
Пример #18
0
static int pattern_match (const TCHAR *str, const TCHAR *pattern)
{
	enum State {
		Exact,        // exact match
		Any,        // ?
		AnyRepeat    // *
	};

	const TCHAR *s = str;
	const TCHAR *p = pattern;
	const TCHAR *q = 0;
	int state = 0;

	int match = TRUE;
	while (match && *p) {
		if (*p == '*') {
			state = AnyRepeat;
			q = p+1;
		} else if (*p == '?') state = Any;
		else state = Exact;

		if (*s == 0) break;

		switch (state) {
		case Exact:
			match = *s == *p;
			s++;
			p++;
			break;

		case Any:
			match = TRUE;
			s++;
			p++;
			break;

		case AnyRepeat:
			match = TRUE;
			s++;

			if (*s == *q){
				// make a recursive call so we don't match on just a single character
				if (pattern_match(s,q) == TRUE) {
					p++;
				}
			}
			break;
		}
	}

	if (state == AnyRepeat) return (*s == *q);
	else if (state == Any) return (*s == *p);
	else return match && (*s == *p);
} 
Пример #19
0
boolean pattern_match_simple(const char *pattern, const char *string)
{
	PatternSpec *pspec;
	boolean ergo;

	pspec = pattern_spec_init(pattern);
	ergo = pattern_match(pspec, strlen(string), string, NULL);
	pattern_spec_free(pspec);

	return ergo;
}
Пример #20
0
bool patternlist_match(char **patlist,const char *str)
/* match string against a list of patterns */
{
  if (patlist) {
    while (*patlist) {
      if (pattern_match(*patlist,str))
        return (TRUE);
      patlist++;
    }
  }
  return (FALSE);
}
Пример #21
0
int match_gag(char *pat)
{
    Gag *p;

    for (p = gag_head; p; p = p->next) {
        if (pattern_match(pat, p->name, pattern)) {
            return 1;
        }
    }

    return 0;
}
Пример #22
0
static int fl_match(tn_tuple *fl, struct pattern *pt) 
{
    int i, j, match = 0;
    

    for (i=0; i < n_tuple_size(fl); i++) {
        struct pkgfl_ent    *flent = n_tuple_nth(fl, i);
        char                path[PATH_MAX], *dn;
        int                 n;

        dn = flent->dirname;
        if (*dn == '/') {
            n_assert(*(dn + 1) == '\0');
            n = n_snprintf(path, sizeof(path), dn);
            
        } else {
            n = n_snprintf(path, sizeof(path), "/%s/", dn);
        }

        for (j=0; j < flent->items; j++) {
            struct flfile *f = flent->files[j];
            int nn;

            if (S_ISLNK(f->mode)) {
                char *name;

                name = f->basename + strlen(f->basename) + 1;
                if ((match = pattern_match(pt, name, 0)))
                    goto l_end;
            }
            
            nn = n_snprintf(&path[n], sizeof(path) - n, "%s", f->basename);
            if ((match = pattern_match(pt, path, n + nn)))
                goto l_end;
        }
    }
    
l_end:
    return match;
}
Пример #23
0
// static
bool LLMediaEntry::checkUrlAgainstWhitelist(const std::string& url, 
                                            const std::vector<std::string> &whitelist)
{
    bool passes = true;
    // *NOTE: no entries?  Don't check
    if (whitelist.size() > 0) 
    {
        passes = false;
            
        // Case insensitive: the reason why we toUpper both this and the
        // filter
        std::string candidate_url = url;
        // Use lluri to see if there is a path part in the candidate URL.  No path?  Assume "/"
        LLURI candidate_uri(candidate_url);
        std::vector<std::string>::const_iterator iter = whitelist.begin();
        std::vector<std::string>::const_iterator end = whitelist.end();
        for ( ; iter < end; ++iter )
        {
            std::string filter = *iter;
                
            LLURI filter_uri(filter);
            bool scheme_passes = pattern_match( candidate_uri.scheme(), filter_uri.scheme() );
            if (filter_uri.scheme().empty()) 
            {
                filter_uri = LLURI(DEFAULT_URL_PREFIX + filter);
            }
            bool authority_passes = pattern_match( candidate_uri.authority(), filter_uri.authority() );
            bool path_passes = pattern_match( candidate_uri.escapedPath(), filter_uri.escapedPath() );

            if (scheme_passes && authority_passes && path_passes)
            {
                passes = true;
                break;
            }
        }
    }
    return passes;
}
Пример #24
0
char *test_blocks()
{
    // ( and ) are ignored but allowed for routing system later
    m = pattern_match("ZED", strlen("ZEED"), "Z(ED)");
    mu_assert(m != NULL, "Should match.");

    bstring s = bfromcstr("ZED");
    bstring p = bfromcstr("Z(ED)");
    m = bstring_match(s, p);
    mu_assert(m != NULL, "Should match.");

    bdestroy(s); bdestroy(p);
    return NULL;
}
Пример #25
0
char *test_escaped()
{
    // char classes, which map to C functions:
    // \a : isalpha(c)
    // \c : iscntrl(c)
    // \d : isdigit(c)
    // \l : islower(c)
    // \p : ispunct(c)
    // \s : isspace(c)
    // \u : isupper(c)
    // \w : isalnum(c)
    // \x : isxdigit(c)
    // \z : (c == 0)  // NUL terminator

    m = pattern_match("a \t 9 l . \n U w A \0", 19, "\\a \\c \\d \\l \\p \\s \\u \\w \\x \\z");

    mu_assert(m != NULL, "Should match.");

    // escaped, non-class characters map to themselves

    m = pattern_match("ZED", strlen("ZED"), "Z\\ED");

    mu_assert(m != NULL, "Should match.");

    // escaped special characters are depowered

    m = pattern_match("*Z*E+D.", strlen("*Z*E+D."), "\\*Z\\*E\\+D\\.");

    mu_assert(m != NULL, "Should match.");

    m = pattern_match("ZED!", strlen("ZED!"), "ZED\\.");

    mu_assert(m == NULL, "Should not match.");

    return NULL;
}
Пример #26
0
	void database_type::match(std::unordered_set<std::string> & result, const std::string & pattern) const
	{
		if (pattern == "*") {
			for (auto it = values.begin(), end = values.end(); it != end; ++it) {
				auto & key = it->first;
				result.insert(key);
			}
		} else {
			for (auto it = values.begin(), end = values.end(); it != end; ++it) {
				auto & key = it->first;
				if (pattern_match(pattern, key)) {
					result.insert(key);
				}
			}
		}
	}
Пример #27
0
/*
 * Recalls all nodes from recall list matching <args> utilizes the
 * pattern_match function.
 */
void recall_match(char *args, int type)
{
    Node *p;

    for (p = recall_head; p; p = p->next) {
        if (type && !p->type) {
            continue;
        }

        if (pattern_match(p->line, args, pattern)) {
            msg("%s", p->line);
        }
    }

    msg("-- end of %s", (type ? "convo" : "recall"));
}
Пример #28
0
int connection_msg_to_handler(Connection *conn)
{
    Handler *handler = Request_get_action(conn->req, handler);
    int rc = 0;
    int header_len = Request_header_length(conn->req);
    // body_len will include \0
    int body_len = Request_content_length(conn->req);

    check(handler, "JSON request doesn't match any handler: %s", 
            bdata(Request_path(conn->req)));

    if(pattern_match(IOBuf_start(conn->iob), header_len + body_len, bdata(&PING_PATTERN))) {
        Register_ping(IOBuf_fd(conn->iob));
    } else {
        check(body_len >= 0, "Parsing error, body length ended up being: %d", body_len);
        bstring payload = NULL;

        if(handler->protocol == HANDLER_PROTO_TNET) {
            payload = Request_to_tnetstring(conn->req, handler->send_ident,
                    IOBuf_fd(conn->iob), IOBuf_start(conn->iob) + header_len,
                    body_len - 1);  // drop \0 on payloads
        } else if(handler->protocol == HANDLER_PROTO_JSON) {
            payload = Request_to_payload(conn->req, handler->send_ident,
                    IOBuf_fd(conn->iob), IOBuf_start(conn->iob) + header_len,
                    body_len - 1);  // drop \0 on payloads
        } else {
            sentinel("Invalid protocol type: %d", handler->protocol);
        }

        debug("SENT: %s", bdata(payload));
        check(payload != NULL, "Failed to generate payload.");
        check(handler->send_socket != NULL, "Handler socket is NULL, tell Zed.");

        rc = Handler_deliver(handler->send_socket, bdata(payload), blength(payload));
        free(payload);
    
        check(rc == 0, "Failed to deliver to handler: %s", bdata(Request_path(conn->req)));
    }

    // consumes \0 from body_len
    check(IOBuf_read_commit(conn->iob, header_len + body_len) != -1, "Final commit failed.");

    return REQ_SENT;

error:
    return CLOSE;
}
Пример #29
0
int main (int arc, char *argv [])
{
	char *pattern;
	char buffer [BUF_LEN];
	char *name;
	symbol *anchor = NULL;
	char *pattern_array [ARRAY_LEN];
	int pattern_len = 0;

	if ((arc == HELP_NUM) && (! strcmp (argv [OPTION], "--help")))
	{
		print_help ();

		return (EXIT_SUCCESS);
	}

	if (arc != CORRECT_ARG_NUM)
	{
		fprintf (stderr,
			"USAGE: wrapgrep <\"search pattern\"> <input file name>\n");

		fprintf (stderr,
			"HELP: wrapgrep --help\n");

		return (EXIT_FAILURE);
	}

	pattern = argv [PATTERN];
	name = argv [FILE_NAME];

	copy_string (buffer, pattern, BUF_LEN);	
	pattern_len = create_pattern_array (pattern_array, ARRAY_LEN, buffer);
	anchor = parse_file (name, anchor);

	// debugff
	// print_pattern_array (pattern_array, pattern_len);
	// print_symbol_list (anchor);
	// debug

	pattern_match (pattern_array, pattern_len, anchor, name);
	destroy_pattern_array (pattern_array, pattern_len);
	destroy_symbol_list (anchor);

	return (EXIT_SUCCESS);
}
Пример #30
0
/* pattern matching uniquement avec des '*' */
static int pattern_match(char *chaine, char *pat) {
  char *p1=chaine,*p2=pat;

  while ((*p1!='\0') && (*p2!='\0')) {
    if (*p2=='*') {
       while (*(++p2)=='*');
       if (*p2=='\0') return 1;
       while (*p1) {
          if (pattern_match(p1,p2)) return 1;
          p1++;
       }
       return 0;
    }
    if (*p2!=*p1) return 0;
    p2++; p1++;
  }
  return 1;
}