summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/map_8c-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/docs/html/map_8c-source.html')
-rw-r--r--runtime/docs/html/map_8c-source.html920
1 files changed, 0 insertions, 920 deletions
diff --git a/runtime/docs/html/map_8c-source.html b/runtime/docs/html/map_8c-source.html
deleted file mode 100644
index 4dac0d8f..00000000
--- a/runtime/docs/html/map_8c-source.html
+++ /dev/null
@@ -1,920 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>SystemTap: map.c Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.1 -->
-<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
-<h1>map.c</h1><a href="map_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _MAP_C_ </span><span class="comment">/* -*- linux-c -*- */</span>
-00002 <span class="preprocessor">#define _MAP_C_</span>
-00003 <span class="preprocessor"></span><span class="comment"></span>
-00004 <span class="comment">/** @file map.c</span>
-00005 <span class="comment"> * @brief Implements maps (associative arrays) and lists</span>
-00006 <span class="comment"> */</span>
-00007
-00008 <span class="preprocessor">#include "<a class="code" href="map_8h.html">map.h</a>"</span>
-00009 <span class="preprocessor">#include "<a class="code" href="alloc_8c.html">alloc.c</a>"</span>
-00010 <span class="preprocessor">#include "<a class="code" href="string_8c.html">string.c</a>"</span>
-00011
-00012 <span class="keyword">static</span> <span class="keywordtype">int</span> map_sizes[] = {
-00013 <span class="keyword">sizeof</span>(<span class="keyword">struct </span>map_node_int64),
-00014 sizeof(struct map_node_stat),
-00015 sizeof(struct map_node_str),
-00016 0
-00017 };
-00018
-00019 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> string_hash(<span class="keyword">const</span> <span class="keywordtype">char</span> *key1, <span class="keyword">const</span> <span class="keywordtype">char</span> *key2)
-00020 {
-00021 <span class="keywordtype">int</span> hash = 0, count = 0;
-00022 <span class="keywordtype">char</span> *v1 = (<span class="keywordtype">char</span> *)key1;
-00023 <span class="keywordtype">char</span> *v2 = (<span class="keywordtype">char</span> *)key2;
-00024 <span class="keywordflow">while</span> (*v1 &amp;&amp; count++ &lt; 5) {
-00025 hash += *v1++;
-00026 }
-00027 <span class="keywordflow">while</span> (v2 &amp;&amp; *v2 &amp;&amp; count++ &lt; 5) {
-00028 hash += *v2++;
-00029 }
-00030 <span class="keywordflow">return</span> hash_long((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)hash, HASH_TABLE_BITS);
-00031 }
-00032
-00033 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> mixed_hash(<span class="keyword">const</span> <span class="keywordtype">char</span> *key1, <span class="keywordtype">long</span> key2)
-00034 {
-00035 <span class="keywordtype">int</span> hash = 0, count = 0;
-00036 <span class="keywordtype">char</span> *v = (<span class="keywordtype">char</span> *)key1;
-00037 <span class="keywordflow">while</span> (v &amp;&amp; *v &amp;&amp; count++ &lt; 5)
-00038 hash += *v++;
-00039 return hash_long((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)(hash ^ key2), HASH_TABLE_BITS);
-00040 }
-00041 <span class="comment"></span>
-00042 <span class="comment">/** @addtogroup maps </span>
-00043 <span class="comment"> * Implements maps (associative arrays) and lists</span>
-00044 <span class="comment"> * @{ </span>
-00045 <span class="comment"> */</span>
-00046 <span class="comment"></span>
-00047 <span class="comment">/** Create a new map.</span>
-00048 <span class="comment"> * Maps must be created at module initialization time.</span>
-00049 <span class="comment"> * @param max_entries The maximum number of entries allowed. Currently that number will</span>
-00050 <span class="comment"> * be preallocated. If more entries are required, the oldest ones will be deleted. This makes</span>
-00051 <span class="comment"> * it effectively a circular buffer. If max_entries is 0, there will be no maximum and entries</span>
-00052 <span class="comment"> * will be allocated dynamically.</span>
-00053 <span class="comment"> * @param type Type of values stored in this map. </span>
-00054 <span class="comment"> * @return A MAP on success or NULL on failure.</span>
-00055 <span class="comment"> */</span>
-00056
-<a name="l00057"></a><a class="code" href="group__maps.html#ga2">00057</a> <a class="code" href="group__maps.html#ga1">MAP</a> _stp_map_new(<span class="keywordtype">unsigned</span> max_entries, enum valtype type)
-00058 {
-00059 size_t size;
-00060 <a class="code" href="group__maps.html#ga1">MAP</a> m = (<a class="code" href="group__maps.html#ga1">MAP</a>) <a class="code" href="group__alloc.html#ga3">_stp_valloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_root));
-00061 <span class="keywordflow">if</span> (m == NULL)
-00062 <span class="keywordflow">return</span> NULL;
-00063
-00064 INIT_LIST_HEAD(&amp;m-&gt;head);
-00065
-00066 m-&gt;maxnum = max_entries;
-00067 m-&gt;type = type;
-00068 <span class="keywordflow">if</span> (type &gt;= END) {
-00069 dbug (<span class="stringliteral">"map_new: unknown type %d\n"</span>, type);
-00070 <span class="keywordflow">return</span> NULL;
-00071 }
-00072
-00073 <span class="keywordflow">if</span> (max_entries) {
-00074 <span class="keywordtype">void</span> *tmp;
-00075 <span class="keywordtype">int</span> i;
-00076 <span class="keyword">struct </span>list_head *e;
-00077
-00078 INIT_LIST_HEAD(&amp;m-&gt;pool);
-00079 size = map_sizes[type];
-00080 tmp = <a class="code" href="group__alloc.html#ga3">_stp_valloc</a>(max_entries * size);
-00081
-00082 <span class="keywordflow">for</span> (i = max_entries - 1; i &gt;= 0; i--) {
-00083 e = i * size + tmp;
-00084 dbug (<span class="stringliteral">"e=%lx\n"</span>, (<span class="keywordtype">long</span>)e);
-00085 list_add(e, &amp;m-&gt;pool);
-00086 }
-00087 m-&gt;membuf = tmp;
-00088 }
-00089 <span class="keywordflow">return</span> m;
-00090 }
-00091
-00092 <span class="keyword">static</span> <span class="keywordtype">void</span> map_free_strings(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keyword">struct</span> map_node *n)
-00093 {
-00094 <span class="keyword">struct </span>map_node_str *m = (<span class="keyword">struct </span>map_node_str *)n;
-00095 dbug (<span class="stringliteral">"n = %lx\n"</span>, (<span class="keywordtype">long</span>)n);
-00096 <span class="keywordflow">if</span> (map-&gt;type == STRING) {
-00097 dbug (<span class="stringliteral">"val STRING %lx\n"</span>, (<span class="keywordtype">long</span>)m-&gt;str);
-00098 <span class="keywordflow">if</span> (m-&gt;str)
-00099 _stp_free(m-&gt;str);
-00100 }
-00101 if (m-&gt;n.key1type == STR) {
-00102 dbug (<span class="stringliteral">"key1 STR %lx\n"</span>, (<span class="keywordtype">long</span>)<a class="code" href="group__maps.html#ga25">key1str</a>(m));
-00103 <span class="keywordflow">if</span> (<a class="code" href="group__maps.html#ga25">key1str</a>(m))
-00104 _stp_free(key1str(m));
-00105 }
-00106 if (m-&gt;n.key2type == STR) {
-00107 dbug (<span class="stringliteral">"key2 STR %lx\n"</span>, (<span class="keywordtype">long</span>)<a class="code" href="group__maps.html#ga26">key2str</a>(m));
-00108 <span class="keywordflow">if</span> (<a class="code" href="group__maps.html#ga26">key2str</a>(m))
-00109 _stp_free(key2str(m));
-00110 }
-00111 }
-00112 <span class="comment"></span>
-00113 <span class="comment">/** Deletes the current element.</span>
-00114 <span class="comment"> * If no current element (key) for this map is set, this function does nothing.</span>
-00115 <span class="comment"> * @param map </span>
-00116 <span class="comment"> */</span>
-00117
-<a name="l00118"></a><a class="code" href="group__maps.html#ga4">00118</a> <span class="keywordtype">void</span> _stp_map_key_del(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00119 {
-00120 <span class="keyword">struct </span>map_node *m;
-00121
-00122 dbug (<span class="stringliteral">"create=%d key=%lx\n"</span>, map-&gt;create, (<span class="keywordtype">long</span>)map-&gt;key);
-00123 <span class="keywordflow">if</span> (map == NULL)
-00124 <span class="keywordflow">return</span>;
-00125
-00126 <span class="keywordflow">if</span> (map-&gt;create) {
-00127 map-&gt;create = 0;
-00128 map-&gt;key = NULL;
-00129 <span class="keywordflow">return</span>;
-00130 }
-00131
-00132 <span class="keywordflow">if</span> (map-&gt;key == NULL)
-00133 <span class="keywordflow">return</span>;
-00134
-00135 m = (<span class="keyword">struct </span>map_node *)map-&gt;key;
-00136
-00137 <span class="comment">/* remove node from old hash list */</span>
-00138 hlist_del_init(&amp;m-&gt;hnode);
-00139
-00140 <span class="comment">/* remove from entry list */</span>
-00141 list_del(&amp;m-&gt;lnode);
-00142
-00143 <span class="comment">/* remove any allocated string storage */</span>
-00144 map_free_strings(map, (<span class="keyword">struct</span> map_node *)map-&gt;key);
-00145
-00146 <span class="keywordflow">if</span> (map-&gt;maxnum)
-00147 list_add(&amp;m-&gt;lnode, &amp;map-&gt;pool);
-00148 <span class="keywordflow">else</span>
-00149 <a class="code" href="group__alloc.html#ga4">_stp_free</a>(m);
-00150
-00151 map-&gt;key = NULL;
-00152 map-&gt;num--;
-00153 }
-00154 <span class="comment"></span>
-00155 <span class="comment">/** Get the first element in a map.</span>
-00156 <span class="comment"> * @param map </span>
-00157 <span class="comment"> * @returns a pointer to the first element.</span>
-00158 <span class="comment"> * This is typically used with _stp_map_iter(). See the foreach() macro</span>
-00159 <span class="comment"> * for typical usage. It probably does what you want anyway.</span>
-00160 <span class="comment"> * @sa foreach</span>
-00161 <span class="comment"> */</span>
-00162
-<a name="l00163"></a><a class="code" href="group__maps.html#ga5">00163</a> <span class="keyword">struct </span>map_node *<a class="code" href="group__maps.html#ga5">_stp_map_start</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00164 {
-00165 <span class="keywordflow">if</span> (map == NULL)
-00166 <span class="keywordflow">return</span> NULL;
-00167
-00168 dbug (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;head.next);
-00169
-00170 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;head))
-00171 <span class="keywordflow">return</span> NULL;
-00172
-00173 <span class="keywordflow">return</span> (<span class="keyword">struct</span> map_node *)map-&gt;head.next;
-00174 }
-00175 <span class="comment"></span>
-00176 <span class="comment">/** Get the next element in a map.</span>
-00177 <span class="comment"> * @param map </span>
-00178 <span class="comment"> * @param m a pointer to the current element, returned from _stp_map_start()</span>
-00179 <span class="comment"> * or _stp_map_iter().</span>
-00180 <span class="comment"> * @returns a pointer to the next element.</span>
-00181 <span class="comment"> * This is typically used with _stp_map_start(). See the foreach() macro</span>
-00182 <span class="comment"> * for typical usage. It probably does what you want anyway.</span>
-00183 <span class="comment"> * @sa foreach</span>
-00184 <span class="comment"> */</span>
-00185
-<a name="l00186"></a><a class="code" href="group__maps.html#ga6">00186</a> <span class="keyword">struct </span>map_node *<a class="code" href="group__maps.html#ga6">_stp_map_iter</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keyword">struct</span> map_node *m)
-00187 {
-00188 <span class="keywordflow">if</span> (map == NULL)
-00189 <span class="keywordflow">return</span> NULL;
-00190
-00191 dbug (<span class="stringliteral">"%lx next=%lx prev=%lx map-&gt;head.next=%lx\n"</span>, (<span class="keywordtype">long</span>)m,
-00192 (<span class="keywordtype">long</span>)m-&gt;lnode.next, (<span class="keywordtype">long</span>)m-&gt;lnode.prev, (<span class="keywordtype">long</span>)map-&gt;head.next);
-00193
-00194 <span class="keywordflow">if</span> (m-&gt;lnode.next == &amp;map-&gt;head)
-00195 <span class="keywordflow">return</span> NULL;
-00196
-00197 <span class="keywordflow">return</span> (<span class="keyword">struct</span> map_node *)m-&gt;lnode.next;
-00198 }
-00199 <span class="comment"></span>
-00200 <span class="comment">/** Deletes a map.</span>
-00201 <span class="comment"> * Deletes a map, freeing all memory in all elements. Normally done only when the module exits.</span>
-00202 <span class="comment"> * @param map</span>
-00203 <span class="comment"> */</span>
-00204
-<a name="l00205"></a><a class="code" href="group__maps.html#ga7">00205</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga7">_stp_map_del</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00206 {
-00207 <span class="keywordflow">if</span> (map == NULL)
-00208 <span class="keywordflow">return</span>;
-00209
-00210 <span class="keywordflow">if</span> (!list_empty(&amp;map-&gt;head)) {
-00211 <span class="keyword">struct </span>map_node *ptr = (<span class="keyword">struct </span>map_node *)map-&gt;head.next;
-00212 <span class="keywordflow">while</span> (ptr &amp;&amp; ptr != (<span class="keyword">struct</span> map_node *)&amp;map-&gt;head) {
-00213 map_free_strings(map, ptr);
-00214 ptr = (<span class="keyword">struct </span>map_node *)ptr-&gt;lnode.next;
-00215 }
-00216 }
-00217 <a class="code" href="group__alloc.html#ga5">_stp_vfree</a>(map-&gt;membuf);
-00218 <a class="code" href="group__alloc.html#ga5">_stp_vfree</a>(map);
-00219 }
-00220
-00221 <span class="comment">/********************** KEY FUNCTIONS *********************/</span>
-00222
-00223 <span class="comment"></span>
-00224 <span class="comment">/** Set the map's key to two longs.</span>
-00225 <span class="comment"> * This sets the current element based on a key of two strings. If the keys are</span>
-00226 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00227 <span class="comment"> * call.</span>
-00228 <span class="comment"> * @param map</span>
-00229 <span class="comment"> * @param key1 first key</span>
-00230 <span class="comment"> * @param key2 second key</span>
-00231 <span class="comment"> */</span>
-00232
-<a name="l00233"></a><a class="code" href="group__maps.html#ga8">00233</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga8">_stp_map_key_long_long</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">long</span> key1, <span class="keywordtype">long</span> key2)
-00234 {
-00235 <span class="keywordtype">unsigned</span> hv;
-00236 <span class="keyword">struct </span>hlist_head *head;
-00237 <span class="keyword">struct </span>hlist_node *e;
-00238
-00239 <span class="keywordflow">if</span> (map == NULL)
-00240 <span class="keywordflow">return</span>;
-00241
-00242 hv = hash_long(key1 ^ key2, HASH_TABLE_BITS);
-00243 head = &amp;map-&gt;hashes[hv];
-00244
-00245 dbug (<span class="stringliteral">"hash for %ld,%ld is %d\n"</span>, key1, key2, hv);
-00246
-00247 hlist_for_each(e, head) {
-00248 <span class="keyword">struct </span>map_node *n =
-00249 (<span class="keyword">struct </span>map_node *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node));
-00250 dbug (<span class="stringliteral">"n =%lx key=%ld,%ld\n"</span>, (<span class="keywordtype">long</span>)n, n-&gt;key1.val, n-&gt;key2.val);
-00251 <span class="keywordflow">if</span> (key1 == n-&gt;key1.val &amp;&amp; key2 == n-&gt;key2.val) {
-00252 map-&gt;key = n;
-00253 dbug (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00254 map-&gt;create = 0;
-00255 <span class="keywordflow">return</span>;
-00256 }
-00257 }
-00258
-00259 map-&gt;c_key1.val = key1;
-00260 map-&gt;c_key2.val = key2;
-00261 map-&gt;c_key1type = LONG;
-00262 map-&gt;c_key2type = LONG;
-00263 map-&gt;c_keyhead = head;
-00264 map-&gt;create = 1;
-00265 }
-00266 <span class="comment"></span>
-00267 <span class="comment">/** Set the map's key to two strings.</span>
-00268 <span class="comment"> * This sets the current element based on a key of two strings. If the keys are</span>
-00269 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00270 <span class="comment"> * call.</span>
-00271 <span class="comment"> * @param map</span>
-00272 <span class="comment"> * @param key1 first key</span>
-00273 <span class="comment"> * @param key2 second key</span>
-00274 <span class="comment"> */</span>
-00275
-<a name="l00276"></a><a class="code" href="group__maps.html#ga9">00276</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga9">_stp_map_key_str_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">char</span> *key1, <span class="keywordtype">char</span> *key2)
-00277 {
-00278 <span class="keywordtype">unsigned</span> hv;
-00279 <span class="keyword">struct </span>hlist_head *head;
-00280 <span class="keyword">struct </span>hlist_node *e;
-00281
-00282 <span class="keywordflow">if</span> (map == NULL)
-00283 <span class="keywordflow">return</span>;
-00284
-00285 <span class="keywordflow">if</span> (key1 == NULL) {
-00286 map-&gt;key = NULL;
-00287 <span class="keywordflow">return</span>;
-00288 }
-00289
-00290 hv = string_hash(key1, key2);
-00291 head = &amp;map-&gt;hashes[hv];
-00292
-00293 dbug (<span class="stringliteral">"hash for %s,%s is %d\n"</span>, key1, key2, hv);
-00294
-00295 hlist_for_each(e, head) {
-00296 <span class="keyword">struct </span>map_node *n =
-00297 (<span class="keyword">struct </span>map_node *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node));
-00298 dbug (<span class="stringliteral">"e =%lx key=%s,%s\n"</span>, (<span class="keywordtype">long</span>)e, n-&gt;key1.str,n-&gt;key2.str);
-00299 <span class="keywordflow">if</span> (strcmp(key1, n-&gt;key1.str) == 0
-00300 &amp;&amp; (key2 == NULL || strcmp(key2, n-&gt;key2.str) == 0)) {
-00301 map-&gt;key = n;
-00302 dbug (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00303 map-&gt;create = 0;
-00304 <span class="keywordflow">return</span>;
-00305 }
-00306 }
-00307
-00308 map-&gt;c_key1.str = key1;
-00309 map-&gt;c_key2.str = key2;
-00310 map-&gt;c_key1type = STR;
-00311 map-&gt;c_key2type = STR;
-00312 map-&gt;c_keyhead = head;
-00313 map-&gt;create = 1;
-00314 }
-00315 <span class="comment"></span>
-00316 <span class="comment">/** Set the map's key to a string and a long.</span>
-00317 <span class="comment"> * This sets the current element based on a key of a string and a long. If the keys are</span>
-00318 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00319 <span class="comment"> * call.</span>
-00320 <span class="comment"> * @param map</span>
-00321 <span class="comment"> * @param key1 first key</span>
-00322 <span class="comment"> * @param key2 second key</span>
-00323 <span class="comment"> */</span>
-00324
-<a name="l00325"></a><a class="code" href="group__maps.html#ga10">00325</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga10">_stp_map_key_str_long</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">char</span> *key1, <span class="keywordtype">long</span> key2)
-00326 {
-00327 <span class="keywordtype">unsigned</span> hv;
-00328 <span class="keyword">struct </span>hlist_head *head;
-00329 <span class="keyword">struct </span>hlist_node *e;
-00330
-00331 <span class="keywordflow">if</span> (map == NULL)
-00332 <span class="keywordflow">return</span>;
-00333
-00334 <span class="keywordflow">if</span> (key1 == NULL) {
-00335 map-&gt;key = NULL;
-00336 <span class="keywordflow">return</span>;
-00337 }
-00338
-00339 hv = mixed_hash(key1, key2);
-00340 head = &amp;map-&gt;hashes[hv];
-00341
-00342 dbug (<span class="stringliteral">"hash for %s,%ld is %d\n"</span>, key1, key2, hv);
-00343
-00344 hlist_for_each(e, head) {
-00345 <span class="keyword">struct </span>map_node *n =
-00346 (<span class="keyword">struct </span>map_node *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node));
-00347 dbug (<span class="stringliteral">"e =%lx key=%s,%ld\n"</span>, (<span class="keywordtype">long</span>)e, n-&gt;key1.str,(<span class="keywordtype">long</span>)n-&gt;key2.val);
-00348 <span class="keywordflow">if</span> (strcmp(key1, n-&gt;key1.str) == 0 &amp;&amp; key2 == n-&gt;key2.val) {
-00349 map-&gt;key = n;
-00350 dbug (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00351 map-&gt;create = 0;
-00352 <span class="keywordflow">return</span>;
-00353 }
-00354 }
-00355
-00356 map-&gt;c_key1.str = key1;
-00357 map-&gt;c_key2.val = key2;
-00358 map-&gt;c_key1type = STR;
-00359 map-&gt;c_key2type = LONG;
-00360 map-&gt;c_keyhead = head;
-00361 map-&gt;create = 1;
-00362 }
-00363 <span class="comment"></span>
-00364 <span class="comment">/** Set the map's key to a long and a string.</span>
-00365 <span class="comment"> * This sets the current element based on a key of a long and a string. If the keys are</span>
-00366 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00367 <span class="comment"> * call.</span>
-00368 <span class="comment"> * @param map</span>
-00369 <span class="comment"> * @param key1 first key</span>
-00370 <span class="comment"> * @param key2 second key</span>
-00371 <span class="comment"> */</span>
-00372
-<a name="l00373"></a><a class="code" href="group__maps.html#ga11">00373</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga11">_stp_map_key_long_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">long</span> key1, <span class="keywordtype">char</span> *key2)
-00374 {
-00375 <span class="keywordtype">unsigned</span> hv;
-00376 <span class="keyword">struct </span>hlist_head *head;
-00377 <span class="keyword">struct </span>hlist_node *e;
-00378
-00379 <span class="keywordflow">if</span> (map == NULL)
-00380 <span class="keywordflow">return</span>;
-00381
-00382 hv = mixed_hash(key2, key1);
-00383 head = &amp;map-&gt;hashes[hv];
-00384 dbug (<span class="stringliteral">"hash for %ld,%s is %d\n"</span>, key1, key2, hv);
-00385
-00386 hlist_for_each(e, head) {
-00387 <span class="keyword">struct </span>map_node *n =
-00388 (<span class="keyword">struct </span>map_node *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node));
-00389 dbug (<span class="stringliteral">"e =%lx key=%ld,%s\n"</span>, (<span class="keywordtype">long</span>)e, n-&gt;key1.val,n-&gt;key2.str);
-00390 <span class="keywordflow">if</span> (key1 == n-&gt;key1.val &amp;&amp; strcmp(key2, n-&gt;key2.str) == 0) {
-00391 map-&gt;key = n;
-00392 dbug (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00393 map-&gt;create = 0;
-00394 <span class="keywordflow">return</span>;
-00395 }
-00396 }
-00397
-00398 map-&gt;c_key1.val = key1;
-00399 map-&gt;c_key2.str = key2;
-00400 map-&gt;c_key1type = LONG;
-00401 map-&gt;c_key2type = STR;
-00402 map-&gt;c_keyhead = head;
-00403 map-&gt;create = 1;
-00404 }
-00405 <span class="comment"></span>
-00406 <span class="comment">/** Set the map's key to a string.</span>
-00407 <span class="comment"> * This sets the current element based on a string key. If the key is</span>
-00408 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00409 <span class="comment"> * call.</span>
-00410 <span class="comment"> * @param map</span>
-00411 <span class="comment"> * @param key</span>
-00412 <span class="comment"> */</span>
-00413
-<a name="l00414"></a><a class="code" href="group__maps.html#ga12">00414</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">char</span> *key)
-00415 {
-00416 <span class="keywordflow">if</span> (map == NULL)
-00417 <span class="keywordflow">return</span>;
-00418 <a class="code" href="group__maps.html#ga9">_stp_map_key_str_str</a>(map, key, NULL);
-00419 map-&gt;c_key2type = NONE;
-00420 }
-00421 <span class="comment"></span>
-00422 <span class="comment">/** Set the map's key to a long.</span>
-00423 <span class="comment"> * This sets the current element based on a long key. If the key is</span>
-00424 <span class="comment"> * not found, a new element will not be created until a &lt;i&gt;_stp_map_set_xxx&lt;/i&gt;</span>
-00425 <span class="comment"> * call.</span>
-00426 <span class="comment"> * @param map</span>
-00427 <span class="comment"> * @param key </span>
-00428 <span class="comment"> */</span>
-00429
-<a name="l00430"></a><a class="code" href="group__maps.html#ga13">00430</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga13">_stp_map_key_long</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">long</span> key)
-00431 {
-00432 <span class="keywordflow">if</span> (map == NULL)
-00433 <span class="keywordflow">return</span>;
-00434 <a class="code" href="group__maps.html#ga8">_stp_map_key_long_long</a>(map, key, 0);
-00435 map-&gt;c_key2type = NONE;
-00436 }
-00437
-00438 <span class="comment">/********************** SET/GET VALUES *********************/</span>
-00439
-00440 <span class="keyword">static</span> <span class="keywordtype">void</span> map_copy_keys(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keyword">struct</span> map_node *m)
-00441 {
-00442 m-&gt;key1type = map-&gt;c_key1type;
-00443 m-&gt;key2type = map-&gt;c_key2type;
-00444 <span class="keywordflow">switch</span> (map-&gt;c_key1type) {
-00445 <span class="keywordflow">case</span> STR:
-00446 m-&gt;key1.str = <a class="code" href="group__alloc.html#ga1">_stp_alloc</a>(strlen(map-&gt;c_key1.str) + 1);
-00447 strcpy(m-&gt;key1.str, map-&gt;c_key1.str);
-00448 <span class="keywordflow">break</span>;
-00449 <span class="keywordflow">case</span> LONG:
-00450 m-&gt;key1.val = map-&gt;c_key1.val;
-00451 <span class="keywordflow">break</span>;
-00452 <span class="keywordflow">case</span> NONE:
-00453 <span class="comment">/* ERROR */</span>
-00454 <span class="keywordflow">break</span>;
-00455 }
-00456 <span class="keywordflow">switch</span> (map-&gt;c_key2type) {
-00457 <span class="keywordflow">case</span> STR:
-00458 m-&gt;key2.str = <a class="code" href="group__alloc.html#ga1">_stp_alloc</a>(strlen(map-&gt;c_key2.str) + 1);
-00459 strcpy(m-&gt;key2.str, map-&gt;c_key2.str);
-00460 <span class="keywordflow">break</span>;
-00461 <span class="keywordflow">case</span> LONG:
-00462 m-&gt;key2.val = map-&gt;c_key2.val;
-00463 <span class="keywordflow">break</span>;
-00464 <span class="keywordflow">case</span> NONE:
-00465 <span class="keywordflow">break</span>;
-00466 }
-00467
-00468 <span class="comment">/* add node to new hash list */</span>
-00469 hlist_add_head(&amp;m-&gt;hnode, map-&gt;c_keyhead);
-00470
-00471 map-&gt;key = m;
-00472 map-&gt;create = 0;
-00473 map-&gt;num++;
-00474 }
-00475
-00476 <span class="keyword">static</span> <span class="keywordtype">void</span> __stp_map_set_int64(<a class="code" href="group__maps.html#ga1">MAP</a> map, int64_t val, <span class="keywordtype">int</span> add)
-00477 {
-00478 <span class="keyword">struct </span>map_node_int64 *m;
-00479
-00480 <span class="keywordflow">if</span> (map == NULL)
-00481 return;
-00482
-00483 if (map-&gt;create) {
-00484 <span class="keywordflow">if</span> (val == 0)
-00485 return;
-00486
-00487 if (map-&gt;maxnum) {
-00488 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;pool)) {
-00489 <span class="keywordflow">if</span> (map-&gt;no_wrap) {
-00490 <span class="comment">/* ERROR. FIXME */</span>
-00491 <span class="keywordflow">return</span>;
-00492 }
-00493 m = (<span class="keyword">struct </span>map_node_int64 *)map-&gt;head.next;
-00494 hlist_del_init(&amp;m-&gt;n.hnode);
-00495 map_free_strings(map, (<span class="keyword">struct</span> map_node *)m);
-00496 dbug (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m);
-00497 } <span class="keywordflow">else</span> {
-00498 m = (<span class="keyword">struct </span>map_node_int64 *)map-&gt;pool.next;
-00499 dbug (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m);
-00500 }
-00501 list_move_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00502 } <span class="keywordflow">else</span> {
-00503 m = (<span class="keyword">struct </span>map_node_int64 *)
-00504 <a class="code" href="group__alloc.html#ga2">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_node_int64));
-00505 <span class="comment">/* add node to list */</span>
-00506 list_add_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00507 }
-00508
-00509 <span class="comment">/* copy the key(s) */</span>
-00510 map_copy_keys(map, &amp;m-&gt;n);
-00511
-00512 <span class="comment">/* set the value */</span>
-00513 m-&gt;val = val;
-00514 } <span class="keywordflow">else</span> {
-00515 <span class="keywordflow">if</span> (map-&gt;key == NULL)
-00516 return;
-00517
-00518 if (val) {
-00519 m = (<span class="keyword">struct </span>map_node_int64 *)map-&gt;key;
-00520 <span class="keywordflow">if</span> (add)
-00521 m-&gt;val += val;
-00522 else
-00523 m-&gt;val = val;
-00524 } else if (!add) {
-00525 <span class="comment">/* setting value to 0 is the same as deleting */</span>
-00526 <a class="code" href="group__maps.html#ga4">_stp_map_key_del</a>(map);
-00527 }
-00528 }
-00529 }
-00530 <span class="comment"></span>
-00531 <span class="comment">/** Set the current element's value to an int64.</span>
-00532 <span class="comment"> * This sets the current element's value to an int64. The map must have been created</span>
-00533 <span class="comment"> * to hold int64s using _stp_map_new()</span>
-00534 <span class="comment"> *</span>
-00535 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00536 <span class="comment"> * is set for the map, this function does nothing.</span>
-00537 <span class="comment"> * @param map</span>
-00538 <span class="comment"> * @param val new value</span>
-00539 <span class="comment"> * @sa _stp_map_add_int64</span>
-00540 <span class="comment"> * @sa _stp_map_set()</span>
-00541 <span class="comment"> */</span>
-<a name="l00542"></a><a class="code" href="group__maps.html#ga16">00542</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga16">_stp_map_set_int64</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, int64_t val)
-00543 {
-00544 __stp_map_set_int64 (map, val, 0);
-00545 }
-00546
-00547 <span class="comment"></span>
-00548 <span class="comment">/** Adds an int64 to the current element's value.</span>
-00549 <span class="comment"> * This adds an int64 to the current element's value. The map must have been created</span>
-00550 <span class="comment"> * to hold int64s using _stp_map_new()</span>
-00551 <span class="comment"> *</span>
-00552 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00553 <span class="comment"> * is set for the map, this function does nothing.</span>
-00554 <span class="comment"> * @param map</span>
-00555 <span class="comment"> * @param val value</span>
-00556 <span class="comment"> * @sa _stp_map_set_int64</span>
-00557 <span class="comment"> */</span>
-00558
-<a name="l00559"></a><a class="code" href="group__maps.html#ga17">00559</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, int64_t val)
-00560 {
-00561 __stp_map_set_int64 (map, val, 1);
-00562 }
-00563 <span class="comment"></span>
-00564 <span class="comment">/** Gets the current element's value.</span>
-00565 <span class="comment"> * @param map</span>
-00566 <span class="comment"> * @returns The value. If the current element is not set or doesn't exist, returns 0.</span>
-00567 <span class="comment"> */</span>
-00568
-<a name="l00569"></a><a class="code" href="group__maps.html#ga18">00569</a> int64_t <a class="code" href="group__maps.html#ga18">_stp_map_get_int64</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00570 {
-00571 <span class="keyword">struct </span>map_node_int64 *m;
-00572 <span class="keywordflow">if</span> (map == NULL || map-&gt;create || map-&gt;key == NULL)
-00573 <span class="keywordflow">return</span> 0;
-00574 dbug (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00575 m = (<span class="keyword">struct </span>map_node_int64 *)map-&gt;key;
-00576 <span class="keywordflow">return</span> m-&gt;val;
-00577 }
-00578 <span class="comment"></span>
-00579 <span class="comment">/** Set the current element's value to a C string.</span>
-00580 <span class="comment"> * This sets the current element's value to an C string. The map must have been created</span>
-00581 <span class="comment"> * to hold int64s using &lt;i&gt;_stp_map_new(xxx, STRING)&lt;/i&gt;</span>
-00582 <span class="comment"> *</span>
-00583 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00584 <span class="comment"> * is set for the map, this function does nothing.</span>
-00585 <span class="comment"> * @param map</span>
-00586 <span class="comment"> * @param val new string</span>
-00587 <span class="comment"> * @sa _stp_map_set()</span>
-00588 <span class="comment"> */</span>
-00589
-<a name="l00590"></a><a class="code" href="group__maps.html#ga19">00590</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga19">_stp_map_set_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">char</span> *val)
-00591 {
-00592 <span class="keyword">struct </span>map_node_str *m;
-00593
-00594 <span class="keywordflow">if</span> (map == NULL)
-00595 <span class="keywordflow">return</span>;
-00596
-00597 <span class="keywordflow">if</span> (map-&gt;create) {
-00598 <span class="keywordflow">if</span> (val == NULL)
-00599 <span class="keywordflow">return</span>;
-00600
-00601 <span class="keywordflow">if</span> (map-&gt;maxnum) {
-00602 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;pool)) {
-00603 <span class="keywordflow">if</span> (map-&gt;no_wrap) {
-00604 <span class="comment">/* ERROR. FIXME */</span>
-00605 <span class="keywordflow">return</span>;
-00606 }
-00607 m = (<span class="keyword">struct </span>map_node_str *)map-&gt;head.next;
-00608 hlist_del_init(&amp;m-&gt;n.hnode);
-00609 map_free_strings(map, (<span class="keyword">struct</span> map_node *)m);
-00610 dbug (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m);
-00611 } <span class="keywordflow">else</span> {
-00612 m = (<span class="keyword">struct </span>map_node_str *)map-&gt;pool.next;
-00613 dbug (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m);
-00614 }
-00615 list_move_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00616 } <span class="keywordflow">else</span> {
-00617 m = (<span class="keyword">struct </span>map_node_str *)
-00618 <a class="code" href="group__alloc.html#ga2">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_node_str));
-00619 <span class="comment">/* add node to list */</span>
-00620 list_add_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00621 }
-00622
-00623 <span class="comment">/* copy the key(s) */</span>
-00624 map_copy_keys(map, &amp;m-&gt;n);
-00625
-00626 <span class="comment">/* set the value */</span>
-00627 m-&gt;str = <a class="code" href="group__alloc.html#ga1">_stp_alloc</a>(strlen(val) + 1);
-00628 strcpy(m-&gt;str, val);
-00629 } <span class="keywordflow">else</span> {
-00630 <span class="keywordflow">if</span> (map-&gt;key == NULL)
-00631 <span class="keywordflow">return</span>;
-00632
-00633 <span class="keywordflow">if</span> (val) {
-00634 m = (<span class="keyword">struct </span>map_node_str *)map-&gt;key;
-00635 <span class="keywordflow">if</span> (m-&gt;str)
-00636 <a class="code" href="group__alloc.html#ga4">_stp_free</a>(m-&gt;str);
-00637 m-&gt;str = <a class="code" href="group__alloc.html#ga1">_stp_alloc</a>(strlen(val) + 1);
-00638 strcpy(m-&gt;str, val);
-00639 } <span class="keywordflow">else</span> {
-00640 <span class="comment">/* setting value to 0 is the same as deleting */</span>
-00641 <a class="code" href="group__maps.html#ga4">_stp_map_key_del</a>(map);
-00642 }
-00643 }
-00644 }
-00645 <span class="comment"></span>
-00646 <span class="comment">/** Set the current element's value to String.</span>
-00647 <span class="comment"> * This sets the current element's value to a String. The map must have been created</span>
-00648 <span class="comment"> * to hold int64s using &lt;i&gt;_stp_map_new(xxx, STRING)&lt;/i&gt;</span>
-00649 <span class="comment"> *</span>
-00650 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00651 <span class="comment"> * is set for the map, this function does nothing.</span>
-00652 <span class="comment"> * @param map</span>
-00653 <span class="comment"> * @param str String containing new value.</span>
-00654 <span class="comment"> * @sa _stp_map_set()</span>
-00655 <span class="comment"> */</span>
-00656
-<a name="l00657"></a><a class="code" href="group__maps.html#ga20">00657</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga20">_stp_map_set_string</a> (<a class="code" href="group__maps.html#ga1">MAP</a> map, String str)
-00658 {
-00659 <a class="code" href="group__maps.html#ga19">_stp_map_set_str</a> (map, str-&gt;buf);
-00660 }
-00661 <span class="comment"></span>
-00662 <span class="comment">/** Gets the current element's value.</span>
-00663 <span class="comment"> * @param map</span>
-00664 <span class="comment"> * @returns A string pointer. If the current element is not set or doesn't exist, returns NULL.</span>
-00665 <span class="comment"> */</span>
-00666
-<a name="l00667"></a><a class="code" href="group__maps.html#ga21">00667</a> <span class="keywordtype">char</span> *<a class="code" href="group__maps.html#ga21">_stp_map_get_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00668 {
-00669 <span class="keyword">struct </span>map_node_str *m;
-00670 <span class="keywordflow">if</span> (map == NULL || map-&gt;create || map-&gt;key == NULL)
-00671 <span class="keywordflow">return</span> NULL;
-00672 dbug (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00673 m = (<span class="keyword">struct </span>map_node_str *)map-&gt;key;
-00674 <span class="keywordflow">return</span> m-&gt;str;
-00675 }
-00676 <span class="comment"></span>
-00677 <span class="comment">/** Set the current element's value to a stat.</span>
-00678 <span class="comment"> * This sets the current element's value to an stat struct. The map must have been created</span>
-00679 <span class="comment"> * to hold stats using &lt;i&gt;_stp_map_new(xxx, STAT)&lt;/i&gt;. This function would only be used</span>
-00680 <span class="comment"> * if we wanted to set stats to something other than the normal initial values (count = 0,</span>
-00681 <span class="comment"> * sum = 0, etc). It may be deleted if it doesn't turn out to be useful.</span>
-00682 <span class="comment"> * @sa _stp_map_stat_add </span>
-00683 <span class="comment"> *</span>
-00684 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00685 <span class="comment"> * is set for the map, this function does nothing.</span>
-00686 <span class="comment"> * @param map</span>
-00687 <span class="comment"> * @param stats pointer to stats struct.</span>
-00688 <span class="comment"> * @todo Histograms don't work yet.</span>
-00689 <span class="comment"> */</span>
-00690
-<a name="l00691"></a><a class="code" href="group__maps.html#ga22">00691</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga22">_stp_map_set_stat</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, stat * stats)
-00692 {
-00693 <span class="keyword">struct </span>map_node_stat *m;
-00694
-00695 <span class="keywordflow">if</span> (map == NULL)
-00696 <span class="keywordflow">return</span>;
-00697 dbug (<span class="stringliteral">"set_stat %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00698
-00699 <span class="keywordflow">if</span> (map-&gt;create) {
-00700 <span class="keywordflow">if</span> (stats == NULL)
-00701 <span class="keywordflow">return</span>;
-00702
-00703 <span class="keywordflow">if</span> (map-&gt;maxnum) {
-00704 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;pool)) {
-00705 <span class="keywordflow">if</span> (map-&gt;no_wrap) {
-00706 <span class="comment">/* ERROR. FIXME */</span>
-00707 <span class="keywordflow">return</span>;
-00708 }
-00709 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;head.next;
-00710 hlist_del_init(&amp;m-&gt;n.hnode);
-00711 map_free_strings(map, (<span class="keyword">struct</span> map_node *)m);
-00712 dbug (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m);
-00713 } <span class="keywordflow">else</span> {
-00714 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;pool.next;
-00715 dbug (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m);
-00716 }
-00717 list_move_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00718 } <span class="keywordflow">else</span> {
-00719 m = (<span class="keyword">struct </span>map_node_stat *)
-00720 <a class="code" href="group__alloc.html#ga2">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_node_stat));
-00721 <span class="comment">/* add node to list */</span>
-00722 list_add_tail(&amp;m-&gt;n.lnode, &amp;map-&gt;head);
-00723 }
-00724
-00725 <span class="comment">/* copy the key(s) */</span>
-00726 map_copy_keys(map, &amp;m-&gt;n);
-00727
-00728 <span class="comment">/* set the value */</span>
-00729 memcpy(&amp;m-&gt;stats, stats, <span class="keyword">sizeof</span>(stat));
-00730 } <span class="keywordflow">else</span> {
-00731 <span class="keywordflow">if</span> (map-&gt;key == NULL)
-00732 <span class="keywordflow">return</span>;
-00733
-00734 <span class="keywordflow">if</span> (stats) {
-00735 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;key;
-00736 memcpy(&amp;m-&gt;stats, stats, <span class="keyword">sizeof</span>(stat));
-00737 } <span class="keywordflow">else</span> {
-00738 <span class="comment">/* setting value to NULL is the same as deleting */</span>
-00739 <a class="code" href="group__maps.html#ga4">_stp_map_key_del</a>(map);
-00740 }
-00741 }
-00742 }
-00743 <span class="comment"></span>
-00744 <span class="comment">/** Gets the current element's value.</span>
-00745 <span class="comment"> * @param map</span>
-00746 <span class="comment"> * @returns A pointer to the stats struct. If the current element is not set </span>
-00747 <span class="comment"> * or doesn't exist, returns NULL.</span>
-00748 <span class="comment"> */</span>
-00749
-<a name="l00750"></a><a class="code" href="group__maps.html#ga23">00750</a> stat *<a class="code" href="group__maps.html#ga23">_stp_map_get_stat</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00751 {
-00752 <span class="keyword">struct </span>map_node_stat *m;
-00753 <span class="keywordflow">if</span> (map == NULL || map-&gt;create || map-&gt;key == NULL)
-00754 <span class="keywordflow">return</span> NULL;
-00755 dbug (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00756 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;key;
-00757 <span class="keywordflow">return</span> &amp;m-&gt;stats;
-00758 }
-00759 <span class="comment"></span>
-00760 <span class="comment">/** Add to the current element's statistics.</span>
-00761 <span class="comment"> * Increments the statistics counter by one and the sum by &lt;i&gt;val&lt;/i&gt;.</span>
-00762 <span class="comment"> * Adjusts minimum, maximum, and histogram.</span>
-00763 <span class="comment"> *</span>
-00764 <span class="comment"> * If the element doesn't exist, it is created. If no current element (key)</span>
-00765 <span class="comment"> * is set for the map, this function does nothing.</span>
-00766 <span class="comment"> * @param map</span>
-00767 <span class="comment"> * @param val value to add to the statistics</span>
-00768 <span class="comment"> * @todo Histograms don't work yet.</span>
-00769 <span class="comment"> */</span>
-00770
-<a name="l00771"></a><a class="code" href="group__maps.html#ga24">00771</a> <span class="keywordtype">void</span> <a class="code" href="group__maps.html#ga24">_stp_map_stat_add</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, int64_t val)
-00772 {
-00773 <span class="keyword">struct </span>map_node_stat *m;
-00774 <span class="keywordflow">if</span> (map == NULL)
-00775 <span class="keywordflow">return</span>;
-00776
-00777 <span class="keywordflow">if</span> (map-&gt;create) {
-00778 stat st = { 1, val, val, val };
-00779 <span class="comment">/* histogram */</span>
-00780 <a class="code" href="group__maps.html#ga22">_stp_map_set_stat</a>(map, &amp;st);
-00781 <span class="keywordflow">return</span>;
-00782 }
-00783
-00784 <span class="keywordflow">if</span> (map-&gt;key == NULL)
-00785 <span class="keywordflow">return</span>;
-00786
-00787 dbug (<span class="stringliteral">"add_stat %lx\n"</span>, (<span class="keywordtype">long</span>)map-&gt;key);
-00788 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;key;
-00789 m-&gt;stats.count++;
-00790 m-&gt;stats.sum += val;
-00791 <span class="keywordflow">if</span> (val &gt; m-&gt;stats.max)
-00792 m-&gt;stats.max = val;
-00793 <span class="keywordflow">if</span> (val &lt; m-&gt;stats.min)
-00794 m-&gt;stats.min = val;
-00795 <span class="comment">/* histogram */</span>
-00796 }
-00797 <span class="comment"></span>
-00798 <span class="comment">/** @} */</span>
-00799
-00800 <span class="comment">/********************** List Functions *********************/</span>
-00801 <span class="comment"></span>
-00802 <span class="comment">/** @addtogroup lists</span>
-00803 <span class="comment"> * Lists are special cases of maps.</span>
-00804 <span class="comment"> * @b Example:</span>
-00805 <span class="comment"> * @include list.c</span>
-00806 <span class="comment"> * @{ */</span>
-00807 <span class="comment"></span>
-00808 <span class="comment">/** Create a new list.</span>
-00809 <span class="comment"> * A list is a map that internally has an incrementing long key for each member.</span>
-00810 <span class="comment"> * Lists do not wrap if elements are added to exceed their maximum size.</span>
-00811 <span class="comment"> * @param max_entries The maximum number of entries allowed. Currently that number will</span>
-00812 <span class="comment"> * be preallocated. If max_entries is 0, there will be no maximum and entries</span>
-00813 <span class="comment"> * will be allocated dynamically.</span>
-00814 <span class="comment"> * @param type Type of values stored in this list. </span>
-00815 <span class="comment"> * @return A MAP on success or NULL on failure.</span>
-00816 <span class="comment"> * @sa foreach</span>
-00817 <span class="comment"> */</span>
-00818
-<a name="l00819"></a><a class="code" href="group__lists.html#ga0">00819</a> <a class="code" href="group__maps.html#ga1">MAP</a> <a class="code" href="group__lists.html#ga0">_stp_list_new</a>(<span class="keywordtype">unsigned</span> max_entries, <span class="keyword">enum</span> valtype type)
-00820 {
-00821 <a class="code" href="group__maps.html#ga1">MAP</a> map = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (max_entries, type);
-00822 map-&gt;no_wrap = 1;
-00823 <span class="keywordflow">return</span> map;
-00824 }
-00825 <span class="comment"></span>
-00826 <span class="comment">/** Clears a list.</span>
-00827 <span class="comment"> * All elements in the list are deleted.</span>
-00828 <span class="comment"> * @param map </span>
-00829 <span class="comment"> */</span>
-00830
-<a name="l00831"></a><a class="code" href="group__lists.html#ga1">00831</a> <span class="keywordtype">void</span> <a class="code" href="group__lists.html#ga1">_stp_list_clear</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00832 {
-00833 <span class="keywordflow">if</span> (map == NULL)
-00834 <span class="keywordflow">return</span>;
-00835
-00836 <span class="keywordflow">if</span> (!list_empty(&amp;map-&gt;head)) {
-00837 <span class="keyword">struct </span>map_node *ptr = (<span class="keyword">struct </span>map_node *)map-&gt;head.next;
-00838
-00839 <span class="keywordflow">while</span> (ptr &amp;&amp; ptr != (<span class="keyword">struct</span> map_node *)&amp;map-&gt;head) {
-00840 <span class="keyword">struct </span>map_node *next = (<span class="keyword">struct </span>map_node *)ptr-&gt;lnode.next;
-00841
-00842 <span class="comment">/* remove node from old hash list */</span>
-00843 hlist_del_init(&amp;ptr-&gt;hnode);
-00844
-00845 <span class="comment">/* remove from entry list */</span>
-00846 list_del(&amp;ptr-&gt;lnode);
-00847
-00848 <span class="comment">/* remove any allocated string storage */</span>
-00849 map_free_strings(map, ptr);
-00850
-00851 <span class="keywordflow">if</span> (map-&gt;maxnum)
-00852 list_add(&amp;ptr-&gt;lnode, &amp;map-&gt;pool);
-00853 <span class="keywordflow">else</span>
-00854 <a class="code" href="group__alloc.html#ga4">_stp_free</a>(ptr);
-00855
-00856 map-&gt;num--;
-00857 ptr = next;
-00858 }
-00859 }
-00860
-00861 <span class="keywordflow">if</span> (map-&gt;num != 0) {
-00862 <a class="code" href="group__io.html#ga2">_stp_log</a> (<span class="stringliteral">"ERROR: list is supposed to be empty (has %d)\n"</span>, map-&gt;num);
-00863 }
-00864 }
-00865 <span class="comment"></span>
-00866 <span class="comment">/** Adds a C string to a list.</span>
-00867 <span class="comment"> * @param map</span>
-00868 <span class="comment"> * @param str</span>
-00869 <span class="comment"> * @sa _stp_list_add()</span>
-00870 <span class="comment"> */</span>
-00871
-<a name="l00872"></a><a class="code" href="group__lists.html#ga2">00872</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__lists.html#ga2">_stp_list_add_str</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, <span class="keywordtype">char</span> *str)
-00873 {
-00874 <a class="code" href="group__maps.html#ga13">_stp_map_key_long</a>(map, map-&gt;num);
-00875 <a class="code" href="group__maps.html#ga19">_stp_map_set_str</a>(map, str);
-00876 }
-00877 <span class="comment"></span>
-00878 <span class="comment">/** Adds a String to a list.</span>
-00879 <span class="comment"> * @param map</span>
-00880 <span class="comment"> * @param str String to add.</span>
-00881 <span class="comment"> * @sa _stp_list_add()</span>
-00882 <span class="comment"> */</span>
-00883
-<a name="l00884"></a><a class="code" href="group__lists.html#ga3">00884</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__lists.html#ga3">_stp_list_add_string</a> (<a class="code" href="group__maps.html#ga1">MAP</a> map, String str)
-00885 {
-00886 <a class="code" href="group__maps.html#ga13">_stp_map_key_long</a>(map, map-&gt;num);
-00887 <a class="code" href="group__maps.html#ga19">_stp_map_set_str</a>(map, str-&gt;buf);
-00888 }
-00889 <span class="comment"></span>
-00890 <span class="comment">/** Adds an int64 to a list.</span>
-00891 <span class="comment"> * @param map</span>
-00892 <span class="comment"> * @param val</span>
-00893 <span class="comment"> * @sa _stp_list_add()</span>
-00894 <span class="comment"> */</span>
-00895
-<a name="l00896"></a><a class="code" href="group__lists.html#ga4">00896</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__lists.html#ga4">_stp_list_add_int64</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map, int64_t val)
-00897 {
-00898 <a class="code" href="group__maps.html#ga13">_stp_map_key_long</a>(map, map-&gt;num);
-00899 <a class="code" href="group__maps.html#ga16">_stp_map_set_int64</a>(map, val);
-00900 }
-00901 <span class="comment"></span>
-00902 <span class="comment">/** Get the number of elements in a list.</span>
-00903 <span class="comment"> * @param map</span>
-00904 <span class="comment"> * @returns The number of elements in a list.</span>
-00905 <span class="comment"> */</span>
-00906
-<a name="l00907"></a><a class="code" href="group__lists.html#ga5">00907</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__lists.html#ga5">_stp_list_size</a>(<a class="code" href="group__maps.html#ga1">MAP</a> map)
-00908 {
-00909 <span class="keywordflow">return</span> map-&gt;num;
-00910 }<span class="comment"></span>
-00911 <span class="comment">/** @} */</span>
-00912 <span class="preprocessor">#endif </span><span class="comment">/* _MAP_C_ */</span>
-</pre></div></body></html>