From: Clifford Wolf Date: Fri, 10 Oct 2014 16:19:00 +0000 (+0200) Subject: Moved patmatch() to yosys.cc X-Git-Tag: yosys-0.4~81 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ee5165c6e470d0f66e339ff796b074f8ac1a89aa;p=yosys.git Moved patmatch() to yosys.cc --- diff --git a/kernel/patmatch.h b/kernel/patmatch.h deleted file mode 100644 index 611c8d86e..000000000 --- a/kernel/patmatch.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * yosys -- Yosys Open SYnthesis Suite - * - * Copyright (C) 2012 Clifford Wolf - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#ifndef PATMATCH_H -#define PATMATCH_H - -#include "kernel/yosys.h" - -YOSYS_NAMESPACE_BEGIN - -// this is very similar to fnmatch(). the exact rules used by this -// function are: -// -// ? matches any character except -// * matches any sequence of characters -// [...] matches any of the characters in the list -// [!..] matches any of the characters not in the list -// -// a backslash may be used to escape the next characters in the -// pattern. each special character can also simply match itself. -// -static bool patmatch(const char *pattern, const char *string) -{ - if (*pattern == 0) - return *string == 0; - - if (*pattern == '\\') { - if (pattern[1] == string[0] && patmatch(pattern+2, string+1)) - return true; - } - - if (*pattern == '?') { - if (*string == 0) - return false; - return patmatch(pattern+1, string+1); - } - - if (*pattern == '*') { - while (*string) { - if (patmatch(pattern+1, string++)) - return true; - } - return pattern[1] == 0; - } - - if (*pattern == '[') { - bool found_match = false; - bool inverted_list = pattern[1] == '!'; - const char *p = pattern + (inverted_list ? 1 : 0); - - while (*++p) { - if (*p == ']') { - if (found_match != inverted_list && patmatch(p+1, string+1)) - return true; - break; - } - - if (*p == '\\') { - if (*++p == *string) - found_match = true; - } else - if (*p == *string) - found_match = true; - } - } - - if (*pattern == *string) - return patmatch(pattern+1, string+1); - - return false; -} - -YOSYS_NAMESPACE_END - -#endif diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 971da78ab..d728329e3 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -66,6 +66,68 @@ std::string vstringf(const char *fmt, va_list ap) return string; } +// this is very similar to fnmatch(). the exact rules used by this +// function are: +// +// ? matches any character except +// * matches any sequence of characters +// [...] matches any of the characters in the list +// [!..] matches any of the characters not in the list +// +// a backslash may be used to escape the next characters in the +// pattern. each special character can also simply match itself. +// +static bool patmatch(const char *pattern, const char *string) +{ + if (*pattern == 0) + return *string == 0; + + if (*pattern == '\\') { + if (pattern[1] == string[0] && patmatch(pattern+2, string+1)) + return true; + } + + if (*pattern == '?') { + if (*string == 0) + return false; + return patmatch(pattern+1, string+1); + } + + if (*pattern == '*') { + while (*string) { + if (patmatch(pattern+1, string++)) + return true; + } + return pattern[1] == 0; + } + + if (*pattern == '[') { + bool found_match = false; + bool inverted_list = pattern[1] == '!'; + const char *p = pattern + (inverted_list ? 1 : 0); + + while (*++p) { + if (*p == ']') { + if (found_match != inverted_list && patmatch(p+1, string+1)) + return true; + break; + } + + if (*p == '\\') { + if (*++p == *string) + found_match = true; + } else + if (*p == *string) + found_match = true; + } + } + + if (*pattern == *string) + return patmatch(pattern+1, string+1); + + return false; +} + int GetSize(RTLIL::Wire *wire) { return wire->width; diff --git a/kernel/yosys.h b/kernel/yosys.h index d3f885644..a796dd09f 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -84,6 +84,9 @@ namespace RTLIL { std::string stringf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); std::string vstringf(const char *fmt, va_list ap); + +bool patmatch(const char *pattern, const char *string); + template int GetSize(const T &obj) { return obj.size(); } int GetSize(RTLIL::Wire *wire); diff --git a/passes/cmds/cover.cc b/passes/cmds/cover.cc index 64f7acf50..b8792a05f 100644 --- a/passes/cmds/cover.cc +++ b/passes/cmds/cover.cc @@ -19,9 +19,7 @@ #include #include - #include "kernel/yosys.h" -#include "kernel/patmatch.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc index 893f897d2..af0df07b3 100644 --- a/passes/cmds/select.cc +++ b/passes/cmds/select.cc @@ -20,7 +20,6 @@ #include "kernel/yosys.h" #include "kernel/celltypes.h" #include "kernel/sigtools.h" -#include "kernel/patmatch.h" #include #include diff --git a/passes/hierarchy/hierarchy.cc b/passes/hierarchy/hierarchy.cc index 68317a60a..87d115027 100644 --- a/passes/hierarchy/hierarchy.cc +++ b/passes/hierarchy/hierarchy.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/patmatch.h" #include #include #include