mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	Moved patmatch() to yosys.cc
This commit is contained in:
		
							parent
							
								
									774933a0d8
								
							
						
					
					
						commit
						ee5165c6e4
					
				
					 6 changed files with 65 additions and 95 deletions
				
			
		|  | @ -1,91 +0,0 @@ | |||
| /*
 | ||||
|  *  yosys -- Yosys Open SYnthesis Suite | ||||
|  * | ||||
|  *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at> | ||||
|  *   | ||||
|  *  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 | ||||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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<typename T> int GetSize(const T &obj) { return obj.size(); } | ||||
| int GetSize(RTLIL::Wire *wire); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue