File: utils.h

package info (click to toggle)
ns2 2.35%2Bdfsg-2.1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 78,780 kB
  • ctags: 27,490
  • sloc: cpp: 172,923; tcl: 107,130; perl: 6,391; sh: 6,143; ansic: 5,846; makefile: 816; awk: 525; csh: 355
file content (326 lines) | stat: -rw-r--r-- 10,053 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
/* 
 * COPYRIGHT AND DISCLAIMER
 * 
 * Copyright (C) 1996-1997 by the Regents of the University of California.
 *
 * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF,
 * EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS
 * PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO
 * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
 * MODIFICATIONS.
 *
 * For inquiries email Steve Gribble <gribble@cs.berkeley.edu>.
 */


/*
 * utils.h --
 *
 * Various utility functions - sockets, linked list, hash tables.
 * $Id: utils.h,v 1.3 2002/05/23 21:26:03 buchheim Exp $
 * 
 */

#ifndef ICP_UTILS
#define ICP_UTILS

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#include "config.h"

#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_SYS_TIMERS_H
#include <sys/timers.h>
#endif


/*
 ************* Dump out the hexification of the buffer ***********
 */
void dump_buf(FILE *std, char *buf, int retlen);

/*
 ************* Time munging utilities *****************
 */

typedef struct timeval  tv_time;
typedef struct timespec ts_time;

tv_time  tv_timeadd(tv_time t1, tv_time t2);
tv_time  tv_timesub(tv_time t1, tv_time t2);
tv_time  tv_timemul(tv_time t1, double mult);
int      tv_timecmp(tv_time t1, tv_time t2);

ts_time  ts_timeadd(ts_time t1, ts_time t2);
ts_time  ts_timesub(ts_time t1, ts_time t2);
ts_time  ts_timemul(ts_time t1, double mult);
int      ts_timecmp(ts_time t1, ts_time t2);

/*
 ************* Thread-safe strtok routines and state *************
 */

typedef struct ts_strtok_st {
  char *string_dupe;
  char *nxt_ptr;
  int   chars_remaining;
} ts_strtok_state;

/*
 * Thread-safe strtok routines!  Call ts_strtok_init with the string you
 * want tokenized.  It will return a pointer to some state.  Then you
 * call ts_strtok with the same semantics as strtok, more or less, except
 * you have to pass this state around.  When you're done, be sure to call
 * ts_strtok_finish to clean up the state.
 *
 * ts_strtok_init returns NULL if it runs out of memory, or if it is passed
 * a bogus string.  ts_strtok returns NULL in case of error,  ts_strtok_finish
 * returns 1 on success, 0 on error.x
 */

ts_strtok_state *ts_strtok_init(char *string);
char            *ts_strtok(char *matching, ts_strtok_state *state);
int              ts_strtok_finish(ts_strtok_state *state);

/************* A really dumb implementation of strnstr and strcasestr ***********/
char *dumb_strnstr(char *str, char *substr, int n);
const char *dumb_strcasestr(const char *string, const char *substr);

/*
 ***************** Socket convenience utilities ****************
 */

/*
 * correct_write will continue writing to a socket until it fails or
 * until all len bytes have been written.
 */

int correct_write(int s, char *data, int len);

/*
 * correct_read is like correct_write, but does a read.
 */

int correct_read(int s, char *data, int len);

/*
 ***************** Linked-list routines ****************
 */

/*
 * the "ll_node" structure contains a node of a linked list.  Note that
 * a NULL "ll" type implies an empty linked-list.
 */

typedef struct ll_st {
  void         *data;
  struct ll_st *next;
  struct ll_st *prev;
} ll_node, *ll;

/*
 * ll_add_to_end adds data to the end of a linked list.  A new node
 * is always created.  If the list previously didn't exist, then a
 * new list is created and the addToMe variable updated accordingly.
 * This function returns 1 for success.  If we run out of memory, die.
 */

int ll_add_to_end(ll *addToMe, void *data);

/*
 * ll_add_to_start is identical to ll_add_to_end, except the new data
 * is added to the start of the linked list.
 */

int ll_add_to_start(ll *addToMe, void *data);

/* 
 * ll_find traverses the linked list, looking for a node containing
 * data that matches the "data" argument, according to the "compare"
 * comparator function.  "compare" should return 0 if for equal, -1
 * for d1 less than d2, and +1 for d1 greater than d2.  ll_find
 * returns a pointer to the first found node, or NULL if such a node
 * doesn't exist.
 */

ll  ll_find(ll *findInMe, void *data, int (*compare)(void *d1, void *d2));

/*
 * ll_sorted_insert will perform a list element insertion, but will
 * do so in sorted (increasing) order.  This function returns 1 for
 * success, and dies on failure.
 */

int ll_sorted_insert(ll *insertme, void *data, 
		     int (*compare)(void *d1, void *d2));


