00001
00002
00003
00004
00005
00006
00007
00008
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
00081
00082
00083
00084
00085
00086
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 * knew )
00129 {
00130 unsigned int index;
00131 kb_symbol_t * sym;
00132
00133 knew->next = NULL;
00134
00135 index = ( kb_hash( knew->name ) % KB_SYMBOL_TABLE_SIZE );
00136
00137 sym = table->symbols[index];
00138
00139 while ( sym != NULL ) {
00140 if ( !strcasecmp( sym->name , knew->name ) )
00141 return 0;
00142 sym = sym->next;
00143 }
00144
00145 pthread_mutex_lock( &table->lock );
00146 knew->next = table->symbols[index];
00147
00148 table->symbols[index] = knew;
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