メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# st.h

This is a public domain general purpose hash table package written by Peter Moore @ UCB. [詳細]

`#include "dkcOSIndependent.h"`

st.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

## 構成
struct | st_hash_type
struct | st_table
## マクロ定義
#define | st_is_member(table, key) st_lookup(table,key,(char **)0)
## 型定義
typedef st_table | st_table
## 列挙型
enum | st_retval { ST_CONTINUE, ST_STOP, ST_DELETE }
## 関数
DKC_EXTERN st_table * | st_init_table_with_size (struct st_hash_type *type, int size)
DKC_EXTERN st_table * | st_init_table (struct st_hash_type *type)
DKC_EXTERN st_table * | st_init_numtable ()
DKC_EXTERN st_table * | st_init_numtable_with_size (int size)
DKC_EXTERN st_table * | st_init_strtable ()
DKC_EXTERN st_table * | st_init_strtable_with_size (int size)
DKC_EXTERN void | st_free_table (st_table *table)
DKC_EXTERN int | st_lookup (st_table *table, register char *key, char **value)
DKC_EXTERN int | st_insert (st_table *table, char *key, char *value)
DKC_EXTERN void | st_add_direct (st_table *table, char *key, char *value)
DKC_EXTERN st_table * | st_copy (st_table *old_table)
DKC_EXTERN int | st_delete (st_table *table, char **key, char **value)
DKC_EXTERN int | st_delete_safe (st_table *table, char **key, char **value, char *never)
DKC_EXTERN void | st_cleanup_safe (st_table *table, char *never)
DKC_EXTERN void | st_foreach (st_table *table, int(*func)(), char *arg)

## 説明

This is a public domain general purpose hash table package written by Peter Moore @ UCB.

覚え書き:
  @(#) st.h 5.1 89/12/14 reconstruct by d金魚

st.h で定義されています。

## マクロ定義

#define st_is_member | ( | table,
|  | key |  | ) | st_lookup(table,key,(char **)0)

| st.h の 25 行で定義されています。

## 型定義

typedef struct st_table st_table

## 列挙型

enum st_retval

  | 列挙型の値:
  ST_CONTINUE |
  ST_STOP |
  ST_DELETE |
st.h の 27 行で定義されています。
    00027 {ST_CONTINUE, ST_STOP, ST_DELETE};

## 関数

DKC_EXTERN void st_add_direct | ( | st_table * | table,
|  | char * | key,
|  | char * | value
| ) |

| st.c の 307 行で定義されています。 参照先 ADD_DIRECT, do_hash, と st_table::num_bins.
    00311 {
    00312     unsigned int hash_val, bin_pos;
    00313
    00314     hash_val = do_hash(key, table);
    00315     bin_pos = hash_val % table->num_bins;
    00316     ADD_DIRECT(table, key, value, hash_val, bin_pos);
    00317 }

DKC_EXTERN void st_cleanup_safe | ( | st_table * | table,
|  | char * | never
| ) |

| st.c の 467 行で定義されています。 参照先 delete_never(), st_table::num_entries, と st_foreach().
    00468 {
    00469     int num_entries = table->num_entries;
    00470
    00471     st_foreach(table, delete_never, never);
    00472     table->num_entries = num_entries;
    00473 }

DKC_EXTERN st_table* st_copy | ( | st_table * | old_table | ) |

| st.c の 346 行で定義されています。 参照先 alloc, st_table::bins, Calloc, st_table_entry::next, と st_table::num_bins.
    00348 {
    00349     st_table *new_table;
    00350     st_table_entry *ptr, *entry;
    00351     int i, num_bins = old_table->num_bins;
    00352
    00353     new_table = alloc(st_table);
    00354     if (new_table == 0) {
    00355     return 0;
    00356     }
    00357
    00358     *new_table = *old_table;
    00359     new_table->bins = (st_table_entry**)
    00360     Calloc((unsigned)num_bins, sizeof(st_table_entry*));
    00361
    00362     if (new_table->bins == 0) {
    00363     free(new_table);
    00364     return 0;
    00365     }
    00366
    00367     for(i = 0; i < num_bins; i++) {
    00368     new_table->bins[i] = 0;
    00369     ptr = old_table->bins[i];
    00370     while (ptr != 0) {
    00371         entry = alloc(st_table_entry);
    00372         if (entry == 0) {
    00373         free(new_table->bins);
    00374         free(new_table);
    00375         return 0;
    00376         }
    00377         *entry = *ptr;
    00378         entry->next = new_table->bins[i];
    00379         new_table->bins[i] = entry;
    00380         ptr = ptr->next;
    00381     }
    00382     }
    00383     return new_table;
    00384 }

DKC_EXTERN int st_delete | ( | st_table * | table,
|  | char ** | key,
|  | char ** | value
| ) |

DKC_EXTERN int st_delete_safe | ( | st_table * | table,
|  | char ** | key,
|  | char ** | value,
|  | char * | never
| ) |