/*
 * ll_del performs an ll_find operation on the "data" argument.  If
 * a node is found, it is removed from the linked list and the data field
 * of the node freed with the "nukeElement" function.  (If "nukeElement"
 * is NULL, the free is avoided.)  If the linked list becomes empty,
 * "*delFromMe" becomes NULL.  If multiple nodes match the "data" argument,
 * only the first is removed.  This function returns 1 if a node is found
 * and removed, or 0 otherwise.
 */

int ll_del(ll *delFromMe, void *data, int (*compare)(void *d1, void *d2),
           void (*nukeElement)(void *nukeMe));

/*
 * ll_delfirst deletes the first element from the list, if it exists.
 * If nukeElement is NULL, the element is not free'd.  This function
 * returns 1 on success, 0 otherwise.
 */

int ll_delfirst(ll *delFromMe, void (*nukeElement)(void *nukeMe));


/*
 * ll_destroy removes all nodes from a list, and calls "nukeElement" on
 * the data field of all nodes.  If "nukeElement" is NULL, no operation
 * is performed on the data field, but the destroy proceeds.  This
 * function always returns 1.
 */

int ll_destroy(ll *destroyMe, void (*nukeElement)(void *nukeMe));

/*
 * ll_build takes a string of the form [a, b, c, .. ] and returns a linked
 * list with elements from the string.  It malloc's space for the new
 * linked list element strings.  The function returns 1 on success, and
 * 0 in case of an error.
 */

int ll_build(ll *buildMe, char *buildFromMe);

/*
 ***************** Hash table routines ****************
 */

typedef ll       hash_el;
typedef struct hash_table_st {
    int num_elements;
    hash_el *slot_array;
} hash_table;
typedef int (*hash_function)(void *element, int num_slots);
typedef int (*sc_comparator)(void *element1, void *element2);
typedef void (*deletor)(void *element);

/*
 * chained_hash_create creates a new chained hash table, with room for
 * "num_slots" slots.  If the creation succeeds, the new table is passed back
 * in the rt variable and 0 is returned, else -1 is returned.
 */

int chained_hash_create(int num_slots, hash_table *rt);

/*
 * chained_hash_destroy destroys a previously created hash table.  It
 * first purges the chains of all non-empty slots in the table, and then
 * frees the table itself.  0 is always returned.
 */

int chained_hash_destroy(hash_table ht, deletor d);

/*
 * chained_hash_insert first uses the hash_function f to acquire the
 * hash slot for the element "element", and then inserts that element
 * into the slot's list.  0 is returned in case of success, and -1 in
 * case of failure.
 */

int chained_hash_insert(hash_table ht, void *element, hash_function f);

/*
 * chained_hash_search finds the stored element matching "element" in
 * table ht according to comparator function "c".  "c" must return 0
 * if two elements match, 1 if the first argument is greater, and -1 if
 * the first argument is less.  If an element is found, it is returned,
 * else NULL is returned.
 */

void *chained_hash_search(hash_table ht, void *element, hash_function f,
                          sc_comparator c);

/*
 * chained_hash_delete removes the element from ht that would be found
 * with chained_hash_search.  It uses the deletor function d to purge
 * the data found.  If deletor is NULL, the purging is not performed.
 * Comparator "c" is used to do the matching within the list. This function
 * returns 1 if an element was deleted, and 0 otherwise.
 */

int chained_hash_delete(hash_table ht, void *element, hash_function f,
                          deletor d, sc_comparator c);


/*************************************************/
/* Filename:  AVL_code.h                         */
/*************************************************/

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif

typedef struct AVL_tree_st {
    void                *data;
    int		             bal;
    struct AVL_tree_st	*left;
    struct AVL_tree_st	*right;
    struct AVL_tree_st	*parent;
} *AVL_tree, AVL_tree_element;


/**** AVL_comparator: if node > comparison return 1, 
                      if node < comparison return -1,
                      if equal return 0
      AVL_deletor: free any space taken up by data ****/
typedef int  (*AVL_comparator)(void *node, void *comparison);
typedef void (*AVL_deletor)(void *deleteMe);

/* these functions return 0 on success, and a negative number on failure */
int      Tree_Add(AVL_tree *addToMe, void *addMe, AVL_comparator theComp);
int      Tree_Delete(AVL_tree *deleteFromMe, void *deleteMe,
                     AVL_comparator theComp, AVL_deletor theDel);
int      Tree_Destroy(AVL_tree *destroyMe, AVL_deletor theDel);

/* these functions return a (+ve) pointer on success, and NULL on failure */
AVL_tree Tree_Search(AVL_tree searchMe, void *searchForMe, AVL_comparator theComp);
AVL_tree Tree_First(AVL_tree searchMe);
AVL_tree Tree_Last(AVL_tree searchMe);
AVL_tree Tree_Next(AVL_tree searchMe);


#ifdef __cplusplus
}
#endif

#endif