summaryrefslogtreecommitdiff
path: root/src/utils/refcheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/refcheck.c')
-rw-r--r--src/utils/refcheck.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/utils/refcheck.c b/src/utils/refcheck.c
new file mode 100644
index 0000000..fbba568
--- /dev/null
+++ b/src/utils/refcheck.c
@@ -0,0 +1,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;
+}