fixed m4x3 mul, rendering works
[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_calloc( size_t size )
15 {
16 void *ret = calloc( 1, size );
17 if( !ret )
18 exit(1);
19 return ret;
20 }
21
22 void *csr_sb_raw( void *arr )
23 {
24 return ((u32 *)arr)-3;
25 }
26
27 u32 csr_sb_count( void *arr )
28 {
29 return arr? ((u32 *)csr_sb_raw( arr ))[1]: 0;
30 }
31
32 u32 csr_sb_cap( void *arr )
33 {
34 return arr? ((u32 *)csr_sb_raw( arr ))[0]: 0;
35 }
36
37 void *csr_sb_use( void *arr )
38 {
39 u32 *raw = (u32 *)csr_sb_raw( arr );
40 void *data = ((u8 *)arr) + raw[1]*raw[2];
41
42 raw[1] ++;
43
44 return data;
45 }
46
47 void csr_sb_inc( void *arr, u32 amt )
48 {
49 u32 *raw = (u32 *)csr_sb_raw( arr );
50 raw[1] += amt;
51 }
52
53 void *csr_sb_reserve( void *arr, u32 amt, u32 esize )
54 {
55 u32 cap = arr? csr_sb_cap( arr ): 0;
56 u32 count = arr? csr_sb_count( arr ): 0;
57
58 if( count + amt > cap )
59 {
60 cap = csr_max( count + amt, cap * 2 );
61 u32 *new_ptr = (u32 *)realloc( arr? csr_sb_raw( arr ): NULL, cap * esize + 3*sizeof(u32) );
62
63 if( !new_ptr )
64 abort();
65
66 new_ptr[0] = cap;
67 new_ptr[1] = count;
68 new_ptr[2] = esize;
69
70 return (void *)(new_ptr+3);
71 }
72 else
73 {
74 return arr;
75 }
76 }
77
78 void csr_sb_free( void *arr )
79 {
80 if( arr )
81 {
82 free( csr_sb_raw( arr ) );
83 }
84 }
85
86 void csr_sb_clear( void *arr )
87 {
88 if( arr )
89 {
90 ((u32 *)csr_sb_raw( arr ))[1] = 0;
91 }
92 }
93
94 // djb2 - Dan Bernstein
95 unsigned long djb2( unsigned char const *str )
96 {
97 unsigned long hash = 5381;
98 int c;
99
100 while((c = *str++))
101 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
102
103 return hash;
104 }
105
106 #endif