mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	Changed frontend-api from FILE to std::istream
This commit is contained in:
		
							parent
							
								
									5dce303a2a
								
							
						
					
					
						commit
						19cff41eb4
					
				
					 22 changed files with 116 additions and 89 deletions
				
			
		| 
						 | 
				
			
			@ -193,7 +193,7 @@ static std::string next_token(bool pass_newline = false)
 | 
			
		|||
	return token;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void input_file(FILE *f, std::string filename)
 | 
			
		||||
static void input_file(std::istream &f, std::string filename)
 | 
			
		||||
{
 | 
			
		||||
	char buffer[513];
 | 
			
		||||
	int rc;
 | 
			
		||||
| 
						 | 
				
			
			@ -202,14 +202,14 @@ static void input_file(FILE *f, std::string filename)
 | 
			
		|||
	auto it = input_buffer.begin();
 | 
			
		||||
 | 
			
		||||
	input_buffer.insert(it, "`file_push " + filename + "\n");
 | 
			
		||||
	while ((rc = fread(buffer, 1, sizeof(buffer)-1, f)) > 0) {
 | 
			
		||||
	while ((rc = f.readsome(buffer, sizeof(buffer)-1)) > 0) {
 | 
			
		||||
		buffer[rc] = 0;
 | 
			
		||||
		input_buffer.insert(it, buffer);
 | 
			
		||||
	}
 | 
			
		||||
	input_buffer.insert(it, "\n`file_pop\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string frontend_verilog_preproc(FILE *f, std::string filename, const std::map<std::string, std::string> pre_defines_map, const std::list<std::string> include_dirs)
 | 
			
		||||
std::string frontend_verilog_preproc(std::istream &f, std::string filename, const std::map<std::string, std::string> pre_defines_map, const std::list<std::string> include_dirs)
 | 
			
		||||
{
 | 
			
		||||
	std::set<std::string> defines_with_args;
 | 
			
		||||
	std::map<std::string, std::string> defines_map(pre_defines_map);
 | 
			
		||||
| 
						 | 
				
			
			@ -288,27 +288,28 @@ std::string frontend_verilog_preproc(FILE *f, std::string filename, const std::m
 | 
			
		|||
				else
 | 
			
		||||
					fn = fn.substr(0, pos) + fn.substr(pos+1);
 | 
			
		||||
			}
 | 
			
		||||
			FILE *fp = fopen(fn.c_str(), "r");
 | 
			
		||||
			if (fp == NULL && fn.size() > 0 && fn[0] != '/' && filename.find('/') != std::string::npos) {
 | 
			
		||||
			std::ifstream ff;
 | 
			
		||||
			ff.clear();
 | 
			
		||||
			ff.open(fn.c_str());
 | 
			
		||||
			if (ff.fail() && fn.size() > 0 && fn[0] != '/' && filename.find('/') != std::string::npos) {
 | 
			
		||||
				// if the include file was not found, it is not given with an absolute path, and the
 | 
			
		||||
				// currently read file is given with a path, then try again relative to its directory
 | 
			
		||||
				std::string fn2 = filename.substr(0, filename.rfind('/')+1) + fn;
 | 
			
		||||
				fp = fopen(fn2.c_str(), "r");
 | 
			
		||||
				ff.clear();
 | 
			
		||||
				ff.open(filename.substr(0, filename.rfind('/')+1) + fn);
 | 
			
		||||
			}
 | 
			
		||||
			if (fp == NULL && fn.size() > 0 && fn[0] != '/') {
 | 
			
		||||
			if (ff.fail() && fn.size() > 0 && fn[0] != '/') {
 | 
			
		||||
				// if the include file was not found and it is not given with an absolute path, then
 | 
			
		||||
				// search it in the include path
 | 
			
		||||
				for (auto incdir : include_dirs) {
 | 
			
		||||
					std::string fn2 = incdir + '/' + fn;
 | 
			
		||||
					fp = fopen(fn2.c_str(), "r");
 | 
			
		||||
					if (fp != NULL) break;
 | 
			
		||||
					ff.clear();
 | 
			
		||||
					ff.open(incdir + '/' + fn);
 | 
			
		||||
					if (!ff.fail()) break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if (fp != NULL) {
 | 
			
		||||
				input_file(fp, fn);
 | 
			
		||||
				fclose(fp);
 | 
			
		||||
			} else
 | 
			
		||||
			if (ff.fail())
 | 
			
		||||
				output_code.push_back("`file_notfound " + fn);
 | 
			
		||||
			else
 | 
			
		||||
				input_file(ff, fn);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue