1 /*  Boolector: Satisfiability Modulo Theories (SMT) solver.
2  *
3  *  Copyright (C) 2007-2021 by the authors listed in the AUTHORS file.
4  *
5  *  This file is part of Boolector.
6  *  See COPYING for more information on using this software.
7  */
8 
9 #ifndef BTORMEM_H_INCLUDED
10 #define BTORMEM_H_INCLUDED
11 
12 #include <stdarg.h>
13 #include <stdint.h>
14 #include <stdlib.h>
15 #include <string.h>
16 
17 /*------------------------------------------------------------------------*/
18 
19 #define BTOR_NEWN(mm, ptr, nelems)                                          \
20   do                                                                        \
21   {                                                                         \
22     (ptr) = (typeof(ptr)) btor_mem_malloc ((mm), (nelems) * sizeof *(ptr)); \
23   } while (0)
24 
25 #define BTOR_CNEWN(mm, ptr, nelems)                                        \
26   do                                                                       \
27   {                                                                        \
28     (ptr) = (typeof(ptr)) btor_mem_calloc ((mm), (nelems), sizeof *(ptr)); \
29   } while (0)
30 
31 #define BTOR_CLRN(ptr, nelems)                   \
32   do                                             \
33   {                                              \
34     memset ((ptr), 0, (nelems) * sizeof *(ptr)); \
35   } while (0)
36 
37 #define BTOR_DELETEN(mm, ptr, nelems)                      \
38   do                                                       \
39   {                                                        \
40     btor_mem_free ((mm), (ptr), (nelems) * sizeof *(ptr)); \
41   } while (0)
42 
43 #define BTOR_REALLOC(mm, p, o, n)                             \
44   do                                                          \
45   {                                                           \
46     (p) = (typeof(p)) btor_mem_realloc (                      \
47         (mm), (p), ((o) * sizeof *(p)), ((n) * sizeof *(p))); \
48   } while (0)
49 
50 #define BTOR_NEW(mm, ptr) BTOR_NEWN ((mm), (ptr), 1)
51 
52 #define BTOR_CNEW(mm, ptr) BTOR_CNEWN ((mm), (ptr), 1)
53 
54 #define BTOR_CLR(ptr) BTOR_CLRN ((ptr), 1)
55 
56 #define BTOR_DELETE(mm, ptr) BTOR_DELETEN ((mm), (ptr), 1)
57 
58 #define BTOR_ENLARGE(mm, p, o, n)             \
59   do                                          \
60   {                                           \
61     size_t internaln = (o) ? 2 * (o) : 1;     \
62     BTOR_REALLOC ((mm), (p), (o), internaln); \
63     (n) = internaln;                          \
64   } while (0)
65 
66 /*------------------------------------------------------------------------*/
67 
68 struct BtorMemMgr
69 {
70   size_t allocated;
71   size_t maxallocated;
72   size_t sat_allocated;
73   size_t sat_maxallocated;
74 };
75 
76 typedef struct BtorMemMgr BtorMemMgr;
77 
78 /*------------------------------------------------------------------------*/
79 
80 BtorMemMgr *btor_mem_mgr_new (void);
81 
82 void btor_mem_mgr_delete (BtorMemMgr *mm);
83 
84 void *btor_mem_sat_malloc (BtorMemMgr *mm, size_t size);
85 
86 void *btor_mem_sat_realloc (BtorMemMgr *mm, void *, size_t oldsz, size_t newsz);
87 
88 void btor_mem_sat_free (BtorMemMgr *mm, void *p, size_t freed);
89 
90 void *btor_mem_malloc (BtorMemMgr *mm, size_t size);
91 
92 void *btor_mem_realloc (BtorMemMgr *mm, void *, size_t oldsz, size_t newsz);
93 
94 void *btor_mem_calloc (BtorMemMgr *mm, size_t nobj, size_t size);
95 
96 void btor_mem_free (BtorMemMgr *mm, void *p, size_t freed);
97 
98 char *btor_mem_strdup (BtorMemMgr *mm, const char *str);
99 
100 void btor_mem_freestr (BtorMemMgr *mm, char *str);
101 
102 size_t btor_mem_parse_error_msg_length (const char *name,
103                                         const char *fmt,
104                                         va_list ap);
105 
106 char *btor_mem_parse_error_msg (BtorMemMgr *,
107                                 const char *name,
108                                 int32_t lineno,
109                                 int32_t columnno,
110                                 const char *fmt,
111                                 va_list,
112                                 size_t bytes);
113 #endif
114