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

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

?? hash.c

?? C++的一個好庫。。。現在很流行
?? C
字號:
/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

# include "jam.h"
# include "hash.h"
# include <assert.h>

/* 
 * hash.c - simple in-memory hashing routines 
 *
 * External routines:
 *
 *     hashinit() - initialize a hash table, returning a handle
 *     hashitem() - find a record in the table, and optionally enter a new one
 *     hashdone() - free a hash table, given its handle
 *
 * Internal routines:
 *
 *     hashrehash() - resize and rebuild hp->tab, the hash table
 *
 * 4/29/93 - ensure ITEM's are aligned
 */

char 	*hashsccssid="@(#)hash.c	1.14  ()  6/20/88";

/* Header attached to all data items entered into a hash table. */

struct hashhdr {
	struct item *next;
	unsigned int keyval;			/* for quick comparisons */
} ;

/* This structure overlays the one handed to hashenter(). */
/* It's actual size is given to hashinit(). */

struct hashdata {
	char	*key;
	/* rest of user data */
} ;

typedef struct item {
	struct hashhdr hdr;
	struct hashdata data;
} ITEM ;

# define MAX_LISTS 32

struct hash 
{
	/*
	 * the hash table, just an array of item pointers
	 */
	struct {
		int nel;
		ITEM **base;
	} tab;

	int bloat;	/* tab.nel / items.nel */
	int inel; 	/* initial number of elements */

	/*
	 * the array of records, maintained by these routines
	 * essentially a microallocator
	 */ 
	struct {
		int more;	/* how many more ITEMs fit in lists[ list ] */
        ITEM *free; /* free list of items */
		char *next;	/* where to put more ITEMs in lists[ list ] */
		int datalen;	/* length of records in this hash table */
		int size;	/* sizeof( ITEM ) + aligned datalen */
		int nel;	/* total ITEMs held by all lists[] */
		int list;	/* index into lists[] */

		struct {
			int nel;	/* total ITEMs held by this list */
			char *base;	/* base of ITEMs array */
		} lists[ MAX_LISTS ];
	} items;

	char *name;	/* just for hashstats() */
} ;

static void hashrehash( struct hash *hp );
static void hashstat( struct hash *hp );

/*
 * hash_free() - remove the given item from the table if it's there.
 * Returns 1 if found, 0 otherwise.
 *
 * NOTE: 2nd argument is HASHDATA*, not HASHDATA** as elsewhere.
 */
int
hash_free(
	register struct hash *hp,
	HASHDATA *data)
{
	ITEM **prev;
	register ITEM **i;
	unsigned char *b = (unsigned char*)data->key;
	unsigned int keyval;

	keyval = *b;

	while( *b )
		keyval = keyval * 2147059363 + *b++;

    prev = hp->tab.base + ( keyval % hp->tab.nel );
	while(*prev )
    {
        register ITEM* i = *prev;
	    if( keyval == i->hdr.keyval && 
            !strcmp( i->data.key, data->key ) )
        {
            /* unlink the record from the hash chain */
            *prev = i->hdr.next;
            /* link it into the freelist */
            i->hdr.next = hp->items.free;
            hp->items.free = i;
            /* mark it free so we skip it during enumeration */
            i->data.key = 0;
            /* we have another item */
            hp->items.more++;
            return 1;
        }
        prev = &i->hdr.next;
    }
    return 0;
}

/*
 * hashitem() - find a record in the table, and optionally enter a new one
 */

int
hashitem(
	register struct hash *hp,
	HASHDATA **data,
	int enter )
{
	ITEM **base;
	register ITEM *i;
	unsigned char *b = (unsigned char*)(*data)->key;
	unsigned int keyval;

	if( enter && !hp->items.more )
	    hashrehash( hp );

	if( !enter && !hp->items.nel )
	    return 0;

	keyval = *b;

	while( *b )
		keyval = keyval * 2147059363 + *b++;

	base = hp->tab.base + ( keyval % hp->tab.nel );

	for( i = *base; i; i = i->hdr.next )
	    if( keyval == i->hdr.keyval && 
		!strcmp( i->data.key, (*data)->key ) )
	{
		*data = &i->data;
		return !0;
	}

	if( enter ) 
	{
        /* try to grab one from the free list */
        if ( hp->items.free )
        {
            i = hp->items.free;
            hp->items.free = i->hdr.next;
            assert( i->data.key == 0 );
        }
        else
        {
            i = (ITEM *)hp->items.next;
            hp->items.next += hp->items.size;
        }
		hp->items.more--;
		memcpy( (char *)&i->data, (char *)*data, hp->items.datalen );
		i->hdr.keyval = keyval;
		i->hdr.next = *base;
		*base = i;
		*data = &i->data;
	}

	return 0;
}

/*
 * hashrehash() - resize and rebuild hp->tab, the hash table
 */