DKC_EXTERN void st_foreach | ( | st_table * | table,
|  | int(*)() | func,
|  | char * | arg
| ) |

| st.c の 476 行で定義されています。 参照先 st_table::bins, st_table_entry::key, st_table_entry::next, st_table::num_bins, st_table::num_entries, st_table_entry::record, ST_CONTINUE, ST_DELETE, ST_STOP, と tmp. 参照元 st_cleanup_safe().
    00477 {
    00478     st_table_entry *ptr, *last, *tmp;
    00479     enum st_retval retval;
    00480     int i;
    00481
    00482     for(i = 0; i < table->num_bins; i++) {
    00483     last = 0;
    00484     for(ptr = table->bins[i]; ptr != 0;) {
    00485         retval = (*func)(ptr->key, ptr->record, arg);
    00486         switch (retval) {
    00487         case ST_CONTINUE:
    00488         last = ptr;
    00489         ptr = ptr->next;
    00490         break;
    00491         case ST_STOP:
    00492         return;
    00493         case ST_DELETE:
    00494         tmp = ptr;
    00495         if (last == 0) {
    00496             table->bins[i] = ptr->next;
    00497         }
    00498         else {
    00499             last->next = ptr->next;
    00500         }
    00501         ptr = ptr->next;
    00502         free(tmp);
    00503         table->num_entries--;
    00504         }
    00505     }
    00506     }
    00507 }

DKC_EXTERN void st_free_table | ( | st_table * | table | ) |

| st.c の 206 行で定義されています。 参照先 st_table::bins, st_table_entry::next, と st_table::num_bins.
    00208 {
    00209     register st_table_entry *ptr, *next;
    00210     int i;
    00211
    00212     for(i = 0; i < table->num_bins; i++) {
    00213     ptr = table->bins[i];
    00214     while (ptr != 0) {
    00215         next = ptr->next;
    00216         free(ptr);
    00217         ptr = next;
    00218     }
    00219     }
    00220     free(table->bins);
    00221     free(table);
    00222 }

DKC_EXTERN st_table* st_init_numtable | ( |  | ) |

| st.c の 180 行で定義されています。 参照先 st_init_table().
    00181 {
    00182     return st_init_table(&type_numhash);
    00183 }

DKC_EXTERN st_table* st_init_numtable_with_size | ( | int | size | ) |

| st.c の 186 行で定義されています。 参照先 st_init_table_with_size().
    00188 {
    00189     return st_init_table_with_size(&type_numhash, size);
    00190 }

DKC_EXTERN st_table* st_init_strtable | ( |  | ) |

| st.c の 193 行で定義されています。 参照先 st_init_table().
    00194 {
    00195     return st_init_table(&type_strhash);
    00196 }

DKC_EXTERN st_table* st_init_strtable_with_size | ( | int | size | ) |

| st.c の 199 行で定義されています。 参照先 st_init_table_with_size().
    00201 {
    00202     return st_init_table_with_size(&type_strhash, size);
    00203 }

DKC_EXTERN st_table* st_init_table | ( | struct st_hash_type * | type | ) |

| st.c の 174 行で定義されています。 参照先 st_init_table_with_size(). 参照元 st_init_numtable(), と st_init_strtable().
    00175 {
    00176     return st_init_table_with_size(type, 0);
    00177 }

DKC_EXTERN st_table* st_init_table_with_size | ( | struct st_hash_type * | type,
|  | int | size
| ) |

| st.c の 152 行で定義されています。 参照先 alloc, st_table::bins, Calloc, new_size(), st_table::num_bins, st_table::num_entries, と st_table::type. 参照元 st_init_numtable_with_size(), st_init_strtable_with_size(), と st_init_table().
    00153 {
    00154     st_table *tbl;
    00155
    00156 #ifdef HASH_LOG
    00157     if (init_st == 0) {
    00158     init_st = 1;
    00159     atexit(stat_col);
    00160     }
    00161 #endif
    00162
    00163     size = new_size(size);  /* round up to prime number */
    00164
    00165     tbl = alloc(st_table);
    00166     tbl->type = type;
    00167     tbl->num_entries = 0;
    00168     tbl->num_bins = size;
    00169     tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));
    00170
    00171     return tbl;
    00172 }

DKC_EXTERN int st_insert | ( | st_table * | table,
|  | char * | key,
|  | char * | value
| ) |

DKC_EXTERN int st_lookup | ( | st_table * | table,
|  | register char * | key,
|  | char ** | value
| ) |

| st.c の 246 行で定義されています。 参照先 do_hash, FIND_ENTRY, と st_table_entry::record.
    00250 {
    00251     unsigned int hash_val, bin_pos;
    00252     register st_table_entry *ptr;
    00253
    00254     hash_val = do_hash(key, table);
    00255     FIND_ENTRY(table, ptr, hash_val, bin_pos);
    00256
    00257     if (ptr == 0) {
    00258     return 0;
    00259     }
    00260     else {
    00261     if (value != 0)  *value = ptr->record;
    00262     return 1;
    00263     }
    00264 }