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 *
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