⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.h

📁 无线个域网(WPAN)就是在个人周围空间形成的无线网络
💻 H
字号:
/*  * 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 __cplusplusextern "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#endiftypedef 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -