/* * This file is part of libdom. * Licensed under the MIT License, * http://www.opensource.org/licenses/mit-license.php * Copyright 2021 Michael Drake */ /** \file * This is an API for walking a loaded DOM. */ #include #include #include #include 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; }