src/allocator.c

Fri, 12 Apr 2024 21:48:12 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 12 Apr 2024 21:48:12 +0200
changeset 849
edb9f875b7f9
parent 726
44986c0e2b05
permissions
-rw-r--r--

improves interface of cx_sprintf() variants

universe@391 1 /*
universe@391 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@391 3 *
universe@391 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@391 5 *
universe@391 6 * Redistribution and use in source and binary forms, with or without
universe@391 7 * modification, are permitted provided that the following conditions are met:
universe@391 8 *
universe@391 9 * 1. Redistributions of source code must retain the above copyright
universe@391 10 * notice, this list of conditions and the following disclaimer.
universe@391 11 *
universe@391 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@391 13 * notice, this list of conditions and the following disclaimer in the
universe@391 14 * documentation and/or other materials provided with the distribution.
universe@391 15 *
universe@391 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@391 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@391 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@391 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@391 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@391 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@391 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@391 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@391 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@391 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@391 26 * POSSIBILITY OF SUCH DAMAGE.
universe@391 27 */
universe@391 28
universe@391 29 #include "cx/allocator.h"
universe@391 30
universe@452 31 __attribute__((__malloc__, __alloc_size__(2)))
universe@508 32 static void *cx_malloc_stdlib(
universe@508 33 __attribute__((__unused__)) void *d,
universe@508 34 size_t n
universe@508 35 ) {
universe@397 36 return malloc(n);
universe@397 37 }
universe@397 38
universe@452 39 __attribute__((__warn_unused_result__, __alloc_size__(3)))
universe@508 40 static void *cx_realloc_stdlib(
universe@508 41 __attribute__((__unused__)) void *d,
universe@508 42 void *mem,
universe@508 43 size_t n
universe@508 44 ) {
universe@397 45 return realloc(mem, n);
universe@397 46 }
universe@397 47
universe@452 48 __attribute__((__malloc__, __alloc_size__(2, 3)))
universe@508 49 static void *cx_calloc_stdlib(
universe@508 50 __attribute__((__unused__)) void *d,
universe@508 51 size_t nelem,
universe@508 52 size_t n
universe@508 53 ) {
universe@397 54 return calloc(nelem, n);
universe@397 55 }
universe@397 56
universe@450 57 __attribute__((__nonnull__))
universe@508 58 static void cx_free_stdlib(
universe@508 59 __attribute__((__unused__)) void *d,
universe@508 60 void *mem
universe@508 61 ) {
universe@397 62 free(mem);
universe@397 63 }
universe@397 64
universe@450 65 static cx_allocator_class cx_default_allocator_class = {
universe@396 66 cx_malloc_stdlib,
universe@396 67 cx_realloc_stdlib,
universe@396 68 cx_calloc_stdlib,
universe@396 69 cx_free_stdlib
universe@396 70 };
universe@396 71
universe@391 72 struct cx_allocator_s cx_default_allocator = {
universe@396 73 &cx_default_allocator_class,
universe@391 74 NULL
universe@391 75 };
universe@500 76 CxAllocator *cxDefaultAllocator = &cx_default_allocator;
universe@391 77
universe@726 78
universe@726 79 int cx_reallocate(
universe@726 80 void **mem,
universe@726 81 size_t n
universe@726 82 ) {
universe@726 83 void *nmem = realloc(*mem, n);
universe@726 84 if (nmem == NULL) {
universe@726 85 return 1;
universe@726 86 } else {
universe@726 87 *mem = nmem;
universe@726 88 return 0;
universe@726 89 }
universe@726 90 }
universe@726 91
universe@628 92 // IMPLEMENTATION OF HIGH LEVEL API
universe@434 93
universe@500 94 void *cxMalloc(
universe@508 95 CxAllocator const *allocator,
universe@500 96 size_t n
universe@500 97 ) {
universe@396 98 return allocator->cl->malloc(allocator->data, n);
universe@394 99 }
universe@394 100
universe@500 101 void *cxRealloc(
universe@508 102 CxAllocator const *allocator,
universe@500 103 void *mem,
universe@500 104 size_t n
universe@500 105 ) {
universe@396 106 return allocator->cl->realloc(allocator->data, mem, n);
universe@394 107 }
universe@394 108
universe@500 109 int cxReallocate(
universe@508 110 CxAllocator const *allocator,
universe@500 111 void **mem,
universe@500 112 size_t n
universe@500 113 ) {
universe@450 114 void *nmem = allocator->cl->realloc(allocator->data, *mem, n);
universe@414 115 if (nmem == NULL) {
universe@414 116 return 1;
universe@414 117 } else {
universe@414 118 *mem = nmem;
universe@414 119 return 0;
universe@414 120 }
universe@414 121 }
universe@414 122
universe@500 123 void *cxCalloc(
universe@508 124 CxAllocator const *allocator,
universe@500 125 size_t nelem,
universe@500 126 size_t n
universe@500 127 ) {
universe@396 128 return allocator->cl->calloc(allocator->data, nelem, n);
universe@394 129 }
universe@394 130
universe@500 131 void cxFree(
universe@508 132 CxAllocator const *allocator,
universe@500 133 void *mem
universe@500 134 ) {
universe@396 135 allocator->cl->free(allocator->data, mem);
universe@397 136 }

mercurial