Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

kb_symbol.c

Go to the documentation of this file.
00001 /*-------------------------------------------------------------------- 00002 * kb_symbol.c - KoreBot Library - Symbol Management 00003 *-------------------------------------------------------------------- 00004 * $Id: kb_symbol.c,v 1.4 2004/09/22 08:29:14 pbureau Exp $ 00005 *-------------------------------------------------------------------- 00006 * $Author: pbureau $ 00007 * $Revision: 1.4 $ 00008 * $Date: 2004/09/22 08:29:14 $ 00009 *--------------------------------------------------------------------*/ 00010 00011 #include "korebot.h" 00012 00028 /*--------------------------------------------------------------------*/ 00031 const char *kb_symbol_type_names[] = { 00032 "section" , "alias" , "device" , "register" , NULL 00033 }; 00034 00035 /*--------------------------------------------------------------------*/ 00042 kb_symbol_table_t * kb_create_symbol_table( kb_symbol_table_t * table ) 00043 { 00044 unsigned int index; 00045 00046 if ( table == NULL ) 00047 table = KB_ALLOC(kb_symbol_table_t,1); 00048 00049 (void)pthread_mutex_init( &table->lock , 0 ); 00050 table->count = 0; 00051 00052 for (index=0; index<KB_SYMBOL_TABLE_SIZE; index++) { 00053 table->symbols[index] = NULL; 00054 } 00055 00056 return table; 00057 } 00058 00059 /*--------------------------------------------------------------------*/ 00067 void kb_destroy_symbol_table( kb_symbol_table_t * table ) 00068 { 00069 unsigned int index; 00070 kb_symbol_t * sym , *next; 00071 00072 (void)pthread_mutex_destroy( &table->lock ); 00073 table->count = 0; 00074 00075 for (index=0; index<KB_SYMBOL_TABLE_SIZE; index++) { 00076 00077 sym = table->symbols[index]; 00078 00079 while ( sym != NULL ) { 00080 //printf("toto\n"); 00081 //printf("sym=%08X\n" , sym ); 00082 //printf("sym->name=%s\n" , sym->name ); 00083 //printf("sym->type=%u\n" , sym->type ); 00084 //printf("sym->alloc=%u\n" , sym->alloc ); 00085 //printf("sym->value=%u\n" , sym->value ); 00086 //printf("sym->next=%08X\n" , sym->next ); 00087 00088 next = sym->next; 00089 if ( sym->alloc != 0 ) { 00090 kb_free( (void *)sym->value ); 00091 } 00092 kb_free( sym ); 00093 sym = next; 00094 } 00095 } 00096 } 00097 00098 /*--------------------------------------------------------------------*/ 00107 unsigned long kb_hash( const char * name ) 00108 { 00109 unsigned long h = 0; 00110 00111 while ( *name != '\0' ) { 00112 h = ( h << 2 ) + ( tolower(*name) ); 00113 name++; 00114 } 00115 return h; 00116 } 00117 00118 /*--------------------------------------------------------------------*/ 00128 int kb_add_symbol( kb_symbol_table_t * table , kb_symbol_t * new ) 00129 { 00130 unsigned int index; 00131 kb_symbol_t * sym; 00132 00133 new->next = NULL; 00134 00135 index = ( kb_hash( new->name ) % KB_SYMBOL_TABLE_SIZE ); 00136 00137 sym = table->symbols[index]; 00138 00139 while ( sym != NULL ) { 00140 if ( !strcasecmp( sym->name , new->name ) ) 00141 return 0; 00142 sym = sym->next; 00143 } 00144 00145 pthread_mutex_lock( &table->lock ); 00146 new->next = table->symbols[index]; 00147 00148 table->symbols[index] = new; 00149 table->count++; 00150 pthread_mutex_unlock( &table->lock ); 00151 00152 return 1; 00153 } 00154 00155 /*--------------------------------------------------------------------*/ 00165 kb_symbol_t * kb_lookup_symbol( kb_symbol_table_t * table , 00166 const char * name ) 00167 { 00168 unsigned int index; 00169 kb_symbol_t * sym; 00170 00171 index = ( kb_hash(name) % KB_SYMBOL_TABLE_SIZE ); 00172 00173 sym = table->symbols[index]; 00174 00175 while ( sym != NULL ) { 00176 00177 if ( !strcasecmp( sym->name , name ) ) 00178 return sym; 00179 00180 sym = sym->next; 00181 } 00182 00183 return sym; 00184 } 00185 00186 /*--------------------------------------------------------------------*/ 00192 void kb_dump_symbol_table( kb_symbol_table_t * table ) 00193 { 00194 unsigned int index; 00195 kb_symbol_t * sym; 00196 00197 kb_msg("------------------------------------------------------------------\n"); 00198 kb_msg(" Name Type \n"); 00199 kb_msg("------------------------------------------------------------------\n"); 00200 00201 for (index=0; index<KB_SYMBOL_TABLE_SIZE; index++) { 00202 00203 sym = table->symbols[index]; 00204 while (sym != NULL) { 00205 kb_msg( " %-32s %-32s\n" , 00206 sym->name , 00207 kb_symbol_type_names[sym->type] ); 00208 00209 sym = sym->next; 00210 } 00211 } 00212 00213 kb_msg("==================================================================\n"); 00214 } 00215

Generated on Thu Nov 17 15:28:57 2005 for KoreBot Library by doxygen 1.3.7