⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asarray.c

📁 完整的RTP RTSP代码库
💻 C
字号:
/* * FILE:    asarray.c * * AUTHORS: Orion Hodson * * Copyright (c) 1999-2000 University College London * All rights reserved. */ #include "config_unix.h"#include "config_win32.h"#include "debug.h"#include "memory.h"#include "util.h"#include "asarray.h"typedef struct s_hash_tuple {        uint32_t hash;        char *key;        char *value;        struct s_hash_tuple *next;} hash_tuple;#define ASARRAY_SIZE 11struct _asarray {        hash_tuple *table[ASARRAY_SIZE];        int32_t     nitems[ASARRAY_SIZE];};static uint32_t asarray_hash(const char *key){        uint32_t hash = 0;        while(*key != '\0') {                hash = hash * 31;                hash += ((uint32_t)*key) + 1;                key++;        }        return hash;}int32_tasarray_add(asarray *pa, const char *key, const char *value){        hash_tuple *t;        int row;        t = (hash_tuple*)xmalloc(sizeof(hash_tuple));        if (t) {                /* transfer values */                t->hash  = asarray_hash(key);                t->key   = xstrdup(key);                t->value = xstrdup(value);                /* Add to table */                row            = t->hash % ASARRAY_SIZE;                t->next        = pa->table[row];                pa->table[row] = t;                pa->nitems[row]++;                return TRUE;        }        return FALSE;}voidasarray_remove(asarray *pa, const char *key){        hash_tuple **t, *e;        uint32_t hash;        int row;        hash = asarray_hash(key);        row  = hash % ASARRAY_SIZE;        t    = &pa->table[row];        while((*t) != NULL) {                if ((hash == (*t)->hash) &&                     (strcmp(key, (*t)->key) == 0)) {                        e = *t;                        *t = e->next;                        xfree(e->key);                        xfree(e->value);                        xfree(e);                        pa->nitems[row]--;                        ASSERT(pa->nitems[row] >= 0);                        break;                } else {                        t = &(*t)->next;                }        }}const char* asarray_get_key_no(asarray *pa, int32_t index){        int32_t row = 0;        index += 1;        while (row < ASARRAY_SIZE && index > pa->nitems[row]) {                index -= pa->nitems[row];                row++;        }        if (row < ASARRAY_SIZE) {                hash_tuple *t;                t = pa->table[row];                while(--index > 0) {                        ASSERT(t->next != NULL);                        t = t->next;                }                return t->key;        }        return NULL;}/* asarray_lookup points value at actual value        *//* and return TRUE if key found.                      */int32_tasarray_lookup(asarray *pa, const char *key, char **value){        hash_tuple *t;        int          row;        uint32_t     hash;        hash = asarray_hash(key);        row  = hash % ASARRAY_SIZE;        t = pa->table[row];        while(t != NULL) {                if (t->hash == hash && strcmp(key, t->key) == 0) {                        *value = t->value;                        return TRUE;                }                t = t->next;        }        *value = NULL;        return FALSE;}int32_tasarray_create(asarray **ppa){        asarray *pa;        pa = (asarray*)xmalloc(sizeof(asarray));        if (pa != NULL) {                memset(pa, 0, sizeof(asarray));                *ppa = pa;                return TRUE;        }        return FALSE;}voidasarray_destroy(asarray **ppa){        asarray    *pa;        const char *key;        pa = *ppa;        ASSERT(pa != NULL);        while ((key = asarray_get_key_no(pa, 0)) != NULL) {                asarray_remove(pa, key);        }        xfree(pa);        *ppa = NULL;        xmemchk();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -