apps/openssl.c
int main
==> prog=prog_init();
就在apps/openssl.c文件中有如下定义:
static LHASH_OF(FUNCTION) *prog_init(void)
{
LHASH_OF(FUNCTION) *ret;
FUNCTION *f;
size_t i;
/* Purely so it looks nice when the user hits ? */
for(i=0,f=functions ; f->name != NULL ; ++f,++i)
; // 统计一共实现了多少个function.[luther.gliethttp]
qsort(functions,i,sizeof *functions,SortFnByName); // 使用SortFnByName函数判断数组中数据大小,
// 这里就是根据函数名字符串来排序[luther.gliethttp]
// qsort为库函数,用来排序functions[]数组, 这和busybox中实现类似
if ((ret=lh_FUNCTION_new()) == NULL) // 创建一个hash列表
return(NULL);
for (f=functions; f->name != NULL; f++)
(void)lh_FUNCTION_insert(ret,f); // 将每个function逐个添加到hash列表上,这里使用到了hash算法
// 这种方法比直接使用字母的
return(ret); // 第1个字节来判断hash键值要好很难多,因为这样随机性更大
} // 于是冲突就会更加平均到hash[]的各个项中[luther.gliethttp]
static int SortFnByName(const void *_f1,const void *_f2)
{
const FUNCTION *f1=_f1;
const FUNCTION *f2=_f2;
if(f1->type != f2->type)
return f1->type-f2->type;
return strcmp(f1->name,f2->name);
}
阅读(1463) | 评论(0) | 转发(0) |