forked from rbu/driftnet
-
Notifications
You must be signed in to change notification settings - Fork 1
/
util.c
83 lines (68 loc) · 1.87 KB
/
util.c
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
/*
* util.c:
* Various utility functions.
*
* Copyright (c) 2003 Chris Lightfoot. All rights reserved.
* Email: chris@ex-parrot.com; WWW: http://www.ex-parrot.com/~chris/
*
*/
static const char rcsid[] = "$Id: util.c,v 1.1 2003/08/25 12:24:08 chris Exp $";
#include <stdlib.h>
#include <string.h>
#include "driftnet.h"
/* xmalloc COUNT
* Malloc, and abort if malloc fails. */
void *xmalloc(size_t n) {
void *v;
v = malloc(n);
if (!v) abort();
return v;
}
/* xcalloc NITEMS COUNT
* As above. */
void *xcalloc(size_t n, size_t m) {
void *v;
v = calloc(n, m);
if (!v) abort();
return v;
}
/* xrealloc PTR COUNT
* As above. */
void *xrealloc(void *w, size_t n) {
void *v;
v = realloc(w, n);
if (n != 0 && !v) abort();
return v;
}
/* xfree PTR
* Free, ignoring a passed NULL value. */
void xfree(void *v) {
if (v) free(v);
}
/* xstrdup:
* Strdup, aborting on failure. */
char *xstrdup(const char *s) {
char *t;
t = xmalloc(strlen(s) + 1);
strcpy(t, s);
return t;
}
/* memstr:
* Locate needle, of length n_len, in haystack, of length h_len, returning NULL.
* Uses the Boyer-Moore search algorithm. Cf.
* http://www-igm.univ-mlv.fr/~lecroq/string/node14.html */
unsigned char *memstr(const unsigned char *haystack, const size_t hlen,
const unsigned char *needle, const size_t nlen) {
int skip[256], k;
if (nlen == 0) return (unsigned char*)haystack;
/* Set up the finite state machine we use. */
for (k = 0; k < 256; ++k) skip[k] = nlen;
for (k = 0; k < nlen - 1; ++k) skip[needle[k]] = nlen - k - 1;
/* Do the search. */
for (k = nlen - 1; k < hlen; k += skip[haystack[k]]) {
int i, j;
for (j = nlen - 1, i = k; j >= 0 && haystack[i] == needle[j]; j--) i--;
if (j == -1) return (unsigned char*)(haystack + i + 1);
}
return NULL;
}