upstream nginx-0.7.35
[nginx.git] / nginx / src / core / ngx_hash.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_HASH_H_INCLUDED_
8 #define _NGX_HASH_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13
14
15 typedef struct {
16     void             *value;
17     u_char            len;
18     u_char            name[1];
19 } ngx_hash_elt_t;
20
21
22 typedef struct {
23     ngx_hash_elt_t  **buckets;
24     ngx_uint_t        size;
25 } ngx_hash_t;
26
27
28 typedef struct {
29     ngx_hash_t        hash;
30     void             *value;
31 } ngx_hash_wildcard_t;
32
33
34 typedef struct {
35     ngx_str_t         key;
36     ngx_uint_t        key_hash;
37     void             *value;
38 } ngx_hash_key_t;
39
40
41 typedef ngx_uint_t (*ngx_hash_key_pt) (u_char *data, size_t len);
42
43
44 typedef struct {
45     ngx_hash_t            hash;
46     ngx_hash_wildcard_t  *wc_head;
47     ngx_hash_wildcard_t  *wc_tail;
48 } ngx_hash_combined_t;
49
50
51 typedef struct {
52     ngx_hash_t       *hash;
53     ngx_hash_key_pt   key;
54
55     ngx_uint_t        max_size;
56     ngx_uint_t        bucket_size;
57
58     char             *name;
59     ngx_pool_t       *pool;
60     ngx_pool_t       *temp_pool;
61 } ngx_hash_init_t;
62
63
64 #define NGX_HASH_SMALL            1
65 #define NGX_HASH_LARGE            2
66
67 #define NGX_HASH_LARGE_ASIZE      16384
68 #define NGX_HASH_LARGE_HSIZE      10007
69
70 #define NGX_HASH_WILDCARD_KEY     1
71 #define NGX_HASH_READONLY_KEY     2
72
73
74 typedef struct {
75     ngx_uint_t        hsize;
76
77     ngx_pool_t       *pool;
78     ngx_pool_t       *temp_pool;
79
80     ngx_array_t       keys;
81     ngx_array_t      *keys_hash;
82
83     ngx_array_t       dns_wc_head;
84     ngx_array_t      *dns_wc_head_hash;
85
86     ngx_array_t       dns_wc_tail;
87     ngx_array_t      *dns_wc_tail_hash;
88 } ngx_hash_keys_arrays_t;
89
90
91 typedef struct {
92     ngx_uint_t        hash;
93     ngx_str_t         key;
94     ngx_str_t         value;
95     u_char           *lowcase_key;
96 } ngx_table_elt_t;
97
98
99 void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len);
100 void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);
101 void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);
102 void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key,
103     u_char *name, size_t len);
104
105 ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
106     ngx_uint_t nelts);
107 ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
108     ngx_uint_t nelts);
109
110 #define ngx_hash(key, c)   ((ngx_uint_t) key * 31 + c)
111 ngx_uint_t ngx_hash_key(u_char *data, size_t len);
112 ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len);
113 ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n);
114
115
116 ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);
117 ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key,
118     void *value, ngx_uint_t flags);
119
120
121 #endif /* _NGX_HASH_H_INCLUDED_ */