65 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "mcg.h"
 | |
| 
 | |
| static void init_idf();
 | |
| static struct idf* str2idf(char* tg, int cp);
 | |
| 
 | |
| #define IDF_TYPE struct symbol
 | |
| #define IDF_NAME symbol
 | |
| #include <idf_pkg.spec>
 | |
| #include <idf_pkg.body>
 | |
| 
 | |
| void symbol_init(void)
 | |
| {
 | |
| 	init_idf();
 | |
| }
 | |
| 
 | |
| bool symbol_exists(const char* name)
 | |
| {
 | |
| 	return !!findidf((char*) name);
 | |
| }
 | |
| 
 | |
| struct symbol* symbol_get(const char* name)
 | |
| {
 | |
| 	struct idf* p = str2idf((char*) name, 0);
 | |
| 	p->symbol.name = p->id_text;
 | |
| 	return &p->symbol;
 | |
| }
 | |
| 
 | |
| void symbol_declare(const char* name, bool is_exported, bool is_proc)
 | |
| {
 | |
| 	struct symbol* s = symbol_get(name);
 | |
| 	s->is_exported = is_exported;
 | |
| 
 | |
| 	if (is_proc)
 | |
| 	{
 | |
| 		if (s->section == SECTION_UNKNOWN)
 | |
| 			s->section = SECTION_TEXT;
 | |
| 		else if (s->section != SECTION_TEXT)
 | |
| 			fatal("section mismatch for '%s'", name);
 | |
| 	}
 | |
| 
 | |
| 	if (is_exported)
 | |
| 		fprintf(outputfile, ".extern %s\n", platform_label(name));
 | |
| }
 | |
| 
 | |
| struct symbol* symbol_walk(symbol_walker_t* cb, void* user)
 | |
| {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i=0; i<IDF_HASHSIZE; i++)
 | |
| 	{
 | |
| 		struct idf* idf = IDF_hashtable[i];
 | |
| 		while (idf)
 | |
| 		{	
 | |
| 			struct symbol* symbol = &idf->symbol;
 | |
| 			if (cb(symbol, user))
 | |
| 				return symbol;
 | |
| 			idf = idf->id_next;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| /* vim: set sw=4 ts=4 expandtab : */
 | |
| 
 |