1 // Copyright (C) 2021 Harry Godden (hgn)
4 // ==================================================================================================================
6 // Malloc call wrapper that will exit if out of memory (similar to xalloc)
7 void *csr_malloc( size_t size
);
8 void *csr_calloc( size_t size
);
10 // Dynamic arrays (inspired by stb_stretchy_buffer)
11 // ------------------------------------------------
13 // Reserve x elements of size to this buffer. Must assign back (like realloc)
14 __attribute__((warn_unused_result
))
15 void *csr_sb_reserve( void *arr
, u32 amt
, u32 esize
);
17 // Get index of next free data and increment count by 1
18 void *csr_sb_use( void *arr
);
20 // Increment count by amt
21 void csr_sb_inc( void *arr
, u32 amt
);
23 u32
csr_sb_count( void *arr
);
24 void csr_sb_free( void *arr
);
26 // Does not clear memory / capacity, but resets count to 0
27 void csr_sb_clear( void *arr
);
30 void *csr_sb_raw( void *arr
);
31 u32
csr_sb_cap( void *arr
);
33 // djb2 - Dan Bernstein
34 unsigned long djb2( unsigned char const *str
);
37 // ==================================================================================================================
41 void *csr_malloc( size_t size
)
43 void *ret
= malloc( size
);
49 void *csr_calloc( size_t size
)
51 void *ret
= calloc( 1, size
);
57 void *csr_sb_raw( void *arr
)
59 return ((u32
*)arr
)-3;
62 u32
csr_sb_count( void *arr
)
64 return arr
? ((u32
*)csr_sb_raw( arr
))[1]: 0;
67 u32
csr_sb_cap( void *arr
)
69 return arr
? ((u32
*)csr_sb_raw( arr
))[0]: 0;
72 void *csr_sb_use( void *arr
)
74 u32
*raw
= (u32
*)csr_sb_raw( arr
);
75 void *data
= ((u8
*)arr
) + raw
[1]*raw
[2];
82 void csr_sb_inc( void *arr
, u32 amt
)
84 u32
*raw
= (u32
*)csr_sb_raw( arr
);
88 void *csr_sb_reserve( void *arr
, u32 amt
, u32 esize
)
90 u32 cap
= arr
? csr_sb_cap( arr
): 0;
91 u32 count
= arr
? csr_sb_count( arr
): 0;
93 if( count
+ amt
> cap
)
95 cap
= csr_max( count
+ amt
, cap
* 2 );
96 u32
*new_ptr
= (u32
*)realloc( arr
? csr_sb_raw( arr
): NULL
, cap
* esize
+ 3*sizeof(u32
) );
105 return (void *)(new_ptr
+3);
113 void csr_sb_free( void *arr
)
117 free( csr_sb_raw( arr
) );
121 void csr_sb_clear( void *arr
)
125 ((u32
*)csr_sb_raw( arr
))[1] = 0;
129 // djb2 - Dan Bernstein
130 unsigned long djb2( unsigned char const *str
)
132 unsigned long hash
= 5381;
136 hash
= ((hash
<< 5) + hash
) + c
; /* hash * 33 + c */