git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
new function list_deep_free
[swftools.git]
/
lib
/
q.c
diff --git
a/lib/q.c
b/lib/q.c
index
3b9a62f
..
9438033
100644
(file)
--- a/
lib/q.c
+++ b/
lib/q.c
@@
-68,7
+68,9
@@
static int mem_put_(mem_t*m,const void*data, int length, int null)
int n = m->pos;
m->pos += length + (null?1:0);
if(m->pos > m->len) {
int n = m->pos;
m->pos += length + (null?1:0);
if(m->pos > m->len) {
- m->len = (m->pos+63)&~63;
+ int v1 = (m->pos+63)&~63;
+ int v2 = m->len + m->len / 2;
+ m->len = v1>v2?v1:v2;
m->buffer = m->buffer?(char*)rfx_realloc(m->buffer,m->len):(char*)rfx_alloc(m->len);
}
assert(n+length <= m->len);
m->buffer = m->buffer?(char*)rfx_realloc(m->buffer,m->len):(char*)rfx_alloc(m->len);
}
assert(n+length <= m->len);
@@
-85,6
+87,15
@@
int mem_putstring(mem_t*m,string_t str)
{
return mem_put_(m, str.str, str.len, 1);
}
{
return mem_put_(m, str.str, str.len, 1);
}
+int mem_get(mem_t*m, void*data, int length)
+{
+ if(m->read_pos + length > m->pos) {
+ length = m->pos - m->read_pos;
+ }
+ memcpy(data, m->buffer+m->read_pos, length);
+ m->read_pos += length;
+ return length;
+}
// ------------------------------- ringbuffer_t -------------------------------
// ------------------------------- ringbuffer_t -------------------------------
@@
-393,10
+404,12
@@
unsigned int crc32_add_byte(unsigned int checksum, unsigned char b)
}
unsigned int crc32_add_string(unsigned int checksum, const char*s)
{
}
unsigned int crc32_add_string(unsigned int checksum, const char*s)
{
+ if(!crc32)
+ crc32_init();
if(!s)
return checksum;
while(*s) {
if(!s)
return checksum;
while(*s) {
- checksum = crc32_add_byte(checksum, *s);
+ checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff];
s++;
}
return checksum;
s++;
}
return checksum;
@@
-591,7
+604,7
@@
char ptr_equals(const void*o1, const void*o2)
}
unsigned int ptr_hash(const void*o)
{
}
unsigned int ptr_hash(const void*o)
{
- return string_hash3(o, sizeof(o));
+ return string_hash3((const char*)&o, sizeof(o));
}
void* ptr_dup(const void*o)
{
}
void* ptr_dup(const void*o)
{
@@
-800,11
+813,10
@@
int dict_count(dict_t*h)
return h->num;
}
return h->num;
}
-void dict_do_lookup(dict_t*h, const void*key, void***match)
+static inline dictentry_t* dict_do_lookup(dict_t*h, const void*key)
{
if(!h->num) {
{
if(!h->num) {
- *match = 0;
- return;
+ return 0;
}
unsigned int ohash = h->key_type->hash(key);
}
unsigned int ohash = h->key_type->hash(key);
@@
-813,8
+825,7
@@
void dict_do_lookup(dict_t*h, const void*key, void***match)
/* check first entry for match */
dictentry_t*e = h->slots[hash];
if(e && h->key_type->equals(e->key, key)) {
/* check first entry for match */
dictentry_t*e = h->slots[hash];
if(e && h->key_type->equals(e->key, key)) {
- *match = &e->data;
- return;
+ return e;
} else if(e) {
e = e->next;
}
} else if(e) {
e = e->next;
}
@@
-830,31
+841,40
@@
void dict_do_lookup(dict_t*h, const void*key, void***match)
dict_expand(h, newsize);
hash = ohash % h->hashsize;
e = h->slots[hash];
dict_expand(h, newsize);
hash = ohash % h->hashsize;
e = h->slots[hash];
+ if(e && h->key_type->equals(e->key, key)) {
+ // omit move to front
+ return e;
+ } else if(e) {
+ e = e->next;
+ }
}
/* check subsequent entries for a match */
}
/* check subsequent entries for a match */
+ dictentry_t*last = h->slots[hash];
while(e) {
if(h->key_type->equals(e->key, key)) {
while(e) {
if(h->key_type->equals(e->key, key)) {
- *match = &e->data;
- return;
+ /* move to front- makes a difference of about 10% in most applications */
+ last->next = e->next;
+ e->next = h->slots[hash];
+ h->slots[hash] = e;
+ return e;
}
}
+ last=e;
e = e->next;
}
e = e->next;
}
- *match = 0;
+ return 0;
}
void* dict_lookup(dict_t*h, const void*key)
{
}
void* dict_lookup(dict_t*h, const void*key)
{
- void**data = 0;
- dict_do_lookup(h, key, &data);
- if(data)
- return *data;
+ dictentry_t*e = dict_do_lookup(h, key);
+ if(e)
+ return e->data;
return 0;
}
char dict_contains(dict_t*h, const void*key)
{
return 0;
}
char dict_contains(dict_t*h, const void*key)
{
- void**data = 0;
- dict_do_lookup(h, key, &data);
- return !!data;
+ dictentry_t*e = dict_do_lookup(h, key);
+ return !!e;
}
char dict_del(dict_t*h, const void*key)
}
char dict_del(dict_t*h, const void*key)
@@
-923,16
+943,18
@@
void dict_foreach_value(dict_t*h, void (*runFunction)(void*))
}
}
}
}
-void dict_free_all(dict_t*h, void (*freeFunction)(void*))
+void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*))
{
int t;
for(t=0;t<h->hashsize;t++) {
dictentry_t*e = h->slots[t];
while(e) {
dictentry_t*next = e->next;
{
int t;
for(t=0;t<h->hashsize;t++) {
dictentry_t*e = h->slots[t];
while(e) {
dictentry_t*next = e->next;
- h->key_type->free(e->key);
- if(freeFunction) {
- freeFunction(e->data);
+ if(free_keys) {
+ h->key_type->free(e->key);
+ }
+ if(free_data_function) {
+ free_data_function(e->data);
}
memset(e, 0, sizeof(dictentry_t));
rfx_free(e);
}
memset(e, 0, sizeof(dictentry_t));
rfx_free(e);
@@
-944,9
+966,20
@@
void dict_free_all(dict_t*h, void (*freeFunction)(void*))
memset(h, 0, sizeof(dict_t));
}
memset(h, 0, sizeof(dict_t));
}
+void dict_clear_shallow(dict_t*h)
+{
+ dict_free_all(h, 0, 0);
+}
+
void dict_clear(dict_t*h)
{
void dict_clear(dict_t*h)
{
- dict_free_all(h, 0);
+ dict_free_all(h, 1, 0);
+}
+
+void dict_destroy_shallow(dict_t*dict)
+{
+ dict_clear_shallow(dict);
+ rfx_free(dict);
}
void dict_destroy(dict_t*dict)
}
void dict_destroy(dict_t*dict)
@@
-1001,7
+1034,7
@@
void map_dump(map_t*map, FILE*fi, const char*prefix)
void map_clear(map_t*map)
{
map_internal_t*m = (map_internal_t*)map->internal;
void map_clear(map_t*map)
{
map_internal_t*m = (map_internal_t*)map->internal;
- dict_free_all(&m->d, freestring);
+ dict_free_all(&m->d, 1, freestring);
rfx_free(m);
}
void map_destroy(map_t*map)
rfx_free(m);
}
void map_destroy(map_t*map)
@@
-1181,6
+1214,20
@@
void list_free_(void*_list)
}
*list = 0;
}
}
*list = 0;
}
+void list_deep_free_(void*_list)
+{
+ commonlist_t**list = (commonlist_t**)_list;
+ commonlist_t*l = *list;
+ while(l) {
+ commonlist_t*next = l->next;
+ if(l->entry) {
+ free(l->entry);l->entry=0;
+ }
+ free(l);
+ l = next;
+ }
+ *list = 0;
+}
void*list_clone_(void*_list)
{
commonlist_t*l = *(commonlist_t**)_list;
void*list_clone_(void*_list)
{
commonlist_t*l = *(commonlist_t**)_list;