author | Ryan C. Gordon <icculus@icculus.org> |
Sun, 29 May 2016 00:21:34 -0400 | |
changeset 1170 | 6e9659bf396f |
parent 1161 | 6085abb2edaa |
child 1180 | 8abc040525ed |
permissions | -rw-r--r-- |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1 |
#define __MOJOSHADER_INTERNAL__ 1 |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
2 |
#include "mojoshader_internal.h" |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
3 |
|
1146
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
4 |
// Convenience functions for allocators... |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
5 |
#if !MOJOSHADER_FORCE_ALLOCATOR |
1150
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
6 |
void * MOJOSHADERCALL MOJOSHADER_internal_malloc(int bytes, void *d) { return malloc(bytes); } |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
7 |
void MOJOSHADERCALL MOJOSHADER_internal_free(void *ptr, void *d) { free(ptr); } |
1146
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
8 |
#endif |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
9 |
|
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
10 |
MOJOSHADER_error MOJOSHADER_out_of_mem_error = { |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
11 |
"Out of memory", NULL, MOJOSHADER_POSITION_NONE |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
12 |
}; |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
13 |
|
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
14 |
MOJOSHADER_parseData MOJOSHADER_out_of_mem_data = { |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
15 |
1, &MOJOSHADER_out_of_mem_error, 0, 0, 0, 0, |
1170
6e9659bf396f
Explicitly initial a bunch of bits of MOJOSHADER_out_of_mem_data.
Ryan C. Gordon <icculus@icculus.org>
parents:
1161
diff
changeset
|
16 |
MOJOSHADER_TYPE_UNKNOWN, 0, 0, 0, 0, 0, 0, 0, |
6e9659bf396f
Explicitly initial a bunch of bits of MOJOSHADER_out_of_mem_data.
Ryan C. Gordon <icculus@icculus.org>
parents:
1161
diff
changeset
|
17 |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
1146
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
18 |
}; |
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
19 |
|
31337471b909
Moved some simple things into mojoshader_common.c.
Ryan C. Gordon <icculus@icculus.org>
parents:
1141
diff
changeset
|
20 |
|
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
21 |
typedef struct HashItem |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
22 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
23 |
const void *key; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
24 |
const void *value; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
25 |
struct HashItem *next; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
26 |
} HashItem; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
27 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
28 |
struct HashTable |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
29 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
30 |
HashItem **table; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
31 |
uint32 table_len; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
32 |
int stackable; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
33 |
void *data; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
34 |
HashTable_HashFn hash; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
35 |
HashTable_KeyMatchFn keymatch; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
36 |
HashTable_NukeFn nuke; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
37 |
MOJOSHADER_malloc m; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
38 |
MOJOSHADER_free f; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
39 |
void *d; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
40 |
}; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
41 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
42 |
static inline uint32 calc_hash(const HashTable *table, const void *key) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
43 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
44 |
return table->hash(key, table->data) & (table->table_len-1); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
45 |
} // calc_hash |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
46 |
|
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
47 |
int hash_find(const HashTable *table, const void *key, const void **_value) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
48 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
49 |
HashItem *i; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
50 |
void *data = table->data; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
51 |
const uint32 hash = calc_hash(table, key); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
52 |
HashItem *prev = NULL; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
53 |
for (i = table->table[hash]; i != NULL; i = i->next) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
54 |
{ |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
55 |
if (table->keymatch(key, i->key, data)) |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
56 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
57 |
if (_value != NULL) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
58 |
*_value = i->value; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
59 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
60 |
// Matched! Move to the front of list for faster lookup next time. |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
61 |
// (stackable tables have to remain in the same order, though!) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
62 |
if ((!table->stackable) && (prev != NULL)) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
63 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
64 |
assert(prev->next == i); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
65 |
prev->next = i->next; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
66 |
i->next = table->table[hash]; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
67 |
table->table[hash] = i; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
68 |
} // if |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
69 |
|
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
70 |
return 1; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
71 |
} // if |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
72 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
73 |
prev = i; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
74 |
} // for |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
75 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
76 |
return 0; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
77 |
} // hash_find |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
78 |
|
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
79 |
int hash_iter(const HashTable *table, const void *key, |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
80 |
const void **_value, void **iter) |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
81 |
{ |
1150
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
82 |
HashItem *item = (HashItem *) *iter; |
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
83 |
if (item == NULL) |
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
84 |
item = table->table[calc_hash(table, key)]; |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
85 |
else |
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
86 |
item = item->next; |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
87 |
|
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
88 |
while (item != NULL) |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
89 |
{ |
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
90 |
if (table->keymatch(key, item->key, table->data)) |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
91 |
{ |
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
92 |
*_value = item->value; |
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
93 |
*iter = item; |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
94 |
return 1; |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
95 |
} // if |
1064
d3f0f4cf84f2
Minor hash_iter() code cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents:
1059
diff
changeset
|
96 |
item = item->next; |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
97 |
} // while |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
98 |
|
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
99 |
// no more matches. |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
100 |
*_value = NULL; |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
101 |
*iter = NULL; |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
102 |
return 0; |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
103 |
} // hash_iter |
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
104 |
|
1065
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
105 |
int hash_iter_keys(const HashTable *table, const void **_key, void **iter) |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
106 |
{ |
1150
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
107 |
HashItem *item = (HashItem *) *iter; |
1161
6085abb2edaa
Fixed up a few Visual Studio warnings, compiling as C++, etc.
Ryan C. Gordon <icculus@icculus.org>
parents:
1153
diff
changeset
|
108 |
uint32 idx = 0; |
1065
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
109 |
|
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
110 |
if (item != NULL) |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
111 |
{ |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
112 |
const HashItem *orig = item; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
113 |
item = item->next; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
114 |
if (item == NULL) |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
115 |
idx = calc_hash(table, orig->key) + 1; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
116 |
} // if |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
117 |
|
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
118 |
while (!item && (idx < table->table_len)) |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
119 |
item = table->table[idx++]; // skip empty buckets... |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
120 |
|
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
121 |
if (item == NULL) // no more matches? |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
122 |
{ |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
123 |
*_key = NULL; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
124 |
*iter = NULL; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
125 |
return 0; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
126 |
} // if |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
127 |
|
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
128 |
*_key = item->key; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
129 |
*iter = item; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
130 |
return 1; |
bb021d539ec5
Implemented hash_iter_keys().
Ryan C. Gordon <icculus@icculus.org>
parents:
1064
diff
changeset
|
131 |
} // hash_iter_keys |
965
6284deccb61e
Added hash_iter() function, for iterating all matching entries in a hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
963
diff
changeset
|
132 |
|
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
133 |
int hash_insert(HashTable *table, const void *key, const void *value) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
134 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
135 |
HashItem *item = NULL; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
136 |
const uint32 hash = calc_hash(table, key); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
137 |
if ( (!table->stackable) && (hash_find(table, key, NULL)) ) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
138 |
return 0; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
139 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
140 |
// !!! FIXME: grow and rehash table if it gets too saturated. |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
141 |
item = (HashItem *) table->m(sizeof (HashItem), table->d); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
142 |
if (item == NULL) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
143 |
return -1; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
144 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
145 |
item->key = key; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
146 |
item->value = value; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
147 |
item->next = table->table[hash]; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
148 |
table->table[hash] = item; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
149 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
150 |
return 1; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
151 |
} // hash_insert |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
152 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
153 |
HashTable *hash_create(void *data, const HashTable_HashFn hashfn, |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
154 |
const HashTable_KeyMatchFn keymatchfn, |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
155 |
const HashTable_NukeFn nukefn, |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
156 |
const int stackable, |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
157 |
MOJOSHADER_malloc m, MOJOSHADER_free f, void *d) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
158 |
{ |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
159 |
const uint32 initial_table_size = 256; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
160 |
const uint32 alloc_len = sizeof (HashItem *) * initial_table_size; |
735 | 161 |
HashTable *table = (HashTable *) m(sizeof (HashTable), d); |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
162 |
if (table == NULL) |
735 | 163 |
return NULL; |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
164 |
memset(table, '\0', sizeof (HashTable)); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
165 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
166 |
table->table = (HashItem **) m(alloc_len, d); |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
167 |
if (table->table == NULL) |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
168 |
{ |
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
169 |
f(table, d); |
735 | 170 |
return NULL; |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
171 |
} // if |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
172 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 |
memset(table->table, '\0', alloc_len); |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 |
table->table_len = initial_table_size; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
175 |
table->stackable = stackable; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
176 |
table->data = data; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 |
table->hash = hashfn; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 |
table->keymatch = keymatchfn; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 |
table->nuke = nukefn; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
180 |
table->m = m; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
181 |
table->f = f; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
182 |
table->d = d; |
735 | 183 |
return table; |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
184 |
} // hash_create |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 |
|
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
186 |
void hash_destroy(HashTable *table) |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 |
uint32 i; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
189 |
void *data = table->data; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
190 |
MOJOSHADER_free f = table->f; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
191 |
void *d = table->d; |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 |
for (i = 0; i < table->table_len; i++) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 |
HashItem *item = table->table[i]; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 |
while (item != NULL) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 |
HashItem *next = item->next; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
198 |
table->nuke(item->key, item->value, data); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
199 |
f(item, d); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
200 |
item = next; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
201 |
} // while |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
202 |
} // for |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
203 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
204 |
f(table->table, d); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
205 |
f(table, d); |
733
1b6d68fabe46
Reworked hashtable create/destroy functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
732
diff
changeset
|
206 |
} // hash_destroy |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
207 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
208 |
int hash_remove(HashTable *table, const void *key) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
209 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
210 |
HashItem *item = NULL; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
211 |
HashItem *prev = NULL; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
212 |
void *data = table->data; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
213 |
const uint32 hash = calc_hash(table, key); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
214 |
for (item = table->table[hash]; item != NULL; item = item->next) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
215 |
{ |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
216 |
if (table->keymatch(key, item->key, data)) |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
217 |
{ |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
218 |
if (prev != NULL) |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
219 |
prev->next = item->next; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
220 |
else |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
221 |
table->table[hash] = item->next; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
222 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
223 |
table->nuke(item->key, item->value, data); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
224 |
table->f(item, table->d); |
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
225 |
return 1; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
226 |
} // if |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
227 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
228 |
prev = item; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
229 |
} // for |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
230 |
|
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
231 |
return 0; |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
232 |
} // hash_remove |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
233 |
|
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
234 |
|
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
235 |
// this is djb's xor hashing function. |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
236 |
static inline uint32 hash_string_djbxor(const char *str, size_t len) |
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
237 |
{ |
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
238 |
register uint32 hash = 5381; |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
239 |
while (len--) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
240 |
hash = ((hash << 5) + hash) ^ *(str++); |
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
241 |
return hash; |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
242 |
} // hash_string_djbxor |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
243 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
244 |
static inline uint32 hash_string(const char *str, size_t len) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
245 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
246 |
return hash_string_djbxor(str, len); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
247 |
} // hash_string |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
248 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
249 |
uint32 hash_hash_string(const void *sym, void *data) |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
250 |
{ |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
251 |
(void) data; |
870
f9e20269c20b
make compile on MSVC, and fix stringmap_insert
Aras Pranckevicius <aras@unity3d.com>
parents:
860
diff
changeset
|
252 |
return hash_string((const char*) sym, strlen((const char *) sym)); |
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
253 |
} // hash_hash_string |
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
254 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
255 |
int hash_keymatch_string(const void *a, const void *b, void *data) |
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
256 |
{ |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
257 |
(void) data; |
734
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
258 |
return (strcmp((const char *) a, (const char *) b) == 0); |
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
259 |
} // hash_keymatch_string |
1f69fc50c79c
Added string hash/compare functions.
Ryan C. Gordon <icculus@icculus.org>
parents:
733
diff
changeset
|
260 |
|
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
261 |
|
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
262 |
// string -> string map... |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
263 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
264 |
static void stringmap_nuke_noop(const void *key, const void *val, void *d) {} |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
265 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
266 |
static void stringmap_nuke(const void *key, const void *val, void *d) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
267 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
268 |
StringMap *smap = (StringMap *) d; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
269 |
smap->f((void *) key, smap->d); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
270 |
smap->f((void *) val, smap->d); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
271 |
} // stringmap_nuke |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
272 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
273 |
StringMap *stringmap_create(const int copy, MOJOSHADER_malloc m, |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
274 |
MOJOSHADER_free f, void *d) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
275 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
276 |
HashTable_NukeFn nuke = copy ? stringmap_nuke : stringmap_nuke_noop; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
277 |
StringMap *smap; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
278 |
smap = hash_create(0,hash_hash_string,hash_keymatch_string,nuke,0,m,f,d); |
1111
7530b37979b8
Some static analysis fixes from Clang 4.0.
Ryan C. Gordon <icculus@icculus.org>
parents:
1080
diff
changeset
|
279 |
if (smap != NULL) |
7530b37979b8
Some static analysis fixes from Clang 4.0.
Ryan C. Gordon <icculus@icculus.org>
parents:
1080
diff
changeset
|
280 |
smap->data = smap; |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
281 |
return smap; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
282 |
} // stringmap_create |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
283 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
284 |
void stringmap_destroy(StringMap *smap) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
285 |
{ |
963
5a8f7ef13735
Removed return statement from void function.
Ryan C. Gordon <icculus@icculus.org>
parents:
956
diff
changeset
|
286 |
hash_destroy(smap); |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
287 |
} // stringmap_destroy |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
288 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
289 |
int stringmap_insert(StringMap *smap, const char *key, const char *value) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
290 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
291 |
assert(key != NULL); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
292 |
if (smap->nuke == stringmap_nuke_noop) // no copy? |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
293 |
return hash_insert(smap, key, value); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
294 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
295 |
int rc = -1; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
296 |
char *k = (char *) smap->m(strlen(key) + 1, smap->d); |
870
f9e20269c20b
make compile on MSVC, and fix stringmap_insert
Aras Pranckevicius <aras@unity3d.com>
parents:
860
diff
changeset
|
297 |
char *v = (char *) (value ? smap->m(strlen(value) + 1, smap->d) : NULL); |
1059
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
298 |
int failed = ( (!k) || ((!v) && (value)) ); |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
299 |
|
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
300 |
if (!failed) |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
301 |
{ |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
302 |
strcpy(k, key); |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
303 |
if (value != NULL) |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
304 |
strcpy(v, value); |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
305 |
failed = ((rc = hash_insert(smap, k, v)) <= 0); |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
306 |
} // if |
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
307 |
|
9655c606b39d
Fixed must-copy version of stringmap_insert().
Ryan C. Gordon <icculus@icculus.org>
parents:
965
diff
changeset
|
308 |
if (failed) |
859
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
309 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
310 |
smap->f(k, smap->d); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
311 |
smap->f(v, smap->d); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
312 |
} // if |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
313 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
314 |
return rc; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
315 |
} // stringmap_insert |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
316 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
317 |
int stringmap_remove(StringMap *smap, const char *key) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
318 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
319 |
return hash_remove(smap, key); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
320 |
} // stringmap_remove |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
321 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
322 |
int stringmap_find(const StringMap *smap, const char *key, const char **_value) |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
323 |
{ |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
324 |
const void *value = NULL; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
325 |
const int retval = hash_find(smap, key, &value); |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
326 |
*_value = (const char *) value; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
327 |
return retval; |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
328 |
} // stringmap_find |
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
329 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
330 |
|
824d67791db0
Implemented StringMap, for future use.
Ryan C. Gordon <icculus@icculus.org>
parents:
858
diff
changeset
|
331 |
// The string cache... !!! FIXME: use StringMap internally for this. |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
332 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
333 |
typedef struct StringBucket |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
334 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
335 |
char *string; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
336 |
struct StringBucket *next; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
337 |
} StringBucket; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
338 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
339 |
struct StringCache |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
340 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
341 |
StringBucket **hashtable; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
342 |
uint32 table_size; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
343 |
MOJOSHADER_malloc m; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
344 |
MOJOSHADER_free f; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
345 |
void *d; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
346 |
}; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
347 |
|
1116
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
348 |
|
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
349 |
const char *stringcache(StringCache *cache, const char *str) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
350 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
351 |
return stringcache_len(cache, str, strlen(str)); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
352 |
} // stringcache |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
353 |
|
1116
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
354 |
static const char *stringcache_len_internal(StringCache *cache, |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
355 |
const char *str, |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
356 |
const unsigned int len, |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
357 |
const int addmissing) |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
358 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
359 |
const uint8 hash = hash_string(str, len) & (cache->table_size-1); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
360 |
StringBucket *bucket = cache->hashtable[hash]; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
361 |
StringBucket *prev = NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
362 |
while (bucket) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
363 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
364 |
const char *bstr = bucket->string; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
365 |
if ((strncmp(bstr, str, len) == 0) && (bstr[len] == 0)) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
366 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
367 |
// Matched! Move this to the front of the list. |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
368 |
if (prev != NULL) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
369 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
370 |
assert(prev->next == bucket); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
371 |
prev->next = bucket->next; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
372 |
bucket->next = cache->hashtable[hash]; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
373 |
cache->hashtable[hash] = bucket; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
374 |
} // if |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
375 |
return bstr; // already cached |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
376 |
} // if |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
377 |
prev = bucket; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
378 |
bucket = bucket->next; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
379 |
} // while |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
380 |
|
1116
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
381 |
// no match! |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
382 |
if (!addmissing) |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
383 |
return NULL; |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
384 |
|
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
385 |
// add to the table. |
1141
77468a2a9165
Reduce malloc pressure in stringcache (thanks, Max!).
Ryan C. Gordon <icculus@icculus.org>
parents:
1140
diff
changeset
|
386 |
bucket = (StringBucket *) cache->m(sizeof (StringBucket) + len + 1, cache->d); |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
387 |
if (bucket == NULL) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
388 |
return NULL; |
1141
77468a2a9165
Reduce malloc pressure in stringcache (thanks, Max!).
Ryan C. Gordon <icculus@icculus.org>
parents:
1140
diff
changeset
|
389 |
bucket->string = (char *)(bucket + 1); |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
390 |
memcpy(bucket->string, str, len); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
391 |
bucket->string[len] = '\0'; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
392 |
bucket->next = cache->hashtable[hash]; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
393 |
cache->hashtable[hash] = bucket; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
394 |
return bucket->string; |
1116
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
395 |
} // stringcache_len_internal |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
396 |
|
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
397 |
const char *stringcache_len(StringCache *cache, const char *str, |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
398 |
const unsigned int len) |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
399 |
{ |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
400 |
return stringcache_len_internal(cache, str, len, 1); |
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
401 |
} // stringcache_len |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
402 |
|
1116
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
403 |
int stringcache_iscached(StringCache *cache, const char *str) |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
404 |
{ |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
405 |
return (stringcache_len_internal(cache, str, strlen(str), 0) != NULL); |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
406 |
} // stringcache_iscached |
0ef3d106dab9
Added stringcache_iscached().
Ryan C. Gordon <icculus@icculus.org>
parents:
1113
diff
changeset
|
407 |
|
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
408 |
const char *stringcache_fmt(StringCache *cache, const char *fmt, ...) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
409 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
410 |
char buf[128]; // use the stack if reasonable. |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
411 |
char *ptr = NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
412 |
int len = 0; // number of chars, NOT counting null-terminator! |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
413 |
va_list ap; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
414 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
415 |
va_start(ap, fmt); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
416 |
len = vsnprintf(buf, sizeof (buf), fmt, ap); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
417 |
va_end(ap); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
418 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
419 |
if (len > sizeof (buf)) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
420 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
421 |
ptr = (char *) cache->m(len, cache->d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
422 |
if (ptr == NULL) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
423 |
return NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
424 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
425 |
va_start(ap, fmt); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
426 |
vsnprintf(ptr, len, fmt, ap); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
427 |
va_end(ap); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
428 |
} // if |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
429 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
430 |
const char *retval = stringcache_len(cache, ptr ? ptr : buf, len); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
431 |
if (ptr != NULL) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
432 |
cache->f(ptr, cache->d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
433 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
434 |
return retval; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
435 |
} // stringcache_fmt |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
436 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
437 |
StringCache *stringcache_create(MOJOSHADER_malloc m, MOJOSHADER_free f, void *d) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
438 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
439 |
const uint32 initial_table_size = 256; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
440 |
const size_t tablelen = sizeof (StringBucket *) * initial_table_size; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
441 |
StringCache *cache = (StringCache *) m(sizeof (StringCache), d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
442 |
if (!cache) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
443 |
return NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
444 |
memset(cache, '\0', sizeof (StringCache)); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
445 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
446 |
cache->hashtable = (StringBucket **) m(tablelen, d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
447 |
if (!cache->hashtable) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
448 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
449 |
f(cache, d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
450 |
return NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
451 |
} // if |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
452 |
memset(cache->hashtable, '\0', tablelen); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
453 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
454 |
cache->table_size = initial_table_size; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
455 |
cache->m = m; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
456 |
cache->f = f; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
457 |
cache->d = d; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
458 |
return cache; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
459 |
} // stringcache_create |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
460 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
461 |
void stringcache_destroy(StringCache *cache) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
462 |
{ |
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
463 |
if (cache == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
464 |
return; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
465 |
|
858
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
466 |
MOJOSHADER_free f = cache->f; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
467 |
void *d = cache->d; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
468 |
size_t i; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
469 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
470 |
for (i = 0; i < cache->table_size; i++) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
471 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
472 |
StringBucket *bucket = cache->hashtable[i]; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
473 |
cache->hashtable[i] = NULL; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
474 |
while (bucket) |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
475 |
{ |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
476 |
StringBucket *next = bucket->next; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
477 |
f(bucket, d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
478 |
bucket = next; |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
479 |
} // while |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
480 |
} // for |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
481 |
|
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
482 |
f(cache->hashtable, d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
483 |
f(cache, d); |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
484 |
} // stringcache_destroy |
d51537335896
Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents:
735
diff
changeset
|
485 |
|
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
486 |
|
945
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
487 |
// We chain errors as a linked list with a head/tail for easy appending. |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
488 |
// These get flattened before passing to the application. |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
489 |
typedef struct ErrorItem |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
490 |
{ |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
491 |
MOJOSHADER_error error; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
492 |
struct ErrorItem *next; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
493 |
} ErrorItem; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
494 |
|
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
495 |
struct ErrorList |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
496 |
{ |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
497 |
ErrorItem head; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
498 |
ErrorItem *tail; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
499 |
int count; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
500 |
MOJOSHADER_malloc m; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
501 |
MOJOSHADER_free f; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
502 |
void *d; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
503 |
}; |
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
504 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
505 |
ErrorList *errorlist_create(MOJOSHADER_malloc m, MOJOSHADER_free f, void *d) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
506 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
507 |
ErrorList *retval = (ErrorList *) m(sizeof (ErrorList), d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
508 |
if (retval != NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
509 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
510 |
memset(retval, '\0', sizeof (ErrorList)); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
511 |
retval->tail = &retval->head; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
512 |
retval->m = m; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
513 |
retval->f = f; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
514 |
retval->d = d; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
515 |
} // if |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
516 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
517 |
return retval; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
518 |
} // errorlist_create |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
519 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
520 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
521 |
int errorlist_add(ErrorList *list, const char *fname, |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
522 |
const int errpos, const char *str) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
523 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
524 |
return errorlist_add_fmt(list, fname, errpos, "%s", str); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
525 |
} // errorlist_add |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
526 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
527 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
528 |
int errorlist_add_fmt(ErrorList *list, const char *fname, |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
529 |
const int errpos, const char *fmt, ...) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
530 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
531 |
va_list ap; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
532 |
va_start(ap, fmt); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
533 |
const int retval = errorlist_add_va(list, fname, errpos, fmt, ap); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
534 |
va_end(ap); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
535 |
return retval; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
536 |
} // errorlist_add_fmt |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
537 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
538 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
539 |
int errorlist_add_va(ErrorList *list, const char *_fname, |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
540 |
const int errpos, const char *fmt, va_list va) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
541 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
542 |
ErrorItem *error = (ErrorItem *) list->m(sizeof (ErrorItem), list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
543 |
if (error == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
544 |
return 0; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
545 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
546 |
char *fname = NULL; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
547 |
if (_fname != NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
548 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
549 |
fname = (char *) list->m(strlen(_fname) + 1, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
550 |
if (fname == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
551 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
552 |
list->f(error, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
553 |
return 0; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
554 |
} // if |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
555 |
strcpy(fname, _fname); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
556 |
} // if |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
557 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
558 |
char scratch[128]; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
559 |
va_list ap; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
560 |
va_copy(ap, va); |
1153
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
561 |
int len = vsnprintf(scratch, sizeof (scratch), fmt, ap); |
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
562 |
va_end(ap); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
563 |
|
1153
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
564 |
// on some versions of the windows C runtime, vsnprintf() returns -1 |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
565 |
// if the buffer overflows instead of the length the string would have |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
566 |
// been as expected. |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
567 |
// In this case we make another copy of va and fetch the length only |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
568 |
// with another call to _vscprintf |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
569 |
|
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
570 |
#ifdef _MSC_VER |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
571 |
if (len == -1) |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
572 |
{ |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
573 |
va_copy(ap, va); |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
574 |
len = _vscprintf(fmt, ap); |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
575 |
va_end(ap); |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
576 |
} |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
577 |
#endif |
663c9541e21f
Deal with quirks of MSVC's vsnprintf() implementation.
Baldur Karlsson <baldur@unity3d.com>
parents:
1150
diff
changeset
|
578 |
|
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
579 |
char *failstr = (char *) list->m(len + 1, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
580 |
if (failstr == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
581 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
582 |
list->f(error, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
583 |
list->f(fname, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
584 |
return 0; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
585 |
} // if |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
586 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
587 |
// If we overflowed our scratch buffer, that's okay. We were going to |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
588 |
// allocate anyhow...the scratch buffer just lets us avoid a second |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
589 |
// run of vsnprintf(). |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
590 |
if (len < sizeof (scratch)) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
591 |
strcpy(failstr, scratch); // copy it over. |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
592 |
else |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
593 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
594 |
va_copy(ap, va); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
595 |
vsnprintf(failstr, len + 1, fmt, ap); // rebuild it. |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
596 |
va_end(ap); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
597 |
} // else |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
598 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
599 |
error->error.error = failstr; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
600 |
error->error.filename = fname; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
601 |
error->error.error_position = errpos; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
602 |
error->next = NULL; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
603 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
604 |
list->tail->next = error; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
605 |
list->tail = error; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
606 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
607 |
list->count++; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
608 |
return 1; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
609 |
} // errorlist_add_va |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
610 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
611 |
|
945
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
612 |
int errorlist_count(ErrorList *list) |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
613 |
{ |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
614 |
return list->count; |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
615 |
} // errorlist_count |
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
616 |
|
f00ea3986db8
Made ErrorList struct opaque to callers.
Ryan C. Gordon <icculus@icculus.org>
parents:
944
diff
changeset
|
617 |
|
939
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
618 |
MOJOSHADER_error *errorlist_flatten(ErrorList *list) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
619 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
620 |
if (list->count == 0) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
621 |
return NULL; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
622 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
623 |
int total = 0; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
624 |
MOJOSHADER_error *retval = (MOJOSHADER_error *) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
625 |
list->m(sizeof (MOJOSHADER_error) * list->count, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
626 |
if (retval == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
627 |
return NULL; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
628 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
629 |
ErrorItem *item = list->head.next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
630 |
while (item != NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
631 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
632 |
ErrorItem *next = item->next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
633 |
// reuse the string allocations |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
634 |
memcpy(&retval[total], &item->error, sizeof (MOJOSHADER_error)); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
635 |
list->f(item, list->d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
636 |
item = next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
637 |
total++; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
638 |
} // while |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
639 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
640 |
assert(total == list->count); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
641 |
list->count = 0; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
642 |
list->head.next = NULL; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
643 |
list->tail = &list->head; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
644 |
return retval; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
645 |
} // errorlist_flatten |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
646 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
647 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
648 |
void errorlist_destroy(ErrorList *list) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
649 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
650 |
if (list == NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
651 |
return; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
652 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
653 |
MOJOSHADER_free f = list->f; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
654 |
void *d = list->d; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
655 |
ErrorItem *item = list->head.next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
656 |
while (item != NULL) |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
657 |
{ |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
658 |
ErrorItem *next = item->next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
659 |
f((void *) item->error.error, d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
660 |
f((void *) item->error.filename, d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
661 |
f(item, d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
662 |
item = next; |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
663 |
} // while |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
664 |
f(list, d); |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
665 |
} // errorlist_destroy |
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
666 |
|
64cc93ee5a56
Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents:
870
diff
changeset
|
667 |
|
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
668 |
typedef struct BufferBlock |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
669 |
{ |
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
670 |
uint8 *data; |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
671 |
size_t bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
672 |
struct BufferBlock *next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
673 |
} BufferBlock; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
674 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
675 |
struct Buffer |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
676 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
677 |
size_t total_bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
678 |
BufferBlock *head; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
679 |
BufferBlock *tail; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
680 |
size_t block_size; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
681 |
MOJOSHADER_malloc m; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
682 |
MOJOSHADER_free f; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
683 |
void *d; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
684 |
}; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
685 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
686 |
Buffer *buffer_create(size_t blksz, MOJOSHADER_malloc m, |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
687 |
MOJOSHADER_free f, void *d) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
688 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
689 |
Buffer *buffer = (Buffer *) m(sizeof (Buffer), d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
690 |
if (buffer != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
691 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
692 |
memset(buffer, '\0', sizeof (Buffer)); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
693 |
buffer->block_size = blksz; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
694 |
buffer->m = m; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
695 |
buffer->f = f; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
696 |
buffer->d = d; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
697 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
698 |
return buffer; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
699 |
} // buffer_create |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
700 |
|
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
701 |
char *buffer_reserve(Buffer *buffer, const size_t len) |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
702 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
703 |
// note that we make the blocks bigger than blocksize when we have enough |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
704 |
// data to overfill a fresh block, to reduce allocations. |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
705 |
const size_t blocksize = buffer->block_size; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
706 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
707 |
if (len == 0) |
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
708 |
return NULL; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
709 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
710 |
if (buffer->tail != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
711 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
712 |
const size_t tailbytes = buffer->tail->bytes; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
713 |
const size_t avail = (tailbytes >= blocksize) ? 0 : blocksize - tailbytes; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
714 |
if (len <= avail) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
715 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
716 |
buffer->tail->bytes += len; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
717 |
buffer->total_bytes += len; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
718 |
assert(buffer->tail->bytes <= blocksize); |
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
719 |
return (char *) buffer->tail->data + tailbytes; |
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
720 |
} // if |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
721 |
} // if |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
722 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
723 |
// need to allocate a new block (even if a previous block wasn't filled, |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
724 |
// so this buffer is contiguous). |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
725 |
const size_t bytecount = len > blocksize ? len : blocksize; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
726 |
const size_t malloc_len = sizeof (BufferBlock) + bytecount; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
727 |
BufferBlock *item = (BufferBlock *) buffer->m(malloc_len, buffer->d); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
728 |
if (item == NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
729 |
return NULL; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
730 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
731 |
item->data = ((uint8 *) item) + sizeof (BufferBlock); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
732 |
item->bytes = len; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
733 |
item->next = NULL; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
734 |
if (buffer->tail != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
735 |
buffer->tail->next = item; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
736 |
else |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
737 |
buffer->head = item; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
738 |
buffer->tail = item; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
739 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
740 |
buffer->total_bytes += len; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
741 |
|
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
742 |
return (char *) item->data; |
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
743 |
} // buffer_reserve |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
744 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
745 |
int buffer_append(Buffer *buffer, const void *_data, size_t len) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
746 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
747 |
const uint8 *data = (const uint8 *) _data; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
748 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
749 |
// note that we make the blocks bigger than blocksize when we have enough |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
750 |
// data to overfill a fresh block, to reduce allocations. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
751 |
const size_t blocksize = buffer->block_size; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
752 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
753 |
if (len == 0) |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
754 |
return 1; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
755 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
756 |
if (buffer->tail != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
757 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
758 |
const size_t tailbytes = buffer->tail->bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
759 |
const size_t avail = (tailbytes >= blocksize) ? 0 : blocksize - tailbytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
760 |
const size_t cpy = (avail > len) ? len : avail; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
761 |
if (cpy > 0) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
762 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
763 |
memcpy(buffer->tail->data + tailbytes, data, cpy); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
764 |
len -= cpy; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
765 |
data += cpy; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
766 |
buffer->tail->bytes += cpy; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
767 |
buffer->total_bytes += cpy; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
768 |
assert(buffer->tail->bytes <= blocksize); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
769 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
770 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
771 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
772 |
if (len > 0) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
773 |
{ |
1113 | 774 |
assert((!buffer->tail) || (buffer->tail->bytes >= blocksize)); |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
775 |
const size_t bytecount = len > blocksize ? len : blocksize; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
776 |
const size_t malloc_len = sizeof (BufferBlock) + bytecount; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
777 |
BufferBlock *item = (BufferBlock *) buffer->m(malloc_len, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
778 |
if (item == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
779 |
return 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
780 |
|
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
781 |
item->data = ((uint8 *) item) + sizeof (BufferBlock); |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
782 |
item->bytes = len; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
783 |
item->next = NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
784 |
if (buffer->tail != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
785 |
buffer->tail->next = item; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
786 |
else |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
787 |
buffer->head = item; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
788 |
buffer->tail = item; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
789 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
790 |
memcpy(item->data, data, len); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
791 |
buffer->total_bytes += len; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
792 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
793 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
794 |
return 1; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
795 |
} // buffer_append |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
796 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
797 |
int buffer_append_fmt(Buffer *buffer, const char *fmt, ...) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
798 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
799 |
va_list ap; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
800 |
va_start(ap, fmt); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
801 |
const int retval = buffer_append_va(buffer, fmt, ap); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
802 |
va_end(ap); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
803 |
return retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
804 |
} // buffer_append_fmt |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
805 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
806 |
int buffer_append_va(Buffer *buffer, const char *fmt, va_list va) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
807 |
{ |
1080
b92bdbf78621
M4X4 opcode can actually overflow some string buffers.
Ryan C. Gordon <icculus@icculus.org>
parents:
1065
diff
changeset
|
808 |
char scratch[256]; |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
809 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
810 |
va_list ap; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
811 |
va_copy(ap, va); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
812 |
const int len = vsnprintf(scratch, sizeof (scratch), fmt, ap); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
813 |
va_end(ap); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
814 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
815 |
// If we overflowed our scratch buffer, heap allocate and try again. |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
816 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
817 |
if (len == 0) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
818 |
return 1; // nothing to do. |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
819 |
else if (len < sizeof (scratch)) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
820 |
return buffer_append(buffer, scratch, len); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
821 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
822 |
char *buf = (char *) buffer->m(len + 1, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
823 |
if (buf == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
824 |
return 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
825 |
va_copy(ap, va); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
826 |
vsnprintf(buf, len + 1, fmt, ap); // rebuild it. |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
827 |
va_end(ap); |
1140
fad7ed946c06
Fixed incorrect variable in buffer_append_va (thanks, Max!).
Ryan C. Gordon <icculus@icculus.org>
parents:
1116
diff
changeset
|
828 |
const int retval = buffer_append(buffer, buf, len); |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
829 |
buffer->f(buf, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
830 |
return retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
831 |
} // buffer_append_va |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
832 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
833 |
size_t buffer_size(Buffer *buffer) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
834 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
835 |
return buffer->total_bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
836 |
} // buffer_size |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
837 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
838 |
void buffer_empty(Buffer *buffer) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
839 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
840 |
BufferBlock *item = buffer->head; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
841 |
while (item != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
842 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
843 |
BufferBlock *next = item->next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
844 |
buffer->f(item, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
845 |
item = next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
846 |
} // while |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
847 |
buffer->head = buffer->tail = NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
848 |
buffer->total_bytes = 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
849 |
} // buffer_empty |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
850 |
|
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
851 |
char *buffer_flatten(Buffer *buffer) |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
852 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
853 |
char *retval = (char *) buffer->m(buffer->total_bytes + 1, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
854 |
if (retval == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
855 |
return NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
856 |
BufferBlock *item = buffer->head; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
857 |
char *ptr = retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
858 |
while (item != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
859 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
860 |
BufferBlock *next = item->next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
861 |
memcpy(ptr, item->data, item->bytes); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
862 |
ptr += item->bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
863 |
buffer->f(item, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
864 |
item = next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
865 |
} // while |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
866 |
*ptr = '\0'; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
867 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
868 |
assert(ptr == (retval + buffer->total_bytes)); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
869 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
870 |
buffer->head = buffer->tail = NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
871 |
buffer->total_bytes = 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
872 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
873 |
return retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
874 |
} // buffer_flatten |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
875 |
|
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
876 |
char *buffer_merge(Buffer **buffers, const size_t n, size_t *_len) |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
877 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
878 |
Buffer *first = NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
879 |
size_t len = 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
880 |
size_t i; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
881 |
for (i = 0; i < n; i++) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
882 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
883 |
Buffer *buffer = buffers[i]; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
884 |
if (buffer == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
885 |
continue; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
886 |
if (first == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
887 |
first = buffer; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
888 |
len += buffer->total_bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
889 |
} // for |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
890 |
|
956
7888858a6777
Patched to compile on Windows.
Ryan C. Gordon <icculus@icculus.org>
parents:
946
diff
changeset
|
891 |
char *retval = (char *) (first ? first->m(len + 1, first->d) : NULL); |
944
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
892 |
if (retval == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
893 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
894 |
*_len = 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
895 |
return NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
896 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
897 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
898 |
*_len = len; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
899 |
char *ptr = retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
900 |
for (i = 0; i < n; i++) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
901 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
902 |
Buffer *buffer = buffers[i]; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
903 |
if (buffer == NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
904 |
continue; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
905 |
BufferBlock *item = buffer->head; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
906 |
while (item != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
907 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
908 |
BufferBlock *next = item->next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
909 |
memcpy(ptr, item->data, item->bytes); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
910 |
ptr += item->bytes; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
911 |
buffer->f(item, buffer->d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
912 |
item = next; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
913 |
} // while |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
914 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
915 |
buffer->head = buffer->tail = NULL; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
916 |
buffer->total_bytes = 0; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
917 |
} // for |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
918 |
*ptr = '\0'; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
919 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
920 |
assert(ptr == (retval + len)); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
921 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
922 |
return retval; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
923 |
} // buffer_merge |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
924 |
|
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
925 |
void buffer_destroy(Buffer *buffer) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
926 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
927 |
if (buffer != NULL) |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
928 |
{ |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
929 |
MOJOSHADER_free f = buffer->f; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
930 |
void *d = buffer->d; |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
931 |
buffer_empty(buffer); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
932 |
f(buffer, d); |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
933 |
} // if |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
934 |
} // buffer_destroy |
9f9fa9650772
Paying off more technical debt: unified growable buffers into one place.
Ryan C. Gordon <icculus@icculus.org>
parents:
939
diff
changeset
|
935 |
|
946
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
936 |
static int blockscmp(BufferBlock *item, const uint8 *data, size_t len) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
937 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
938 |
if (len == 0) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
939 |
return 1; // "match" |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
940 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
941 |
while (item != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
942 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
943 |
const size_t itemremain = item->bytes; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
944 |
const size_t avail = len < itemremain ? len : itemremain; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
945 |
if (memcmp(item->data, data, avail) != 0) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
946 |
return 0; // not a match. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
947 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
948 |
if (len == avail) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
949 |
return 1; // complete match! |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
950 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
951 |
len -= avail; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
952 |
data += avail; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
953 |
item = item->next; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
954 |
} // while |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
955 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
956 |
return 0; // not a complete match. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
957 |
} // blockscmp |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
958 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
959 |
ssize_t buffer_find(Buffer *buffer, const size_t start, |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
960 |
const void *_data, const size_t len) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
961 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
962 |
if (len == 0) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
963 |
return 0; // I guess that's right. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
964 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
965 |
if (start >= buffer->total_bytes) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
966 |
return -1; // definitely can't match. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
967 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
968 |
if (len > (buffer->total_bytes - start)) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
969 |
return -1; // definitely can't match. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
970 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
971 |
// Find the start point somewhere in the center of a buffer. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
972 |
BufferBlock *item = buffer->head; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
973 |
const uint8 *ptr = item->data; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
974 |
size_t pos = 0; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
975 |
if (start > 0) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
976 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
977 |
while (1) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
978 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
979 |
assert(item != NULL); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
980 |
if ((pos + item->bytes) > start) // start is in this block. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
981 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
982 |
ptr = item->data + (start - pos); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
983 |
break; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
984 |
} // if |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
985 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
986 |
pos += item->bytes; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
987 |
item = item->next; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
988 |
} // while |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
989 |
} // if |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
990 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
991 |
// okay, we're at the origin of the search. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
992 |
assert(item != NULL); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
993 |
assert(ptr != NULL); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
994 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
995 |
const uint8 *data = (const uint8 *) _data; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
996 |
const uint8 first = *data; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
997 |
while (item != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
998 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
999 |
const size_t itemremain = item->bytes - ((size_t)(ptr-item->data)); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1000 |
ptr = (uint8 *) memchr(ptr, first, itemremain); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1001 |
while (ptr != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1002 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1003 |
const size_t retval = pos + ((size_t) (ptr - item->data)); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1004 |
if (len == 1) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1005 |
return retval; // we're done, here it is! |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1006 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1007 |
const size_t itemremain = item->bytes - ((size_t)(ptr-item->data)); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1008 |
const size_t avail = len < itemremain ? len : itemremain; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1009 |
if ((avail == 0) || (memcmp(ptr, data, avail) == 0)) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1010 |
{ |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1011 |
// okay, we've got a (sub)string match! Move to the next block. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1012 |
// check all blocks until we get a complete match or a failure. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1013 |
if (blockscmp(item->next, data+avail, len-avail)) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1014 |
return (ssize_t) retval; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1015 |
} // if |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1016 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1017 |
// try again, further in this block. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1018 |
ptr = (uint8 *) memchr(ptr + 1, first, itemremain - 1); |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1019 |
} // while |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1020 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1021 |
pos += item->bytes; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1022 |
item = item->next; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1023 |
if (item != NULL) |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1024 |
ptr = item->data; |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1025 |
} // while |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1026 |
|
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1027 |
return -1; // no match found. |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1028 |
} // buffer_find |
16fec3a3f687
Technical debt: cleaned up things in the assembler that should've used Buffer.
Ryan C. Gordon <icculus@icculus.org>
parents:
945
diff
changeset
|
1029 |
|
1150
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1030 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1031 |
// Based on SDL_string.c's SDL_PrintFloat function |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1032 |
size_t MOJOSHADER_printFloat(char *text, size_t maxlen, float arg) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1033 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1034 |
size_t len; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1035 |
size_t left = maxlen; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1036 |
char *textstart = text; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1037 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1038 |
int precision = 9; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1039 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1040 |
if (arg) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1041 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1042 |
/* This isn't especially accurate, but hey, it's easy. :) */ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1043 |
unsigned long value; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1044 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1045 |
if (arg < 0) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1046 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1047 |
if (left > 1) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1048 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1049 |
*text = '-'; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1050 |
--left; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1051 |
} // if |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1052 |
++text; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1053 |
arg = -arg; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1054 |
} // if |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1055 |
value = (unsigned long) arg; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1056 |
len = snprintf(text, left, "%lu", value); |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1057 |
text += len; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1058 |
if (len >= left) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1059 |
left = (left < 1) ? left : 1; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1060 |
else |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1061 |
left -= len; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1062 |
arg -= value; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1063 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1064 |
int mult = 10; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1065 |
if (left > 1) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1066 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1067 |
*text = '.'; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1068 |
--left; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1069 |
} // if |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1070 |
++text; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1071 |
while (precision-- > 0) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1072 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1073 |
value = (unsigned long) (arg * mult); |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1074 |
len = snprintf(text, left, "%lu", value); |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1075 |
text += len; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1076 |
if (len >= left) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1077 |
left = (left < 1) ? left : 1; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1078 |
else |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1079 |
left -= len; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1080 |
arg -= (double) value / mult; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1081 |
if (arg < 0) arg = -arg; // Sometimes that bit gets flipped... |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1082 |
mult *= 10; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1083 |
} // while |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1084 |
} // if |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1085 |
else |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1086 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1087 |
if (left > 3) |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1088 |
{ |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1089 |
snprintf(text, left, "0.0"); |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1090 |
left -= 3; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1091 |
} // if |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1092 |
text += 3; |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1093 |
} // else |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1094 |
|
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1095 |
return (text - textstart); |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1096 |
} // MOJOSHADER_printFloat |
02c0f0afb39a
- Add ability to build MojoShader as a shared library
Ethan Lee <flibitijibibo@flibitijibibo.com>
parents:
1146
diff
changeset
|
1097 |
|
732
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1098 |
// end of mojoshader_common.c ... |
e070fea1f8c7
Added mojoshader_common.c with first shot at generic hashtable.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1099 |