static void hashrehash( register struct hash *hp )
{
	int i = ++hp->items.list;

	hp->items.more = i ? 2 * hp->items.nel : hp->inel;
	hp->items.next = (char *)malloc( hp->items.more * hp->items.size );
    hp->items.free = 0;
    
	hp->items.lists[i].nel = hp->items.more;
	hp->items.lists[i].base = hp->items.next;
	hp->items.nel += hp->items.more;

	if( hp->tab.base )
		free( (char *)hp->tab.base );

	hp->tab.nel = hp->items.nel * hp->bloat;
	hp->tab.base = (ITEM **)malloc( hp->tab.nel * sizeof(ITEM **) );

	memset( (char *)hp->tab.base, '\0', hp->tab.nel * sizeof( ITEM * ) );

	for( i = 0; i < hp->items.list; i++ )
	{
		int nel = hp->items.lists[i].nel;
		char *next = hp->items.lists[i].base;

		for( ; nel--; next += hp->items.size )
		{
			register ITEM *i = (ITEM *)next;
			ITEM **ip = hp->tab.base + i->hdr.keyval % hp->tab.nel;
            /* code currently assumes rehashing only when there are no free items */
            assert( i->data.key != 0 ); 
            
			i->hdr.next = *ip;
			*ip = i;
		}
	}
}

void hashenumerate( struct hash *hp, void (*f)(void*,void*), void* data )
{
    int i;
    for( i = 0; i <= hp->items.list; i++ )
    {
        char *next = hp->items.lists[i].base;
        int nel = hp->items.lists[i].nel;
        if ( i == hp->items.list )
            nel -= hp->items.more;

        for( ; nel--; next += hp->items.size )
        {
            register ITEM *i = (ITEM *)next;
            
            if ( i->data.key != 0 ) /* don't enumerate freed items */
                f(&i->data, data);
        }
    }
}

/* --- */

# define ALIGNED(x) ( ( x + sizeof( ITEM ) - 1 ) & ~( sizeof( ITEM ) - 1 ) )

/*
 * hashinit() - initialize a hash table, returning a handle
 */

struct hash *
hashinit( 
	int datalen,
	char *name )
{
	struct hash *hp = (struct hash *)malloc( sizeof( *hp ) );

	hp->bloat = 3;
	hp->tab.nel = 0;
	hp->tab.base = (ITEM **)0;
	hp->items.more = 0;
    hp->items.free = 0;
	hp->items.datalen = datalen;
	hp->items.size = sizeof( struct hashhdr ) + ALIGNED( datalen );
	hp->items.list = -1;
	hp->items.nel = 0;
	hp->inel = 11;
	hp->name = name;

	return hp;
}

/*
 * hashdone() - free a hash table, given its handle
 */

void
hashdone( struct hash *hp )
{
	int i;

	if( !hp )
	    return;

	if( DEBUG_MEM )
	    hashstat( hp );

	if( hp->tab.base )
		free( (char *)hp->tab.base );
	for( i = 0; i <= hp->items.list; i++ )
		free( hp->items.lists[i].base );
	free( (char *)hp );
}

/* ---- */

