#ifndef RLD
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <stuff/symbol_list.h>
#include <stuff/allocate.h>
#include <stuff/errors.h>
static int cmp_qsort_name(
const struct symbol_list *sym1,
const struct symbol_list *sym2);
__private_extern__
void
setup_symbol_list(
char *file,
struct symbol_list **list,
uint32_t *size)
{
int fd;
uint32_t i, j, len, strings_size;
struct stat stat_buf;
char *strings, *p, *line;
if((fd = open(file, O_RDONLY)) < 0){
system_error("can't open: %s", file);
return;
}
if(fstat(fd, &stat_buf) == -1){
system_error("can't stat: %s", file);
close(fd);
return;
}
strings_size = stat_buf.st_size;
strings = (char *)allocate(strings_size + 2);
strings[strings_size] = '\n';
strings[strings_size + 1] = '\0';
if(read(fd, strings, strings_size) != (int)strings_size){
system_error("can't read: %s", file);
close(fd);
return;
}
p = strings;
line = p;
for(i = 0; i < strings_size + 1; i++){
if(*p == '\n' || *p == '\r'){
*p = '\0';
if(*line != '#'){
while(*line != '\0' && isspace(*line))
line++;
if(*line != '\0')
(*size)++;
}
p++;
line = p;
}
else{
p++;
}
}
*list = (struct symbol_list *)
allocate((*size) * sizeof(struct symbol_list));
p = strings;
line = p;
for(i = 0; i < (*size); ){
p += strlen(p) + 1;
if(*line != '#' && *line != '\0'){
while(*line != '\0' && isspace(*line))
line++;
if(*line != '\0'){
(*list)[i].name = line;
(*list)[i].seen = FALSE;
i++;
len = strlen(line);
j = len - 1;
while(j > 0 && isspace(line[j])){
j--;
}
if(j > 0 && j + 1 < len && isspace(line[j+1]))
line[j+1] = '\0';
}
}
line = p;
}
qsort(*list, *size, sizeof(struct symbol_list),
(int (*)(const void *, const void *))cmp_qsort_name);
for(i = 0; i < (*size); i++){
if(i + 1 < (*size)){
if(strcmp((*list)[i].name, (*list)[i+1].name) == 0){
for(j = 1; j < ((*size) - i - 1); j++){
(*list)[i + j].name = (*list)[i + j + 1].name;
}
*size = *size - 1;
i--;
}
}
}
#ifdef DEBUG
printf("symbol list:\n");
for(i = 0; i < (*size); i++){
printf("0x%x name = %s\n", &((*list)[i]),(*list)[i].name);
}
#endif
}
static
int
cmp_qsort_name(
const struct symbol_list *sym1,
const struct symbol_list *sym2)
{
return(strcmp(sym1->name, sym2->name));
}
__private_extern__
int
symbol_list_bsearch(
const char *name,
const struct symbol_list *sym)
{
return(strcmp(name, sym->name));
}
#endif