亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hashtable.c

?? 打魔獸戰(zhàn)網(wǎng)的都知道他是什么
?? C
字號:
/* * Copyright (C) 2000,2001  Ross Combs (rocombs@cs.nmsu.edu) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#define HASHTABLE_INTERNAL_ACCESS#include "common/setup_before.h"#ifdef HAVE_STDDEF_H# include <stddef.h>#else# ifndef NULL#  define NULL ((void *)0)# endif#endif#ifdef STDC_HEADERS# include <stdlib.h>#else# ifdef HAVE_MALLOC_H#  include <malloc.h># endif#endif#include "common/eventlog.h"#include "common/hashtable.h"#include "common/xalloc.h"#include "common/setup_after.h"static int nodata; /* if data points to this, then the entry was actually deleted */ static t_entry * hashtable_entry_export(t_internentry * entry, t_hashtable const * hashtable, unsigned int row);static t_entry * hashtable_entry_export(t_internentry * entry, t_hashtable const * hashtable, unsigned int row){    t_entry * temp;        if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return NULL;    }    if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return NULL;    }    if (row>=hashtable->num_rows)    {	eventlog(eventlog_level_error,__FUNCTION__,"got bad row %u (max %u)",row,hashtable->num_rows-1);	return NULL;    }    temp = xmalloc(sizeof(t_entry));    temp->row = row;    temp->real = entry;    temp->hashtable = hashtable;    return temp;}extern t_hashtable * hashtable_create(unsigned int num_rows){    t_hashtable * new;    unsigned int  i;        if (num_rows<1)    {	eventlog(eventlog_level_error,__FUNCTION__,"num_rows must be at least 1");	return NULL;    }    new = xmalloc(sizeof(t_hashtable));    new->rows = xmalloc(sizeof(t_internentry *)*num_rows);    new->num_rows = num_rows;    new->len = 0;    for (i=0; i<num_rows; i++)	new->rows[i] = NULL;        return new;}extern int hashtable_destroy(t_hashtable * hashtable){    unsigned int i;        if (!hashtable)    {        eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");        return -1;    }        hashtable_purge(hashtable);    for (i=0; i<hashtable->num_rows; i++)	if (hashtable->rows[i])	    eventlog(eventlog_level_error,__FUNCTION__,"got non-empty hashtable");        xfree(hashtable->rows);    xfree(hashtable);        return 0;}extern int hashtable_purge(t_hashtable * hashtable){    unsigned int      row;    t_internentry *   curr;    t_internentry *   head;    t_internentry *   next;    t_internentry * * change;        if (!hashtable)    {        eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");        return -1;    }    #ifdef HASHTABLE_DEBUG    hashtable_check(hashtable);#endif        for (row=0; row<hashtable->num_rows; row++)    {	head = NULL;	change = NULL;	for (curr=hashtable->rows[row]; curr; curr=next)	{	    next = curr->next;	    if (curr->data==&nodata)	    {		if (change)		    *change = next;		xfree(curr);	    }	    else	    {		if (!head)		    head = curr;		change = &curr->next;	    }	}	hashtable->rows[row] = head;    }        return 0;}extern int hashtable_check(t_hashtable const * hashtable){    unsigned int          emptycnt;    unsigned int          validcnt;    unsigned int          row;    unsigned int          temp;    t_internentry const * tail;    t_internentry const * curr;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return -1;    }    if (hashtable->num_rows<1)    {        eventlog(eventlog_level_error,__FUNCTION__,"num_rows=%u",hashtable->num_rows);	return -1;    }    if (!hashtable->rows)    {        eventlog(eventlog_level_error,__FUNCTION__,"hashtable->rows is NULL");	return -1;    }        emptycnt=validcnt = 0;    for (row=0; row<hashtable->num_rows; row++)    {	tail = NULL;	for (curr=hashtable->rows[row]; curr; curr=curr->next)	{	    if (tail)	    {		if (curr==tail) /* tail is currently the previous node */		{		    eventlog(eventlog_level_error,__FUNCTION__,"row %u is circular (curr==prev==%p)",row,curr);		    return -1;		}		if (curr->next==tail)		{		    eventlog(eventlog_level_error,__FUNCTION__,"row %u is circular (curr->next==prev==%p)",row,curr);		    return -1;		}		for (temp=0; temp<hashtable->num_rows; temp++)		    if (curr==hashtable->rows[temp])		    {			eventlog(eventlog_level_error,__FUNCTION__,"row %u is circular (curr==rows[%u]==%p)",row,temp,curr);			return -1;		    }	    }	    if (curr->data==&nodata)		emptycnt++;	    else		validcnt++;	    tail = curr;	}    }        if (emptycnt>10 && emptycnt>validcnt+5) /* arbitrary heuristic to detect missing list_purge() calls */	eventlog(eventlog_level_warn,__FUNCTION__,"emptycnt=%u but validcnt=%u",emptycnt,validcnt);    if (hashtable->len!=validcnt)    {	eventlog(eventlog_level_error,__FUNCTION__,"hashtable->len=%u but validcnt=%u",hashtable->len,validcnt);	return -1;    }        return 0;}extern unsigned int hashtable_get_length(t_hashtable const * hashtable){    if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return 0;    }        return hashtable->len;}extern int hashtable_insert_data(t_hashtable * hashtable, void * data, unsigned int hash){    unsigned int    row;    t_internentry * entry;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return -1;    }    entry = xmalloc(sizeof(t_internentry));    entry->data = data;        row = hash%hashtable->num_rows;    entry->next = hashtable->rows[row];    hashtable->rows[row] = entry;    hashtable->len++;        return 0;}extern t_entry * hashtable_get_entry_by_data(t_hashtable const * hashtable, void const * data, unsigned int hash){    unsigned int    row;    t_internentry * curr;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return NULL;    }        row = hash%hashtable->num_rows;    for (curr=hashtable->rows[row]; curr; curr=curr->next)	if (curr->data==data)	    return hashtable_entry_export(curr,hashtable,row);        return NULL;}extern t_entry const * hashtable_get_entry_by_data_const(t_hashtable const * hashtable, void const * data, unsigned int hash){    unsigned int    row;    t_internentry * curr;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return NULL;    }        row = hash%hashtable->num_rows;    for (curr=hashtable->rows[row]; curr; curr=curr->next)	if (curr->data==data)	    return hashtable_entry_export(curr,hashtable,row);        return NULL;}extern int hashtable_remove_entry(t_hashtable * hashtable, t_entry * entry){    if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return -1;    }    if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return -1;    }    if (!entry->real)    {	eventlog(eventlog_level_error,__FUNCTION__,"entry has NULL real pointer");	return -1;    }    if (entry->real->data==&nodata)    {	eventlog(eventlog_level_error,__FUNCTION__,"got deleted entry");	return -1;    }        entry->real->data = &nodata;    hashtable->len--;        return 0;}extern int hashtable_remove_data(t_hashtable * hashtable, void const * data, unsigned int hash){    t_entry * entry;    int       retval;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return -1;    }        if (!(entry = hashtable_get_entry_by_data(hashtable,data,hash)))	return -1;        retval = hashtable_remove_entry(hashtable,entry);        hashtable_entry_release(entry);        return retval;}extern void * entry_get_data(t_entry const * entry){    if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return NULL;    }    if (!entry->real)    {	eventlog(eventlog_level_error,__FUNCTION__,"entry has NULL real pointer");	return NULL;    }    if (entry->real->data==&nodata)    {	eventlog(eventlog_level_error,__FUNCTION__,"got deleted entry");	return NULL;    }        return entry->real->data;}extern void * hashtable_get_data_by_pos(t_hashtable const * hashtable, unsigned int pos){    t_internentry const * curr;    unsigned int          row;    unsigned int          len;        if (!hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");	return NULL;    }        len = 0;    row = 0;    curr = NULL;    for (;;)    {	if (!curr)	{	    if (row>=hashtable->num_rows)		break;	    curr = hashtable->rows[row++];	    continue;	}	if (curr->data!=&nodata && len++==pos)	    return curr->data;	curr = curr->next;    }        eventlog(eventlog_level_error,__FUNCTION__,"requested position %u but len=%u",pos,len);    return NULL;}#ifdef HASHTABLE_DEBUGextern t_entry * hashtable_get_first_real(t_hashtable const * hashtable, char const * fn, unsigned int ln)#elseextern t_entry * hashtable_get_first(t_hashtable const * hashtable)#endif{    unsigned int    row;    t_internentry * curr;        if (!hashtable)    {#ifdef HASHTABLE_DEBUG	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable from %s:%u",fn,ln);#else	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");#endif	return NULL;    }        for (row=0; row<hashtable->num_rows; row++)	for (curr=hashtable->rows[row]; curr; curr=curr->next)	    if (curr->data!=&nodata)		return hashtable_entry_export(curr,hashtable,row);        return NULL;}extern t_entry * entry_get_next(t_entry * entry){    t_hashtable const * hashtable;    unsigned int        row;    t_internentry *     curr;        if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return NULL;    }        hashtable = entry->hashtable;        for (curr=entry->real->next; curr; curr=curr->next)	if (curr->data!=&nodata)	{	    entry->real = curr;	    return entry;	}        for (row=entry->row+1; row<hashtable->num_rows; row++)	for (curr=hashtable->rows[row]; curr; curr=curr->next)	    if (curr->data!=&nodata)	    {		entry->real = curr;		entry->row = row;		return entry;	    }        hashtable_entry_release(entry);    return NULL;}#ifdef HASHTABLE_DEBUGextern t_entry * hashtable_get_first_matching_real(t_hashtable const * hashtable, unsigned int hash, char const * fn, unsigned int ln)#elseextern t_entry * hashtable_get_first_matching(t_hashtable const * hashtable, unsigned int hash)#endif{    unsigned int    row;    t_internentry * curr;        if (!hashtable)    {#ifdef HASHTABLE_DEBUG	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable from %s:%u",fn,ln);#else	eventlog(eventlog_level_error,__FUNCTION__,"got NULL hashtable");#endif	return NULL;    }        row = hash%hashtable->num_rows;    for (curr=hashtable->rows[row]; curr; curr=curr->next)	if (curr->data!=&nodata)	    return hashtable_entry_export(curr,hashtable,row);        return NULL;}extern t_entry * entry_get_next_matching(t_entry * entry){    t_internentry * curr;        if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return NULL;    }        for (curr=entry->real->next; curr; curr=curr->next)	if (curr->data!=&nodata)	{	    entry->real = curr;	    return entry;	}        hashtable_entry_release(entry);    return NULL;}extern int hashtable_entry_release(t_entry * entry){    if (!entry)    {	eventlog(eventlog_level_error,__FUNCTION__,"got NULL entry");	return -1;    }    if (!entry->hashtable)    {	eventlog(eventlog_level_error,__FUNCTION__,"got entry with NULL hashtable");	return -1;    }    if (!entry->real)    {	eventlog(eventlog_level_error,__FUNCTION__,"got entry with NULL real pointer");	return -1;    }    if (entry->row>=entry->hashtable->num_rows)    {	eventlog(eventlog_level_error,__FUNCTION__,"entry has bad row %u (max %u)",entry->row,entry->hashtable->num_rows-1);	return -1;    }    #ifdef HASHTABLE_DEBUG    hashtable_check(entry->hashtable);#endif    xfree(entry);    return 0;}extern int hashtable_stats(t_hashtable * hashtable){    unsigned int      row;    t_internentry *   curr;    unsigned int      rcount, max, min;        if (!hashtable)    {        eventlog(eventlog_level_error, __FUNCTION__,"got NULL hashtable");        return -1;    }    #ifdef HASHTABLE_DEBUG    hashtable_check(hashtable);#endif    max = 0;    min = hashtable->len;    for (row=0; row<hashtable->num_rows; row++)    {	rcount = 0;	for (curr=hashtable->rows[row]; curr; curr=curr->next)	    if (curr->data!=&nodata) rcount++;	if (rcount > max) max = rcount;	if (rcount < min) min = rcount;    }    eventlog(eventlog_level_info, __FUNCTION__, "hashsize: %u min: %u max: %u avg: %.2f diff: %.2f%c", hashtable->num_rows, min, max, (float)(min + max)/2, (float)(max - min)/max*100, '%');    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩高清在线| 色哟哟一区二区在线观看| 久久精品国产亚洲aⅴ| 蜜臀va亚洲va欧美va天堂 | 欧美电影免费观看完整版| 欧美videos大乳护士334| 亚洲天堂av一区| 青青草原综合久久大伊人精品优势| 国产成人啪午夜精品网站男同| 欧美视频在线观看一区| 久久久影院官网| 亚洲成av人影院在线观看网| 国产在线精品免费| 91久久线看在观草草青青| 欧美国产精品v| 国产综合成人久久大片91| 欧美精选一区二区| 一区二区三区久久| 国产a区久久久| 精品国产乱码久久久久久久久| 午夜电影一区二区| 欧美性猛交xxxxxx富婆| 另类小说视频一区二区| 欧美极品美女视频| 欧美日韩中字一区| 一区二区三区欧美日| 欧美一区二区视频观看视频| 亚洲精品大片www| av在线这里只有精品| 久久综合九色综合久久久精品综合 | 国产一区二区在线观看视频| 亚洲视频一区二区在线| 欧美一区二区三区在| 不卡一区二区中文字幕| 欧美国产1区2区| 欧美三级电影网| 国产91丝袜在线18| 午夜精品久久久久久久久| 国产日韩综合av| 欧美一级二级三级乱码| 日本不卡123| 日韩理论片中文av| 欧美精品一区视频| 欧美日韩精品久久久| 午夜电影网亚洲视频| 国产精品电影院| 一本色道久久综合亚洲精品按摩| 国内精品自线一区二区三区视频| 亚洲综合色网站| 欧美福利视频导航| 91麻豆6部合集magnet| 亚洲免费av高清| 欧美日韩视频在线第一区| 成人av电影免费在线播放| 美女性感视频久久| 亚洲成人免费观看| 中文字幕亚洲一区二区va在线| 日本二三区不卡| 成人精品免费看| 亚洲欧美日韩国产另类专区| 久久精品男人天堂av| 91免费观看在线| 国产91在线看| 国产激情一区二区三区四区| 天堂一区二区在线| 欧美国产精品一区| 国产午夜亚洲精品午夜鲁丝片| 欧美一二三在线| 制服丝袜av成人在线看| 激情六月婷婷综合| 毛片不卡一区二区| 人人狠狠综合久久亚洲| 亚洲成人1区2区| 一区二区三区高清在线| 亚洲麻豆国产自偷在线| 亚洲欧美在线视频观看| 亚洲丝袜美腿综合| 中文字幕日韩精品一区| 国产精品日韩成人| 在线视频中文字幕一区二区| 久久精品国产久精国产| 免费高清不卡av| 国产综合久久久久久久久久久久| 日韩午夜小视频| 国内外成人在线| 国产一区二区三区久久悠悠色av| 六月丁香婷婷久久| 国产一区三区三区| 国产精品99久| 亚洲男人的天堂一区二区 | 国产精品综合二区| 国产不卡在线一区| 狠狠色丁香婷综合久久| 久久精品国产精品青草| 日本91福利区| 经典三级一区二区| 国产欧美日韩麻豆91| 久久青草欧美一区二区三区| 欧美大肚乱孕交hd孕妇| 91福利资源站| 欧美亚洲动漫精品| 在线观看国产一区二区| 99精品偷自拍| 午夜精品一区二区三区免费视频| 亚洲成人综合在线| 亚洲一区二区3| 亚洲精品免费在线观看| 91激情五月电影| 97精品视频在线观看自产线路二| 色噜噜夜夜夜综合网| 色婷婷久久久综合中文字幕| 欧美在线观看视频一区二区| 欧美美女直播网站| 欧美一区二区三区日韩| 精品国产1区2区3区| 久久久亚洲高清| 亚洲一区二区偷拍精品| 日韩福利电影在线观看| 欧美一级xxx| 国产性天天综合网| 中文字幕一区二区三区在线播放| 悠悠色在线精品| 亚洲精品乱码久久久久久黑人 | 国产激情精品久久久第一区二区| 成人免费av网站| 成人av影院在线| 色综合一区二区三区| 免费成人在线视频观看| 国产成人av资源| 免费在线观看一区| 国产一区二区中文字幕| 国产91精品免费| 天天综合天天综合色| 精品一二三四区| 97久久精品人人澡人人爽| 欧美视频在线一区| 日韩欧美国产高清| 久久蜜桃一区二区| 夜夜嗨av一区二区三区四季av| 免费高清在线一区| 一本色道久久综合精品竹菊| 91精品国产色综合久久久蜜香臀| 欧美精品高清视频| 欧美变态tickle挠乳网站| 亚洲美女精品一区| 国产一区二区看久久| 国产精品99久久久久久久女警| 色欧美片视频在线观看| 精品国产麻豆免费人成网站| 一区二区在线看| 精彩视频一区二区三区| 婷婷综合五月天| 一本大道av一区二区在线播放| 日韩欧美第一区| 午夜伊人狠狠久久| 国产不卡免费视频| 色94色欧美sute亚洲线路一ni| 91精品国产综合久久精品| 国产欧美日本一区二区三区| 亚洲777理论| 99久久99久久精品免费看蜜桃| 欧美tk—视频vk| 午夜精品成人在线| 91免费观看在线| 国产精品久久久久毛片软件| 狠狠色2019综合网| 91精品国产综合久久精品| 国产精品久久看| 石原莉奈在线亚洲二区| 国产suv精品一区二区三区 | av一区二区三区在线| 91精品国产综合久久精品图片 | 狠狠久久亚洲欧美| 91精品国产全国免费观看| 国产精品女主播av| 成人久久久精品乱码一区二区三区| 日韩欧美另类在线| 亚洲国产视频在线| 成人av在线看| 国产精品你懂的| 国产成人免费在线| 精品国产乱码久久久久久影片| 一区二区三区四区在线| 日本va欧美va精品| 日韩一区二区三区四区| 午夜精品视频在线观看| 欧美美女网站色| 亚洲福利一区二区三区| 欧美视频一区二区三区四区| 一区二区三区在线观看国产| 在线一区二区视频| 亚洲欧美综合在线精品| 91在线精品一区二区三区| 依依成人精品视频| 欧美剧在线免费观看网站 | 欧美高清视频在线高清观看mv色露露十八| 亚洲综合一区在线| 欧美视频一区二区三区四区| 免费精品99久久国产综合精品| 欧美日韩精品高清|