init
[csRadar.git] / csrMem.h
1 #ifndef CSR_MEM_H
2 #define CSR_MEM_H
3
4 #include "csrTypes.h"
5
6 void *csr_malloc( size_t size )
7 {
8 void *ret = malloc( size );
9 if( !ret )
10 exit(1);
11 return ret;
12 }
13
14 void *csr_sb_raw( void *arr )
15 {
16 return ((u32 *)arr)-3;
17 }
18
19 u32 csr_sb_count( void *arr )
20 {
21 return arr? ((u32 *)csr_sb_raw( arr ))[1]: 0;
22 }
23
24 u32 csr_sb_cap( void *arr )
25 {
26 return arr? ((u32 *)csr_sb_raw( arr ))[0]: 0;
27 }
28
29 void *csr_sb_use( void *arr )
30 {
31 u32 *raw = (u32 *)csr_sb_raw( arr );
32 void *data = ((u8 *)arr) + raw[1]*raw[2];
33
34 raw[1] ++;
35
36 return data;
37 }
38
39 void csr_sb_inc( void *arr, u32 amt )
40 {
41 u32 *raw = (u32 *)csr_sb_raw( arr );
42 raw[1] += amt;
43 }
44
45 void *csr_sb_reserve( void *arr, u32 amt, u32 esize )
46 {
47 u32 cap = arr? csr_sb_cap( arr ): 0;
48 u32 count = arr? csr_sb_count( arr ): 0;
49
50 if( count + amt > cap )
51 {
52 cap = csr_max( count + amt, cap * 2 );
53 u32 *new_ptr = (u32 *)realloc( arr? csr_sb_raw( arr ): NULL, cap * esize + 3*sizeof(u32) );
54
55 if( !new_ptr )
56 abort();
57
58 new_ptr[0] = cap;
59 new_ptr[1] = count;
60 new_ptr[2] = esize;
61
62 return (void *)(new_ptr+3);
63 }
64 else
65 {
66 return arr;
67 }
68 }
69
70 void csr_sb_free( void *arr )
71 {
72 if( arr )
73 {
74 free( csr_sb_raw( arr ) );
75 }
76 }
77
78 // djb2 - Dan Bernstein
79 unsigned long djb2( unsigned char const *str )
80 {
81 unsigned long hash = 5381;
82 int c;
83
84 while((c = *str++))
85 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
86
87 return hash;
88 }
89
90 #endif