summaryrefslogtreecommitdiff
path: root/src/catfile.c
blob: bc4080a2fcef6c599ab3d556229808b5ec2356f5 (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
#include <stdlib.h>
#include <string.h>
#include "fileserv.h"

char *
catfile_suf_n(char const *dir, size_t len, char const *file, char const *suf)
{
	size_t flen, slen;
	char *res;
	
	while (len > 0 && dir[len-1] == '/')
		len--;
	while (*file == '/')
		file++;
	flen = strlen(file);
	while (flen && file[flen-1] == '/')
		--flen;
	slen = suf ? strlen(suf) : 0;
	res = malloc(len + flen + slen + 2);
	if (res) {
		char *p;
		
		memcpy(res, dir, len);
		p = res + len;
		if (flen) {
			*p++ = '/';
			memcpy(p, file, flen);
			p += flen;
		}
		if (slen) {
			memcpy(p, suf, slen);
			p += slen;
		}
		*p = 0;
	} else
		alloc_warn();
	return res;
}

char *
catfile_n(char const *dir, size_t len, char const *file)
{
	return catfile_suf_n(dir, len, file, NULL);
}

char *
catfile_suf(char const *dir, char const *file, char const *suf)
{
	return catfile_suf_n(dir, strlen(dir), file, suf);
}

char *
catfile(char const *dir, char const *file)
{
	return catfile_n(dir, strlen(dir), file);
}

Return to:

Send suggestions and report system problems to the System administrator.