2,8 → 2,86 |
#define INCLUDE_COLLECTION_H |
#print "[include <collection.h>]\n" |
|
#include "array.h" |
|
/*======================================================== |
= = |
= Integer = |
= = |
========================================================*/ |
|
struct collection_int |
{ |
dword buf; |
dword buf_size; |
unsigned count; |
void alloc(); |
void add(); |
dword get(); |
void set(); |
void swap(); |
dword len(); |
dword get_last(); |
void pop(); |
void drop(); |
}; |
|
:void collection_int::alloc() { |
if (!buf) { |
buf_size = 4096; |
buf = malloc(4096); |
} else { |
buf_size += 4096; |
buf = realloc(buf, buf_size); |
} |
} |
|
:void collection_int::add(dword _in) { |
if (!buf) || (count * sizeof(dword) >= buf_size) alloc(); |
EAX = count * sizeof(dword) + buf; |
ESDWORD[EAX] = _in; |
count++; |
} |
|
:dword collection_int::get(dword pos) { |
if (pos<0) || (pos>=count) return 0; |
return ESDWORD[pos * sizeof(dword) + buf]; |
} |
|
|
:void collection_int::set(dword pos, _in) { |
while (pos >= count) add(0); |
EAX = pos * sizeof(dword) + buf; |
ESDWORD[EAX] = _in; |
} |
|
:void collection_int::swap(dword pos1, pos2) { |
while (pos1 >= count) add(0); |
while (pos2 >= count) add(0); |
EAX = pos1 * sizeof(dword) + buf; |
EBX = pos2 * sizeof(dword) + buf; |
ESDWORD[EAX] >< ESDWORD[EBX]; |
} |
|
:dword collection_int::len(dword pos) { |
if (pos<0) || (pos+1>=count) return 0; |
return get(pos+1) - get(pos); |
} |
|
:dword collection_int::get_last() { |
return get(count-1); |
} |
|
:void collection_int::pop() { |
if (count>0) count--; |
} |
|
:void collection_int::drop() { |
count = 0; |
} |
|
/*======================================================== |
= = |
= String = |
= = |
========================================================*/ |
13,7 → 91,7 |
int realloc_size, count; |
dword data_start; |
dword data_size; |
dword element_offset[4000]; |
collection_int offset; |
int add(); |
int addn(); |
dword get(); //get_name_by_pos |
42,24 → 120,20 |
} |
|
:int collection::addn(dword in, len) { |
if (count >= 4000) { |
debugln("collection: more than 4000 elements!"); |
return 0; |
} |
if (element_offset[count]+len+2 > data_size) { |
if (offset.get(count)+len+2 > data_size) { |
increase_data_size(); |
addn(in, len); |
return 1; |
} |
strncpy(data_start+element_offset[count], in, len); |
strncpy(data_start+offset.get(count), in, len); |
count++; |
element_offset[count] = element_offset[count-1] + len + 1; |
offset.set(count, offset.get(count-1) + len + 1); |
return 1; |
} |
|
:dword collection::get(dword pos) { |
if (pos<0) || (pos>=count) return 0; |
return data_start + element_offset[pos]; |
return data_start + offset.get(pos); |
} |
|
:dword collection::get_last() { |
69,7 → 143,7 |
:dword collection::get_pos_by_name(dword name) { |
dword i; |
for (i=0; i<count; i++) { |
if (strcmp(data_start + element_offset[i], name)==0) return i; |
if (strcmp(data_start + offset.get(i), name)==0) return i; |
} |
return -1; |
} |
78,7 → 152,7 |
if (data_start) free(data_start); |
data_size = 0; |
data_start = 0; |
element_offset[count] = 0; |
offset.drop(); |
count = 0; |
} |
|
86,63 → 160,4 |
if (count>0) count--; |
} |
|
/*======================================================== |
= = |
= Integer = |
= = |
========================================================*/ |
|
struct collection_int |
{ |
dword buf; |
dword buf_size; |
unsigned count; |
void alloc(); |
void add(); |
dword get(); |
dword len(); |
dword get_last(); |
void pop(); |
void drop(); |
}; |
|
:void collection_int::alloc() { |
if (!buf) { |
buf_size = 4096; |
buf = malloc(4096); |
} else { |
buf_size += 4096; |
buf = realloc(buf, buf_size); |
} |
} |
|
:void collection_int::add(dword _in) { |
if (!buf) || (count * sizeof(dword) >= buf_size) alloc(); |
EAX = count * sizeof(dword) + buf; |
ESDWORD[EAX] = _in; |
count++; |
} |
|
:dword collection_int::get(dword pos) { |
if (pos<0) || (pos>=count) return 0; |
return ESDWORD[pos * sizeof(dword) + buf]; |
} |
|
:dword collection_int::len(dword pos) { |
if (pos<0) || (pos+1>=count) return 0; |
return get(pos+1) - get(pos); |
} |
|
:dword collection_int::get_last() { |
return get(count-1); |
} |
|
:void collection_int::pop() { |
if (count>0) count--; |
} |
|
:void collection_int::drop() { |
count = 0; |
} |
|
#endif |