aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter/glib-util.c
blob: 6e2e5f8f255ecc4075ed4c3755362456db5eb347 (plain)
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
/* $Id$ */

#include <string.h>
#include <glib.h>


#include <glib-util.h>

char*
g_substrdup(const char *s, int start, int len)
{
	int s_len, abs_start, abs_len;
	char *newstring;


	s_len = strlen(s);

	if (start < 0) {
		abs_start = s_len + start;
		if (abs_start < 0) {
			return NULL;
		}
	}
	else {
		abs_start = start;
	}

	if (len < 0) {
		abs_len = s_len + len + 1 - abs_start;
		if (abs_len < 0) {
			return NULL;
		}
	}
	else {
		abs_len = len;
	}


	if (abs_start + abs_len > s_len) {
		return NULL;
	}

	newstring = g_strndup(s + abs_start, abs_len + 1);
	newstring[abs_len] = 0;

	return newstring;
}