summaryrefslogtreecommitdiff
path: root/src/utils/refcheck.c
blob: fbba568b2d701a11ac4deef07000f8c66cdf18ea (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
65
66
67
68
69
/*
 * This file is part of libdom.
 * Licensed under the MIT License,
 *                http://www.opensource.org/licenses/mit-license.php
 * Copyright 2021 Michael Drake <tlsa@netsurf-browser.org>
 */

/** \file
 * This is an API for walking a loaded DOM.
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#include <dom/dom.h>

struct dom_refcheck {
	size_t len;
	uintptr_t *array;
};

struct dom_refcheck *dom_refcheck(
		struct dom_refcheck *rc,
		uint32_t refcnt)
{
	if (rc == NULL) {
		rc = calloc(1, sizeof(*rc));
		if (rc == NULL) {
			goto out;
		}

		if (refcnt == 0) {
			goto out;
		}
	}

	fprintf(stderr, "%p: refcnt: %u, len: %zu\n", rc, refcnt, rc->len);

	if (refcnt == rc->len - 1) {
		//rc->array[refcnt] ^= UINTPTR_MAX;
		free((void *)rc->array[refcnt]);
		rc->array[refcnt] = (uintptr_t)NULL;
		rc->len = refcnt;

	} else if (refcnt == rc->len + 1) {
		uintptr_t *temp = realloc(rc->array, sizeof(*temp) * refcnt);
		if (temp == NULL) {
			goto out;
		}
		rc->array = temp;

		rc->array[rc->len] = (uintptr_t)malloc(1);
		//rc->array[rc->len] ^= UINTPTR_MAX;
		rc->len = refcnt;
	}

	if (refcnt == 0) {
		free(rc->array);
		free(rc);
		rc = NULL;
		goto out;

	} else {
	}

out:
	return rc;
}