misc.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:6k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Miscellaneous machine independent utilities
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "socket.h"
  7. #include "mbuf.h"
  8. char Whitespace[] = " trn";
  9. /* Select from an array of strings, or return ascii number if out of range */
  10. char *
  11. smsg(msgs,nmsgs,n)
  12. char *msgs[];
  13. unsigned nmsgs,n;
  14. {
  15. static char buf[16];
  16. if(n < nmsgs && msgs[n] != NULL)
  17. return msgs[n];
  18. sprintf(buf,"%u",n);
  19. return buf;
  20. }
  21. /* Convert hex-ascii to integer */
  22. int
  23. htoi(s)
  24. char *s;
  25. {
  26. int i = 0;
  27. char c;
  28. while((c = *s++) != ''){
  29. if(c == 'x')
  30. continue; /* allow 0x notation */
  31. if('0' <= c && c <= '9')
  32. i = (i * 16) + (c - '0');
  33. else if('a' <= c && c <= 'f')
  34. i = (i * 16) + (c - 'a' + 10);
  35. else if('A' <= c && c <= 'F')
  36. i = (i * 16) + (c - 'A' + 10);
  37. else
  38. break;
  39. }
  40. return i;
  41. }
  42. /* Convert single hex-ascii character to binary */
  43. int
  44. htob(c)
  45. char c;
  46. {
  47. if('0' <= c && c <= '9')
  48. return c - '0';
  49. else if('a' <= c && c <= 'f')
  50. return c - 'a' + 10;
  51. else if('A' <= c && c <= 'F')
  52. return c - 'A' + 10;
  53. else
  54. return -1;
  55. }
  56. /* Read an ascii-encoded hex string, convert to binary and store in
  57.  * output buffer. Return number of bytes converted
  58.  */
  59. int
  60. readhex(out,in,size)
  61. uint8 *out;
  62. char *in;
  63. int size;
  64. {
  65. int c,count;
  66. if(in == NULL)
  67. return 0;
  68. for(count=0;count < size;count++){
  69. while(*in == ' ' || *in == 't')
  70. in++; /* Skip white space */
  71. if((c = htob(*in++)) == -1)
  72. break; /* Hit non-hex character */
  73. out[count] = c << 4; /* First nybble */
  74. while(*in == ' ' || *in == 't')
  75. in++; /* Skip white space */
  76. if((c = htob(*in++)) == -1)
  77. break; /* Hit non-hex character */
  78. out[count] |= c; /* Second nybble */
  79. }
  80. return count;
  81. }
  82. /* replace terminating end of line marker(s) with null */
  83. void
  84. rip(s)
  85. register char *s;
  86. {
  87. register char *cp;
  88. if((cp = strchr(s,'n')) != NULL)
  89. *cp = '';
  90. if((cp = strchr(s,'r')) != NULL)
  91. *cp = '';
  92. }
  93. /* Count the occurrances of 'c' in a buffer */
  94. int
  95. memcnt(buf,c,size)
  96. uint8 *buf;
  97. uint8 c;
  98. int size;
  99. {
  100. int cnt = 0;
  101. uint8 *icp;
  102. while(size != 0){
  103. int change;
  104. if((icp = memchr(buf,c,size)) == NULL)
  105. break; /* No more found */
  106. /* Advance the start of the next search to right after
  107.  * this character
  108.  */
  109. change = (int) (icp - buf + 1);
  110. buf += change;
  111. size -= change;
  112. cnt++;
  113. }
  114. return cnt;
  115. }
  116. /* XOR block 'b' into block 'a' */
  117. void
  118. memxor(a,b,n)
  119. uint8 *a,*b;
  120. unsigned int n;
  121. {
  122. while(n-- != 0)
  123. *a++ ^= *b++;
  124. }
  125. /* Copy a string to a malloc'ed buffer. Turbo C has this one in its
  126.  * library, but it doesn't call mallocw() and can therefore return NULL.
  127.  * NOS uses of strdup() generally don't check for NULL, so they need this one.
  128.  */
  129. char *
  130. strdup(s)
  131. const char *s;
  132. {
  133. register char *out;
  134. register int len;
  135. if(s == NULL)
  136. return NULL;
  137. len = strlen(s);
  138. out = mallocw(len+1);
  139. /* This is probably a tad faster than strcpy, since we know the len */
  140. memcpy(out,s,len);
  141. out[len] = '';
  142. return out;
  143. }
  144. /* Routines not needed for Turbo 2.0, but available for older libraries */
  145. #ifdef AZTEC
  146. /* Case-insensitive string comparison */
  147. strnicmp(a,b,n)
  148. register char *a,*b;
  149. register int n;
  150. {
  151. char a1,b1;
  152. while(n-- != 0 && (a1 = *a++) != '' && (b1 = *b++) != ''){
  153. if(a1 == b1)
  154. continue; /* No need to convert */
  155. a1 = tolower(a1);
  156. b1 = tolower(b1);
  157. if(a1 == b1)
  158. continue; /* NOW they match! */
  159. if(a1 > b1)
  160. return 1;
  161. if(a1 < b1)
  162. return -1;
  163. }
  164. return 0;
  165. }
  166. char *
  167. strtok(s1,s2)
  168. char *s1; /* Source string (first call) or NULL */
  169. #ifdef __STDC__ /* Ugly kludge for aztec's declaration */
  170. const char *s2; /* Delimiter string */
  171. #else
  172. char *s2; /* Delimiter string */
  173. #endif
  174. {
  175. static int isdelim();
  176. static char *next;
  177. register char *cp;
  178. char *tmp;
  179. if(s2 == NULL)
  180. return NULL; /* Must give delimiter string */
  181. if(s1 != NULL)
  182. next = s1; /* First call */
  183. if(next == NULL)
  184. return NULL; /* No more */
  185. /* Find beginning of this token */
  186. for(cp = next;*cp != '' && isdelim(*cp,s2);cp++)
  187. ;
  188. if(*cp == '')
  189. return NULL; /* Trailing delimiters, no token */
  190. /* Save the beginning of this token, and find its end */
  191. tmp = cp;
  192. next = NULL; /* In case we don't find another delim */
  193. for(;*cp != '';cp++){
  194. if(isdelim(*cp,s2)){
  195. *cp = '';
  196. next = cp + 1; /* Next call will begin here */
  197. break;
  198. }
  199. }
  200. return tmp;
  201. }
  202. static int
  203. isdelim(c,delim)
  204. char c;
  205. register char *delim;
  206. {
  207. char d;
  208. while((d = *delim++) != ''){
  209. if(c == d)
  210. return 1;
  211. }
  212. return 0;
  213. }
  214. #endif /* AZTEC */
  215. /* Host-network conversion routines, replaced on the x86 with
  216.  * assembler code in pcgen.asm
  217.  */
  218. #ifndef MSDOS
  219. /* Put a long in host order into a char array in network order */
  220. uint8 *
  221. put32(cp,x)
  222. register uint8 *cp;
  223. int32 x;
  224. {
  225. *cp++ = x >> 24;
  226. *cp++ = x >> 16;
  227. *cp++ = x >> 8;
  228. *cp++ = x;
  229. return cp;
  230. }
  231. /* Put a short in host order into a char array in network order */
  232. uint8 *
  233. put16(cp,x)
  234. register uint8 *cp;
  235. uint16 x;
  236. {
  237. *cp++ = x >> 8;
  238. *cp++ = x;
  239. return cp;
  240. }
  241. uint16
  242. get16(cp)
  243. register uint8 *cp;
  244. {
  245. register uint16 x;
  246. x = *cp++;
  247. x <<= 8;
  248. x |= *cp;
  249. return x;
  250. }
  251. /* Machine-independent, alignment insensitive network-to-host long conversion */
  252. int32
  253. get32(cp)
  254. register uint8 *cp;
  255. {
  256. int32 rval;
  257. rval = *cp++;
  258. rval <<= 8;
  259. rval |= *cp++;
  260. rval <<= 8;
  261. rval |= *cp++;
  262. rval <<= 8;
  263. rval |= *cp;
  264. return rval;
  265. }
  266. /* Compute int(log2(x)) */
  267. int
  268. ilog2(x)
  269. register uint16 x;
  270. {
  271. register int n = 16;
  272. for(;n != 0;n--){
  273. if(x & 0x8000)
  274. break;
  275. x <<= 1;
  276. }
  277. n--;
  278. return n;
  279. }
  280. #endif