File: dirs.c

package info (click to toggle)
libsfdo 0.1.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 740 kB
  • sloc: ansic: 6,491; python: 111; makefile: 4
file content (43 lines) | stat: -rw-r--r-- 1,080 bytes parent folder | download
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
#include <assert.h>
#include <stdlib.h>

#include "common/dirs.h"
#include "common/membuild.h"
#include "common/path.h"

bool sfdo_dirs_store(const struct sfdo_string *src_dirs, size_t n_src_dirs,
		struct sfdo_string **dst_dirs, size_t *n_dst_dirs, char **dst_mem) {
	struct sfdo_string *dirs = calloc(n_src_dirs, sizeof(*dirs));

	if (dirs == NULL) {
		return false;
	}

	size_t mem_size = 0;
	for (size_t i = 0; i < n_src_dirs; i++) {
		const struct sfdo_string *dir = &src_dirs[i];
		mem_size += sfdo_path_compute_mem_size(dir->data, dir->len);
	}

	struct sfdo_membuild mem_buf;
	if (!sfdo_membuild_setup(&mem_buf, mem_size)) {
		free(dirs);
		return false;
	}

	for (size_t i = 0; i < n_src_dirs; i++) {
		const struct sfdo_string *src = &src_dirs[i];
		struct sfdo_string *dst = &dirs[i];
		dst->data = sfdo_membuild_curr(&mem_buf);
		sfdo_membuild_add_path_segment(&mem_buf, src->data, src->len);
		dst->len = sfdo_membuild_nulterm(&mem_buf);
	}

	sfdo_membuild_validate(&mem_buf);

	*dst_dirs = dirs;
	*n_dst_dirs = n_src_dirs;
	*dst_mem = mem_buf.data;

	return true;
}