utils.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * COPYRIGHT AND DISCLAIMER
  3.  * 
  4.  * Copyright (C) 1996-1997 by the Regents of the University of California.
  5.  *
  6.  * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
  7.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  8.  * OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF,
  9.  * EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  10.  * 
  11.  * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
  12.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  13.  * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS
  14.  * PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO
  15.  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
  16.  * MODIFICATIONS.
  17.  *
  18.  * For inquiries email Steve Gribble <gribble@cs.berkeley.edu>.
  19.  */
  20. /*
  21.  * utils.h --
  22.  *
  23.  * Various utility functions - sockets, linked list, hash tables.
  24.  * $Id: utils.h,v 1.3 2002/05/23 21:26:03 buchheim Exp $
  25.  * 
  26.  */
  27. #ifndef ICP_UTILS
  28. #define ICP_UTILS
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <unistd.h>
  36. #include <sys/socket.h>
  37. #include <sys/types.h>
  38. #include <netinet/in.h>
  39. #include <fcntl.h>
  40. #include <sys/ioctl.h>
  41. #include "config.h"
  42. #ifdef HAVE_TIME_H
  43. #include <time.h>
  44. #endif
  45. #ifdef HAVE_SYS_TIME_H
  46. #include <sys/time.h>
  47. #endif
  48. #ifdef HAVE_SYS_TIMERS_H
  49. #include <sys/timers.h>
  50. #endif
  51. /*
  52.  ************* Dump out the hexification of the buffer ***********
  53.  */
  54. void dump_buf(FILE *std, char *buf, int retlen);
  55. /*
  56.  ************* Time munging utilities *****************
  57.  */
  58. typedef struct timeval  tv_time;
  59. typedef struct timespec ts_time;
  60. tv_time  tv_timeadd(tv_time t1, tv_time t2);
  61. tv_time  tv_timesub(tv_time t1, tv_time t2);
  62. tv_time  tv_timemul(tv_time t1, double mult);
  63. int      tv_timecmp(tv_time t1, tv_time t2);
  64. ts_time  ts_timeadd(ts_time t1, ts_time t2);
  65. ts_time  ts_timesub(ts_time t1, ts_time t2);
  66. ts_time  ts_timemul(ts_time t1, double mult);
  67. int      ts_timecmp(ts_time t1, ts_time t2);
  68. /*
  69.  ************* Thread-safe strtok routines and state *************
  70.  */
  71. typedef struct ts_strtok_st {
  72.   char *string_dupe;
  73.   char *nxt_ptr;
  74.   int   chars_remaining;
  75. } ts_strtok_state;
  76. /*
  77.  * Thread-safe strtok routines!  Call ts_strtok_init with the string you
  78.  * want tokenized.  It will return a pointer to some state.  Then you
  79.  * call ts_strtok with the same semantics as strtok, more or less, except
  80.  * you have to pass this state around.  When you're done, be sure to call
  81.  * ts_strtok_finish to clean up the state.
  82.  *
  83.  * ts_strtok_init returns NULL if it runs out of memory, or if it is passed
  84.  * a bogus string.  ts_strtok returns NULL in case of error,  ts_strtok_finish
  85.  * returns 1 on success, 0 on error.x
  86.  */
  87. ts_strtok_state *ts_strtok_init(char *string);
  88. char            *ts_strtok(char *matching, ts_strtok_state *state);
  89. int              ts_strtok_finish(ts_strtok_state *state);
  90. /************* A really dumb implementation of strnstr and strcasestr ***********/
  91. char *dumb_strnstr(char *str, char *substr, int n);
  92. const char *dumb_strcasestr(const char *string, const char *substr);
  93. /*
  94.  ***************** Socket convenience utilities ****************
  95.  */
  96. /*
  97.  * correct_write will continue writing to a socket until it fails or
  98.  * until all len bytes have been written.
  99.  */
  100. int correct_write(int s, char *data, int len);
  101. /*
  102.  * correct_read is like correct_write, but does a read.
  103.  */
  104. int correct_read(int s, char *data, int len);
  105. /*
  106.  ***************** Linked-list routines ****************
  107.  */
  108. /*
  109.  * the "ll_node" structure contains a node of a linked list.  Note that
  110.  * a NULL "ll" type implies an empty linked-list.
  111.  */
  112. typedef struct ll_st {
  113.   void         *data;
  114.   struct ll_st *next;
  115.   struct ll_st *prev;
  116. } ll_node, *ll;
  117. /*
  118.  * ll_add_to_end adds data to the end of a linked list.  A new node
  119.  * is always created.  If the list previously didn't exist, then a
  120.  * new list is created and the addToMe variable updated accordingly.
  121.  * This function returns 1 for success.  If we run out of memory, die.
  122.  */
  123. int ll_add_to_end(ll *addToMe, void *data);
  124. /*
  125.  * ll_add_to_start is identical to ll_add_to_end, except the new data
  126.  * is added to the start of the linked list.
  127.  */
  128. int ll_add_to_start(ll *addToMe, void *data);
  129. /* 
  130.  * ll_find traverses the linked list, looking for a node containing
  131.  * data that matches the "data" argument, according to the "compare"
  132.  * comparator function.  "compare" should return 0 if for equal, -1
  133.  * for d1 less than d2, and +1 for d1 greater than d2.  ll_find
  134.  * returns a pointer to the first found node, or NULL if such a node
  135.  * doesn't exist.
  136.  */
  137. ll  ll_find(ll *findInMe, void *data, int (*compare)(void *d1, void *d2));
  138. /*
  139.  * ll_sorted_insert will perform a list element insertion, but will
  140.  * do so in sorted (increasing) order.  This function returns 1 for
  141.  * success, and dies on failure.
  142.  */
  143. int ll_sorted_insert(ll *insertme, void *data, 
  144.      int (*compare)(void *d1, void *d2));
  145. /*
  146.  * ll_del performs an ll_find operation on the "data" argument.  If
  147.  * a node is found, it is removed from the linked list and the data field
  148.  * of the node freed with the "nukeElement" function.  (If "nukeElement"
  149.  * is NULL, the free is avoided.)  If the linked list becomes empty,
  150.  * "*delFromMe" becomes NULL.  If multiple nodes match the "data" argument,
  151.  * only the first is removed.  This function returns 1 if a node is found
  152.  * and removed, or 0 otherwise.
  153.  */
  154. int ll_del(ll *delFromMe, void *data, int (*compare)(void *d1, void *d2),
  155.            void (*nukeElement)(void *nukeMe));
  156. /*
  157.  * ll_delfirst deletes the first element from the list, if it exists.
  158.  * If nukeElement is NULL, the element is not free'd.  This function
  159.  * returns 1 on success, 0 otherwise.
  160.  */
  161. int ll_delfirst(ll *delFromMe, void (*nukeElement)(void *nukeMe));
  162. /*
  163.  * ll_destroy removes all nodes from a list, and calls "nukeElement" on
  164.  * the data field of all nodes.  If "nukeElement" is NULL, no operation
  165.  * is performed on the data field, but the destroy proceeds.  This
  166.  * function always returns 1.
  167.  */
  168. int ll_destroy(ll *destroyMe, void (*nukeElement)(void *nukeMe));
  169. /*
  170.  * ll_build takes a string of the form [a, b, c, .. ] and returns a linked
  171.  * list with elements from the string.  It malloc's space for the new
  172.  * linked list element strings.  The function returns 1 on success, and
  173.  * 0 in case of an error.
  174.  */
  175. int ll_build(ll *buildMe, char *buildFromMe);
  176. /*
  177.  ***************** Hash table routines ****************
  178.  */
  179. typedef ll       hash_el;
  180. typedef struct hash_table_st {
  181.     int num_elements;
  182.     hash_el *slot_array;
  183. } hash_table;
  184. typedef int (*hash_function)(void *element, int num_slots);
  185. typedef int (*sc_comparator)(void *element1, void *element2);
  186. typedef void (*deletor)(void *element);
  187. /*
  188.  * chained_hash_create creates a new chained hash table, with room for
  189.  * "num_slots" slots.  If the creation succeeds, the new table is passed back
  190.  * in the rt variable and 0 is returned, else -1 is returned.
  191.  */
  192. int chained_hash_create(int num_slots, hash_table *rt);
  193. /*
  194.  * chained_hash_destroy destroys a previously created hash table.  It
  195.  * first purges the chains of all non-empty slots in the table, and then
  196.  * frees the table itself.  0 is always returned.
  197.  */
  198. int chained_hash_destroy(hash_table ht, deletor d);
  199. /*
  200.  * chained_hash_insert first uses the hash_function f to acquire the
  201.  * hash slot for the element "element", and then inserts that element
  202.  * into the slot's list.  0 is returned in case of success, and -1 in
  203.  * case of failure.
  204.  */
  205. int chained_hash_insert(hash_table ht, void *element, hash_function f);
  206. /*
  207.  * chained_hash_search finds the stored element matching "element" in
  208.  * table ht according to comparator function "c".  "c" must return 0
  209.  * if two elements match, 1 if the first argument is greater, and -1 if
  210.  * the first argument is less.  If an element is found, it is returned,
  211.  * else NULL is returned.
  212.  */
  213. void *chained_hash_search(hash_table ht, void *element, hash_function f,
  214.                           sc_comparator c);
  215. /*
  216.  * chained_hash_delete removes the element from ht that would be found
  217.  * with chained_hash_search.  It uses the deletor function d to purge
  218.  * the data found.  If deletor is NULL, the purging is not performed.
  219.  * Comparator "c" is used to do the matching within the list. This function
  220.  * returns 1 if an element was deleted, and 0 otherwise.
  221.  */
  222. int chained_hash_delete(hash_table ht, void *element, hash_function f,
  223.                           deletor d, sc_comparator c);
  224. /*************************************************/
  225. /* Filename:  AVL_code.h                         */
  226. /*************************************************/
  227. #ifndef FALSE
  228. #define FALSE 0
  229. #endif
  230. #ifndef TRUE
  231. #define TRUE 1
  232. #endif
  233. typedef struct AVL_tree_st {
  234.     void                *data;
  235.     int              bal;
  236.     struct AVL_tree_st *left;
  237.     struct AVL_tree_st *right;
  238.     struct AVL_tree_st *parent;
  239. } *AVL_tree, AVL_tree_element;
  240. /**** AVL_comparator: if node > comparison return 1, 
  241.                       if node < comparison return -1,
  242.                       if equal return 0
  243.       AVL_deletor: free any space taken up by data ****/
  244. typedef int  (*AVL_comparator)(void *node, void *comparison);
  245. typedef void (*AVL_deletor)(void *deleteMe);
  246. /* these functions return 0 on success, and a negative number on failure */
  247. int      Tree_Add(AVL_tree *addToMe, void *addMe, AVL_comparator theComp);
  248. int      Tree_Delete(AVL_tree *deleteFromMe, void *deleteMe,
  249.                      AVL_comparator theComp, AVL_deletor theDel);
  250. int      Tree_Destroy(AVL_tree *destroyMe, AVL_deletor theDel);
  251. /* these functions return a (+ve) pointer on success, and NULL on failure */
  252. AVL_tree Tree_Search(AVL_tree searchMe, void *searchForMe, AVL_comparator theComp);
  253. AVL_tree Tree_First(AVL_tree searchMe);
  254. AVL_tree Tree_Last(AVL_tree searchMe);
  255. AVL_tree Tree_Next(AVL_tree searchMe);
  256. #ifdef __cplusplus
  257. }
  258. #endif
  259. #endif