diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/Makefile | 3 | ||||
-rw-r--r-- | src/utils/refcheck.c | 69 |
2 files changed, 71 insertions, 1 deletions
diff --git a/src/utils/Makefile b/src/utils/Makefile index f891b6e..027e3a5 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -1,4 +1,5 @@ # Sources -DIR_SOURCES := namespace.c hashtable.c character_valid.c validate.c walk.c +DIR_SOURCES := namespace.c hashtable.c character_valid.c validate.c walk.c \ + refcheck.c include $(NSBUILD)/Makefile.subdir 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; +} |