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

📄 utils.cc

📁 ns gpsr路由协议 在ns2平台下实现的 对大家很有好处
💻 CC
📖 第 1 页 / 共 3 页
字号:
/*  * 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.c -- * * This file provides utility routines for the core icp functions. * Included are: * *   o linked list routines *   o hash table routines *   o socket convenience routines *   o time munging routines *   o thread-safe strtok *   o thread-unsafe AVL trees (with dorky deletion) * * $Id: utils.cc,v 1.1.1.1 1999/07/29 03:27:29 bkarp Exp $ *  */#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#include <sys/time.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#include <sys/ioctl.h>#include <errno.h>#include <netdb.h>#ifdef _AIX#include <sys/select.h>#endif#include "utils.h"/* *  Case-insensitive version of strstr() */const char *strcasestr(const char *string, const char *substr){  int str_len, substr_len, cmplen, i;  const char *ptr;  str_len = strlen(string);  substr_len = strlen(substr);  cmplen = str_len - substr_len + 1;  for (ptr = string, i=0; i<cmplen; i++, ptr++) {    if (strncasecmp(ptr, substr, substr_len) == 0)      return ptr;  }  return NULL;}/* ************* Dump out the hexification of the buffer *********** */void dump_buf(FILE *std, char *buf, int retlen){  int i, j;  for (i=0; i<retlen/5; i++) {    for (j=0; j<5; j++) {      fprintf(std, "%.02x ", *(buf + (unsigned) 5*i + j));    }    fprintf(std, "     ");    for (j=0; j<5; j++) {      fprintf(std, "%c ", *(buf + (unsigned) 5*i + j));    }    fprintf(std, "\n");  }  if (retlen % 5 != 0) {    for (j=0; j < retlen % 5; j++) {      fprintf(std, "%.02x ", *(buf + (unsigned) 5*(retlen/5) + j));    }    fprintf(std, "     ");    for (j=0; j<5; j++) {      fprintf(std, "%c ", *(buf + (unsigned) 5*i + j));    }    fprintf(std, "\n");  }}/* ************* Time munging utilities ***************** */tv_time  tv_timeadd(tv_time t1, tv_time t2){  tv_time ret;  ret.tv_sec = t1.tv_sec + t2.tv_sec;  ret.tv_usec = t1.tv_usec + t2.tv_usec;  if (ret.tv_usec > 1000000L) {    ret.tv_sec += 1;    ret.tv_usec -= 1000000L;  }  return ret;}tv_time  tv_timesub(tv_time t1, tv_time t2){  tv_time ret;  if (t2.tv_usec > t1.tv_usec) {    t1.tv_usec += 1000000;    t2.tv_sec += 1;  }  ret.tv_sec = t1.tv_sec - t2.tv_sec;  ret.tv_usec = t1.tv_usec - t2.tv_usec;  return ret;}tv_time  tv_timemul(tv_time t1, double mult){  tv_time ret;  double  rsec;  double  rusec;  rsec = mult * ((double) t1.tv_sec);  rusec = mult * ((double) t1.tv_usec);  ret.tv_sec = rsec;  ret.tv_usec = rusec;  ret.tv_usec += ((double) 1000000.0 * (rsec - (double) ret.tv_sec));  while (ret.tv_usec > 1000000) {    ret.tv_usec -= 1000000;    ret.tv_sec += 1;  }  return ret;}int      tv_timecmp(tv_time t1, tv_time t2){  if (t1.tv_sec > t2.tv_sec)     return 1;  if (t1.tv_sec < t2.tv_sec)     return -1;  if (t1.tv_usec > t2.tv_usec)     return 1;  if (t1.tv_usec < t2.tv_usec)     return -1;  return 0;}ts_time  ts_timeadd(ts_time t1, ts_time t2){  ts_time ret;  ret.tv_sec = t1.tv_sec + t2.tv_sec;  ret.tv_nsec = t1.tv_nsec + t2.tv_nsec;  if (ret.tv_nsec > 1000000000L) {    ret.tv_sec += 1;    ret.tv_nsec -= 1000000000L;  }  return ret;}ts_time  ts_timesub(ts_time t1, ts_time t2){  ts_time ret;  if (t2.tv_nsec > t1.tv_nsec) {    t1.tv_nsec += 1000000000;    t2.tv_sec += 1;  }  ret.tv_sec = t1.tv_sec - t2.tv_sec;  ret.tv_nsec = t1.tv_nsec - t2.tv_nsec;  return ret;}ts_time  ts_timemul(ts_time t1, double mult){  ts_time ret;  double  rsec;  double  rnsec;  rsec = mult * ((double) t1.tv_sec);  rnsec = mult * ((double) t1.tv_nsec);  ret.tv_sec = rsec;  ret.tv_nsec = rnsec;  ret.tv_nsec += ((double) 1000000000.0 * (rsec - (double) ret.tv_sec));  while (ret.tv_nsec > 1000000000) {    ret.tv_nsec -= 1000000000;    ret.tv_sec += 1;  }  return ret;}int      ts_timecmp(ts_time t1, ts_time t2){ if (t1.tv_sec > t2.tv_sec)     return 1;  if (t1.tv_sec < t2.tv_sec)     return -1;  if (t1.tv_nsec > t2.tv_nsec)     return 1;  if (t1.tv_nsec < t2.tv_nsec)     return -1;  return 0;}/* ************* Thread-safe strtok routines and state ************* */ts_strtok_state *ts_strtok_init(char *string){  ts_strtok_state *retval;  if (string == NULL)    return NULL;  retval = (ts_strtok_state *) malloc(sizeof(ts_strtok_state));  if (retval == NULL)    return NULL;  retval->string_dupe = strdup(string);  if (retval->string_dupe == NULL) {    free(retval);    return NULL;  }  retval->nxt_ptr = retval->string_dupe;  retval->chars_remaining = strlen(retval->string_dupe);  return retval;}char *ts_strtok(char *matching, ts_strtok_state *state){  int len1, len2;  char *tmpo;  if ((matching == NULL) || (state == NULL) || (state->chars_remaining <= 0))    return NULL;  len1 = strspn(state->nxt_ptr, matching);  if (len1 > state->chars_remaining) {    return NULL;  }  tmpo = state->nxt_ptr + (unsigned) len1;  len2 = strcspn(tmpo, matching);  if (len2+len1 > state->chars_remaining) {    return NULL;  }  *(tmpo+len2) = '\0';  state->nxt_ptr = tmpo + len2 + 1;       /* +1 for the null */  state->chars_remaining -= len1+len2+1;  /* +1 for the null */  return tmpo;}int ts_strtok_finish(ts_strtok_state *state){  if (state) {    if (state->string_dupe)      free(state->string_dupe);    free(state);  }  return 1;}/************* A really dumb implementation of strnstr ***********/char *dumb_strnstr(char *str, char *substr, int n){  int i, substrlen, ml;  char *tmp;  substrlen = strlen(substr);  for (i=0,tmp=str; i<=n-substrlen; i++, tmp++) {    if (*tmp == '\0')      return NULL;    if ( (ml = memcmp(tmp, substr, substrlen)) == 0)      return tmp;  }  return NULL;}/********* Socket convenience routines ***********/int correct_write(int s, char *data, int len){  int sofar, ret;  char *tmp;  if (len == -1)     len = strlen(data);    sofar = 0;  while (sofar != len) {    tmp = data + (unsigned long) sofar;    ret = write(s, tmp, len-sofar);    if (ret <= 0) {      if (! ((ret == -1) && ((errno == EAGAIN) || (errno == EINTR))) )	/* BUG:: What if another thread generates an error and trounces errno? */	return ret;    } else      sofar += ret;  }  return len;}int correct_read(int s, char *data, int len){  int sofar, ret;  char *tmp;  sofar = 0;  while(sofar != len) {    tmp = data + (unsigned long) sofar;    ret = read(s, tmp, len-sofar);    if (ret <= 0) {      if (! ((ret == -1) && ((errno == EAGAIN) || (errno == EINTR))) )	/* BUG:: What if another thread generates an error and trounces errno? */	return ret;    } else      sofar += ret;  }  return len;}int saccept(int s){    struct sockaddr_in from;    int     fromlen;    int     ns;    fromlen = sizeof (from);    if ((ns = accept (s, (void *) &from, (void *)&fromlen)) < 0)        return -1;    return ns;}int nbaccept(int s, int *rs){   fd_set fdset;   static struct timeval timeout = {0, 0};  /* For a poll */   int    val, socket_talk;   FD_ZERO(&fdset);   FD_SET(s, &fdset);   val = select(FD_SETSIZE, (fd_set *) &fdset, NULL, NULL, &timeout);   if ((val == 0) || (val == -1))     return val;   /* The socket is ready for an accept, so perform it. */   socket_talk = saccept(s);   if (socket_talk < 0)   {      if ((errno == EWOULDBLOCK) || (errno == EAGAIN))         return 0;      return -1;  /* ERROR */   }   *rs = socket_talk;   return 1;  /* SUCCESS */}int sconnect(char *hostname, char *servicename){    struct sockaddr_in remote;    struct sockaddr_in local;    int     s;    int     protonum;#ifdef DEBUG    printf("(glomopTk_utils.c) make_inetaddr for %s %s\n", hostname,	   servicename);#endif    if (make_inetaddr (hostname, servicename, &remote) < 0)        return -1;    if ((protonum = protonumber ("tcp")) < 0)        return -1;#ifdef DEBUG    printf("(utils.c) socket for protonum %d\n", protonum);#endif    if ((s = socket (PF_INET, SOCK_STREAM, protonum)) < 0)        return -1;        if (make_inetaddr ((char *) 0, (char *) 0, &local) < 0)        return -1;    if (bind (s, (struct sockaddr *) &local, sizeof (local)) < 0)        return -1;#ifdef DEBUG    printf("(utils.c) connecting..\n");#endif    if (connect (s, (struct sockaddr *) &remote, sizeof (remote)) < 0)        return -1;    return s;}

⌨️ 快捷键说明

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