Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 7971 → Rev 7972

/programs/cmm/lib/collection.h
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