diff --git a/programs/cmm/eolite/include/left_panel.h b/programs/cmm/eolite/include/left_panel.h index 9dd570739..c43ac4544 100644 --- a/programs/cmm/eolite/include/left_panel.h +++ b/programs/cmm/eolite/include/left_panel.h @@ -78,7 +78,7 @@ void GetSystemDiscs() dword temp_file_count, tempbuf; dword devbuf; - disk_list.init(4096); + disk_list.drop(); devbuf = malloc(10000); ReadDir(19, devbuf, "/"); dev_num = EBX; diff --git a/programs/cmm/examples/collections.c b/programs/cmm/examples/collections.c index f732be07b..7df5f78dd 100644 --- a/programs/cmm/examples/collections.c +++ b/programs/cmm/examples/collections.c @@ -1,4 +1,4 @@ -#define MEMSIZE 4096*10 +#define MEMSIZE 4096*120 #include "../lib/io.h" #include "../lib/collection.h" @@ -6,12 +6,11 @@ void main() { collection s; + int i; io.run("/sys/develop/board", ""); - s.init(4096); - s.add("lorem"); - s.add("ipsum"); - s.add("1234566"); + s.add("Hello"); + s.add("World!"); debugln(s.get(0)); debugln(s.get(1)); - debugln(s.get(2)); + s.drop(); } \ No newline at end of file diff --git a/programs/cmm/lib/collection.h b/programs/cmm/lib/collection.h index 0d98a4369..dd765bca3 100644 --- a/programs/cmm/lib/collection.h +++ b/programs/cmm/lib/collection.h @@ -4,42 +4,52 @@ struct collection { - int count; - dword element_offset[4096]; + int realloc_size, count; + dword data_start; + dword data_cur_pos; dword data_size; - dword string_data_start; - dword string_data_cur_pos; - void add(); + dword element_offset[4090]; + int add(); dword get(); void drop(); - void init(); + void increase_data_size(); }; -void collection::init(dword size) { - if (data_size) drop(); - data_size = data_size + size; - string_data_cur_pos = string_data_start = malloc(data_size); - count = 0; +void collection::increase_data_size() { + int filled_size; + if (realloc_size<4096) realloc_size = 4096; + if (!data_size) { + data_size = realloc_size; + data_start = malloc(realloc_size); + } + else { + data_size = data_size + realloc_size; + data_start = realloc(data_start, data_size); + } } -void collection::add(dword in) { - strcpy(string_data_cur_pos, in); - element_offset[count] = string_data_cur_pos; - string_data_cur_pos += strlen(in) + 1; +int collection::add(dword in) { + if (count >= 4090) return 0; + if (data_cur_pos+strlen(in)+2 > data_size) { + increase_data_size(); + add(in); + return; + } + strcpy(data_start+data_cur_pos, in); + element_offset[count] = data_cur_pos; + data_cur_pos += strlen(in) + 1; count++; + return 1; } dword collection::get(dword pos) { - return element_offset[pos]; + return data_start + element_offset[pos]; } void collection::drop() { - if (string_data_start) free(string_data_start); - data_size = - string_data_start = - string_data_cur_pos = - count = 0; + if (data_start) free(data_start); + data_size = data_start = data_cur_pos = count = 0; } #endif \ No newline at end of file