Subversion Repositories Kolibri OS

Rev

Rev 5959 | Rev 5974 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5959 leency 1
#ifndef INCLUDE_COLLECTION_H
2
#define INCLUDE_COLLECTION_H
3
#print "[include ]\n"
4
 
5
struct collection
6
{
5965 leency 7
	int realloc_size, count;
8
	dword data_start;
9
	dword data_cur_pos;
5959 leency 10
	dword data_size;
5965 leency 11
	dword element_offset[4090];
12
	int add();
5959 leency 13
	dword get();
14
	void drop();
5965 leency 15
	void increase_data_size();
5959 leency 16
 
17
};
18
 
5965 leency 19
void collection::increase_data_size() {
20
	int filled_size;
21
	if (realloc_size<4096) realloc_size = 4096;
22
	if (!data_size) {
23
		data_size = realloc_size;
24
		data_start = malloc(realloc_size);
25
	}
26
	else {
27
		data_size = data_size + realloc_size;
28
		data_start = realloc(data_start, data_size);
29
	}
5959 leency 30
}
31
 
5965 leency 32
int collection::add(dword in) {
33
	if (count >= 4090) return 0;
34
	if (data_cur_pos+strlen(in)+2 > data_size) {
35
		increase_data_size();
36
		add(in);
37
		return;
38
	}
39
	strcpy(data_start+data_cur_pos, in);
40
	element_offset[count] = data_cur_pos;
41
	data_cur_pos += strlen(in) + 1;
5959 leency 42
	count++;
5965 leency 43
	return 1;
5959 leency 44
}
45
 
46
dword collection::get(dword pos) {
5965 leency 47
	return data_start + element_offset[pos];
5959 leency 48
}
49
 
50
void collection::drop() {
5965 leency 51
	if (data_start) free(data_start);
52
	data_size = data_start = data_cur_pos = count = 0;
5959 leency 53
}
54
 
55
#endif