summaryrefslogtreecommitdiff
path: root/fitz/base_string.c
blob: f0fd4522ced6d42a1c24a165d26970452ea94378 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "fitz_base.h"
#include <string.h>

char *fz_strsep(char **stringp, const char *delim)
{
    char *ret = *stringp;
    if (ret == NULL) return NULL;
    if ((*stringp = strpbrk(*stringp, delim)) != NULL)
	*((*stringp)++) = '\0';
    return ret;
}

int fz_strlcpy(char *dst, const char *src, int siz)
{
    register char *d = dst;
    register const char *s = src;
    register int n = siz;

    /* Copy as many bytes as will fit */
    if (n != 0 && --n != 0) {
	do {
	    if ((*d++ = *s++) == 0)
		break;
	} while (--n != 0);
    }

    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0) {
	if (siz != 0)
	    *d = '\0';		/* NUL-terminate dst */
	while (*s++)
	    ;
    }

    return(s - src - 1);	/* count does not include NUL */
}

int fz_strlcat(char *dst, const char *src, int siz)
{
    register char *d = dst;
    register const char *s = src;
    register int n = siz;
    int dlen;

    /* Find the end of dst and adjust bytes left but don't go past end */
    while (*d != '\0' && n-- != 0)
	d++;
    dlen = d - dst;
    n = siz - dlen;

    if (n == 0)
	return dlen + strlen(s);
    while (*s != '\0') {
	if (n != 1) {
	    *d++ = *s;
	    n--;
	}
	s++;
    }
    *d = '\0';

    return dlen + (s - src);	/* count does not include NUL */
}