static void
hashstat( struct hash *hp )
{
	ITEM **tab = hp->tab.base;
	int nel = hp->tab.nel;
	int count = 0;
	int sets = 0;
	int run = ( tab[ nel - 1 ] != (ITEM *)0 );
	int i, here;

	for( i = nel; i > 0; i-- )
	{
		if( here = ( *tab++ != (ITEM *)0 ) )
			count++;
		if( here && !run )
			sets++;
		run = here;
	}

	printf( "%s table: %d+%d+%d (%dK+%dK) items+table+hash, %f density\n",
		hp->name, 
		count, 
		hp->items.nel,
		hp->tab.nel,
		hp->items.nel * hp->items.size / 1024,
		hp->tab.nel * sizeof( ITEM ** ) / 1024,
		(float)count / (float)sets );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费毛片a| 天堂av在线一区| 成人h动漫精品一区二区| 久久久久久99精品| 成人白浆超碰人人人人| 日韩一区欧美一区| 欧美三级视频在线| 免费在线看一区| 久久久久国产一区二区三区四区 | 麻豆成人av在线| 精品国产乱码久久久久久免费| 精品一区二区在线看| 亚洲国产中文字幕在线视频综合| 欧美亚洲禁片免费| 美女脱光内衣内裤视频久久网站| 久久综合九色综合欧美98| 国产九九视频一区二区三区| 亚洲视频在线观看三级| 777亚洲妇女| 国产老肥熟一区二区三区| 亚洲色图清纯唯美| 91精品国产综合久久久久久久 | 亚洲精品高清在线| 正在播放亚洲一区| 成人自拍视频在线| 亚洲 欧美综合在线网络| 26uuu色噜噜精品一区二区| 91啪亚洲精品| 国产综合久久久久影院| 亚洲美女视频在线观看| 精品999久久久| 91成人免费在线视频| 国精产品一区一区三区mba视频| 亚洲三级在线播放| 久久婷婷久久一区二区三区| 欧美最猛黑人xxxxx猛交| 国产一区二区三区av电影| 一区二区三区四区视频精品免费| 欧美精品一区视频| 欧美日韩黄视频| 国产成人aaa| 日韩精品一区第一页| 亚洲日本在线a| 26uuu欧美日本| 在线91免费看| 日本韩国精品在线| 成人精品小蝌蚪| 国产一区在线观看视频| 五月天精品一区二区三区| 亚洲色图清纯唯美| 亚洲天堂av一区| 久久久精品蜜桃| 欧美一级片在线观看| 在线精品视频免费播放| 成人午夜看片网址| 国产尤物一区二区| 精品一区二区三区在线播放视频| 亚洲最色的网站| 亚洲视频一区二区在线| 国产欧美一区二区精品性| 欧美成人一区二区三区片免费| 欧美天天综合网| 色婷婷av一区二区三区gif| 成人性生交大片免费| 国产激情视频一区二区三区欧美 | 中文字幕乱码久久午夜不卡| 日本精品免费观看高清观看| 黑人巨大精品欧美黑白配亚洲| 国产亚洲综合性久久久影院| 99视频在线观看一区三区| 午夜精品一区二区三区免费视频 | 亚洲人成在线播放网站岛国| 成人午夜在线播放| 精品一二三四在线| 欧美丰满美乳xxx高潮www| 9191国产精品| 欧美日韩你懂得| 欧美唯美清纯偷拍| 欧美色成人综合| 欧美性大战久久| 欧美日韩一区二区在线观看视频| 欧美日韩一区久久| 91麻豆精品国产综合久久久久久 | 99re在线精品| 日本韩国视频一区二区| 欧美在线一二三四区| 在线观看精品一区| 欧美日本免费一区二区三区| 欧美日韩一区二区在线观看| 欧美人妇做爰xxxⅹ性高电影| 欧美老人xxxx18| 精品国产制服丝袜高跟| 久久久国产综合精品女国产盗摄| 国产色婷婷亚洲99精品小说| 综合久久综合久久| 亚洲最大成人综合| 免费高清不卡av| 国产精品亚洲第一区在线暖暖韩国| 大尺度一区二区| 91福利国产精品| 日韩欧美国产1| 国产精品欧美久久久久无广告| 亚洲精选免费视频| 日av在线不卡| 成人高清视频免费观看| 一本到高清视频免费精品| 91精品国产综合久久久蜜臀图片| 精品福利一区二区三区免费视频| 国产精品视频在线看| 亚洲国产成人porn| 国内精品久久久久影院薰衣草| av在线一区二区三区| 欧美性xxxxxxxx| 久久先锋资源网| 亚洲国产婷婷综合在线精品| 蜜桃精品视频在线| 91首页免费视频| 日韩欧美一区中文| 亚洲日本一区二区三区| 免费在线观看日韩欧美| 成人99免费视频| 日韩一区二区电影| 亚洲青青青在线视频| 麻豆国产91在线播放| 91网站最新网址| 欧美精品一区二| 午夜私人影院久久久久| 成人免费看视频| 精品黑人一区二区三区久久| 亚洲欧美视频在线观看视频| 激情综合色综合久久| 欧美性生活大片视频| 欧美经典三级视频一区二区三区| 午夜视频在线观看一区| 99视频一区二区三区| 亚洲嫩草精品久久| 韩国精品主播一区二区在线观看| 日本韩国一区二区| 国产精品久久久久久久久免费樱桃 | 国产精品一区二区三区四区| 欧美视频一区二| 1024精品合集| 国产盗摄女厕一区二区三区| 欧美一区二区人人喊爽| 亚洲一区二区av电影| 91一区二区三区在线观看| 国产欧美日韩在线看| 精品在线播放免费| 欧美一区欧美二区| 亚洲不卡一区二区三区| 一本色道**综合亚洲精品蜜桃冫 | 国产精品久久久久久久久动漫| 久久国产精品色| 欧美一区二区大片| 日韩成人免费电影| 精品视频在线免费| 一区二区理论电影在线观看| 99久久久精品| 亚洲视频狠狠干| 99热这里都是精品| 国产精品久久久久久久久晋中 | 1000部国产精品成人观看| 成人免费观看视频| 日本一区二区三区免费乱视频| 国产一区二区三区四区五区美女| 日韩免费看网站| 久久99国产精品尤物| 日韩欧美电影在线| 久久成人久久爱| 欧美成人乱码一区二区三区| 久久精品国产免费| 26uuu色噜噜精品一区二区| 国产在线观看免费一区| 国产日韩精品久久久| 成人一区二区视频| 18涩涩午夜精品.www| 欧洲精品视频在线观看| 亚洲高清视频在线| 日韩亚洲欧美成人一区| 九九热在线视频观看这里只有精品| 精品国产在天天线2019| 国产精品影视在线观看| 国产精品久久久久婷婷| 色婷婷久久久久swag精品| 亚洲国产精品自拍| 欧美一区午夜视频在线观看| 韩国午夜理伦三级不卡影院| 国产日韩欧美一区二区三区综合| 波多野结衣的一区二区三区| 一区二区三区加勒比av| 制服丝袜av成人在线看| 国产一区二区三区四区五区美女| 一区二区高清免费观看影视大全 | 天使萌一区二区三区免费观看| 91精品国产综合久久香蕉的特点 | 青青青伊人色综合久久| 久久久久久久一区| 91片在线免费观看| 美女视频免费一区| 国产精品国产自产拍高清av王其|