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

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

?? dict.c

?? mms client
?? C
字號:
/* * dict.c - lookup data structure using octet strings as keys * * The Dict is implemented as a simple hash table. In the future, it  * might be interesting to use a trie instead. * * Lars Wirzenius, based on code by Tuomas Luttinen */#include "gwlib.h"/* * The hash table stores key/value -pairs in a List. */typedef struct Item Item;struct Item {    Octstr *key;    void *value;};static Item *item_create(Octstr *key, void *value){    Item *item;        item = gw_malloc(sizeof(*item));    item->key = octstr_duplicate(key);    item->value = value;    return item;}static void item_destroy(void *item){    Item *p;        p = item;    octstr_destroy(p->key);    gw_free(p);}static int item_has_key(void *item, void *key){    return octstr_compare(key, ((Item *) item)->key) == 0;}/* * The dictionary itself is a very simple hash table. * `tab' is an array of Lists of Items, in which empty Lists may be * represented as NULL.  `size' is the number of elements allocated * for the array, and `key_count' is the number of Items currently * in the table.  `key_count' is kept up to date by the put and remove * functions, and is used to make dict_key_count() faster. */struct Dict {    List **tab;    long size;    long key_count;    void (*destroy_value)(void *);    Mutex *lock;};static void lock(Dict *dict){    mutex_lock(dict->lock);}static void unlock(Dict *dict){    mutex_unlock(dict->lock);}static long key_to_index(Dict *dict, Octstr *key){    return octstr_hash_key(key) % dict->size;}static int handle_null_value(Dict *dict, Octstr *key, void *value){    if (value == NULL) {        value = dict_remove(dict, key);	if (dict->destroy_value != NULL)	    dict->destroy_value(value);        return 1;    }    return 0;}static int dict_put_true(Dict *dict, Octstr *key, void *value){    Item *p;    long i;    int item_unique;    item_unique = 0;    lock(dict);    i = key_to_index(dict, key);    if (dict->tab[i] == NULL) {	dict->tab[i] = list_create();	p = NULL;    } else {	p = list_search(dict->tab[i], key, item_has_key);    }    if (p == NULL) {    	p = item_create(key, value);	list_append(dict->tab[i], p);        dict->key_count++;        item_unique = 1;    } else {    	if (dict->destroy_value != NULL)    	    dict->destroy_value(value);        item_unique = 0;    }    unlock(dict);    return item_unique;}/* * And finally, the public functions. */Dict *dict_create(long size_hint, void (*destroy_value)(void *)){    Dict *dict;    long i;        dict = gw_malloc(sizeof(*dict));    /*     * Hash tables tend to work well until they are fill to about 50%.     */    dict->size = size_hint * 2;    dict->tab = gw_malloc(sizeof(dict->tab[0]) * dict->size);    for (i = 0; i < dict->size; ++i)    	dict->tab[i] = NULL;    dict->lock = mutex_create();    dict->destroy_value = destroy_value;    dict->key_count = 0;        return dict;}void dict_destroy(Dict *dict){    long i;    Item *p;        if (dict == NULL)        return;    for (i = 0; i < dict->size; ++i) {        if (dict->tab[i] == NULL)	    continue;	while ((p = list_extract_first(dict->tab[i])) != NULL) {	    if (dict->destroy_value != NULL)	    	dict->destroy_value(p->value);	    item_destroy(p);	}	list_destroy(dict->tab[i], NULL);    }    mutex_destroy(dict->lock);    gw_free(dict->tab);    gw_free(dict);}void dict_put(Dict *dict, Octstr *key, void *value){    long i;    Item *p;    if (value == NULL) {        value = dict_remove(dict, key);	if (dict->destroy_value != NULL)	    dict->destroy_value(value);        return;    }    lock(dict);    i = key_to_index(dict, key);    if (dict->tab[i] == NULL) {	dict->tab[i] = list_create();	p = NULL;    } else	p = list_search(dict->tab[i], key, item_has_key);    if (p == NULL) {    	p = item_create(key, value);	list_append(dict->tab[i], p);        dict->key_count++;    } else {	if (dict->destroy_value != NULL)	    dict->destroy_value(p->value);	p->value = value;    }    unlock(dict);}int dict_put_once(Dict *dict, Octstr *key, void *value){    int ret;    ret = 1;    if (handle_null_value(dict, key, value))        return 1;    if (dict_put_true(dict, key, value)) {        ret = 1;    } else {        ret = 0;    }    return ret;}void *dict_get(Dict *dict, Octstr *key){    long i;    Item *p;    void *value;    lock(dict);    i = key_to_index(dict, key);    if (dict->tab[i] == NULL)	p = NULL;    else        p = list_search(dict->tab[i], key, item_has_key);    if (p == NULL)    	value = NULL;    else    	value = p->value;    unlock(dict);    return value;}void *dict_remove(Dict *dict, Octstr *key){    long i;    Item *p;    void *value;    List *list;    lock(dict);    i = key_to_index(dict, key);    if (dict->tab[i] == NULL)        list = NULL;    else        list = list_extract_matching(dict->tab[i], key, item_has_key);    gw_assert(list == NULL || list_len(list) == 1);    if (list == NULL)    	value = NULL;    else {	p = list_get(list, 0);	list_destroy(list, NULL);    	value = p->value;	item_destroy(p);	dict->key_count--;    }    unlock(dict);    return value;}long dict_key_count(Dict *dict){    long result;    lock(dict);    result = dict->key_count;    unlock(dict);    return result;}List *dict_keys(Dict *dict){    List *list;    Item *item;    long i, j;        list = list_create();    lock(dict);    for (i = 0; i < dict->size; ++i) {	if (dict->tab[i] == NULL)	    continue;	for (j = 0; j < list_len(dict->tab[i]); ++j) {	    item = list_get(dict->tab[i], j);	    list_append(list, octstr_duplicate(item->key));	}    }    unlock(dict);        return list;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品写真福利| 亚洲乱码日产精品bd| 欧美吞精做爰啪啪高潮| 欧美日韩aaaaa| 丰满少妇久久久久久久| 福利电影一区二区三区| 国产麻豆精品theporn| 国产成人免费网站| 成人福利电影精品一区二区在线观看| 国产成人免费视频网站高清观看视频| 国产激情精品久久久第一区二区| 国产成人三级在线观看| 成人精品电影在线观看| 色吊一区二区三区| 69堂亚洲精品首页| 久久久国产一区二区三区四区小说 | 色av综合在线| 在线成人午夜影院| 久久这里只有精品6| 亚洲欧洲韩国日本视频 | 日本韩国一区二区| 91麻豆精品国产| 久久精品人人做| 亚洲精品国产精华液| 免费人成精品欧美精品| 国产 欧美在线| 欧美午夜宅男影院| 欧美mv日韩mv国产网站| 亚洲色欲色欲www| 麻豆91免费观看| gogogo免费视频观看亚洲一| 欧美亚洲自拍偷拍| 亚洲精品一区二区三区福利| 亚洲精品国产第一综合99久久 | 在线播放国产精品二区一二区四区| 欧美高清一级片在线| 日本一区二区成人| 三级在线观看一区二区| 9i看片成人免费高清| 欧美电影在线免费观看| 亚洲欧洲日韩av| 蜜桃视频在线观看一区二区| www.亚洲激情.com| 精品成人免费观看| 一区二区久久久久久| 丁香婷婷深情五月亚洲| 精品久久五月天| 亚洲国产精品久久久久秋霞影院| 成人污视频在线观看| 精品久久久久久久人人人人传媒| 亚洲自拍偷拍网站| 91免费版在线| 国产精品久久综合| 国产精品一区二区久久不卡| 日韩一区二区高清| 午夜精品福利在线| 色欧美日韩亚洲| 在线免费一区三区| 亚洲精品一区二区三区在线观看| 国产激情视频一区二区在线观看| 日本欧美肥老太交大片| 国产露脸91国语对白| 91精品国产色综合久久不卡蜜臀 | 精品久久久久久无| 三级亚洲高清视频| 欧美日韩一卡二卡三卡 | 国产精品一区二区三区四区| 欧美成人一区二区| 美女久久久精品| 欧美一区二区三区四区五区| 亚洲一区二区三区四区在线观看 | 欧美一区二区三区不卡| 香港成人在线视频| 欧美精品久久天天躁| 亚洲国产一区二区三区青草影视| 色哟哟国产精品| 一区二区欧美国产| 欧美色爱综合网| 日韩电影在线一区二区三区| 欧美日本在线播放| 麻豆成人av在线| 国产日韩欧美一区二区三区综合| 国产成人免费在线| 亚洲欧洲制服丝袜| 欧美三片在线视频观看| 日本网站在线观看一区二区三区| 日韩欧美色综合| 国产成人免费视频网站| 日韩久久一区二区| 欧美视频一区在线观看| 美女性感视频久久| 国产香蕉久久精品综合网| 99麻豆久久久国产精品免费优播| 亚洲综合成人网| 日韩一级免费一区| 成人精品一区二区三区中文字幕| 亚洲色图丝袜美腿| 91精品国产色综合久久不卡蜜臀| 激情综合色播五月| 中文字幕一区二区在线观看 | 麻豆国产精品官网| 国产精品青草综合久久久久99| 99国产一区二区三精品乱码| 一区二区在线免费| 亚洲精品在线观看网站| 成人午夜电影网站| 日韩中文字幕不卡| 国产精品初高中害羞小美女文| 在线观看亚洲a| 国产一区二区精品在线观看| 亚洲欧美日本在线| wwww国产精品欧美| 欧美性生活一区| 成人精品免费视频| 日本亚洲三级在线| 亚洲日本va在线观看| 2021国产精品久久精品| 在线观看日产精品| 国产成人免费xxxxxxxx| 亚洲v精品v日韩v欧美v专区| 欧美国产日韩精品免费观看| 欧美一区二区在线视频| av激情亚洲男人天堂| 国产福利一区二区三区| 日韩精品电影一区亚洲| 亚洲色图另类专区| 国产亚洲精品精华液| 欧美一区二区在线不卡| 91免费看片在线观看| 国产一区二区三区观看| 日韩电影免费在线| 亚洲不卡一区二区三区| 亚洲视频 欧洲视频| 日本一区二区三区电影| 精品久久久久久综合日本欧美| 在线看国产一区| 91小视频免费看| 99久久精品国产麻豆演员表| 成人性生交大片免费看视频在线| 久久不见久久见免费视频1| 亚洲成人综合在线| 亚洲综合激情另类小说区| 亚洲欧美另类久久久精品2019| 欧美激情一区在线| 国产精品天干天干在线综合| 久久久99精品久久| 国产日韩欧美综合一区| 久久久久国产精品人| 久久午夜电影网| 亚洲国产精品精华液ab| 久久久久久久久久电影| 久久九九影视网| 中文字幕不卡在线| 国产精品区一区二区三| 国产精品国产三级国产aⅴ无密码| 欧美高清在线精品一区| 国产精品久久免费看| 亚洲欧美另类图片小说| 亚洲一区二区三区视频在线播放 | 欧美视频在线一区二区三区| 色狠狠av一区二区三区| 在线免费精品视频| 欧美日韩国产美| 日韩免费电影网站| 久久久久九九视频| 中文字幕在线不卡国产视频| 亚洲乱码中文字幕| 亚洲成人免费电影| 麻豆免费看一区二区三区| 国产一区二区在线观看免费| 国产成人午夜电影网| 一本久道中文字幕精品亚洲嫩| 欧美主播一区二区三区| 日韩一区二区在线看| 中文字幕成人av| 亚洲国产成人av网| 国产一区二区视频在线| av午夜精品一区二区三区| 欧美性大战久久久久久久| 欧美va在线播放| 国产精品女上位| 免费在线欧美视频| 丁香五精品蜜臀久久久久99网站| 在线视频国内自拍亚洲视频| 日韩亚洲欧美在线观看| 中文字幕亚洲视频| 日本伊人色综合网| 99这里都是精品| 欧美成人a在线| 亚洲精品少妇30p| 国产美女精品在线| 欧美视频三区在线播放| 国产视频一区在线播放| 三级不卡在线观看| 成人午夜电影小说| 精品国产免费一区二区三区四区| 亚洲精品老司机| 成人免费看的视频| 久久综合精品国产一区二区三区| 亚洲欧美电影院|