diff --git a/programs/cmm/examples/array.c b/programs/cmm/examples/array.c new file mode 100644 index 0000000000..0920ae72b0 --- /dev/null +++ b/programs/cmm/examples/array.c @@ -0,0 +1,61 @@ +#define MEMSIZE 4096*200 + +#include "../lib/window.h" +#include "../lib/array.h" + +window win1=0; +void main() +{ + win1.background = 0xFFFFFF; + win1.left = 200; + win1.top = 200; + win1.caption = "Stress test"; + win1.ondraw = #draw_window; + win1.create(); +} + +Array a = {0}; +Dictionary b = {0}; +void draw_window() +{ + dword size = 10000; + dword i = 0; + dword y = 10; + i = size; + /* ints */ + a.init(0); + while(i){ + a.set(i,i); + i--; + } + a.set(120,222); + a.set(9990,345); + i = size; + while(i){ + if (a.get(i) != i) + { + WriteText(15, y, 0x81, 0xFF0000, itoa(i)); + WriteText(95, y, 0x81, 0xFF0000, itoa(a.get(i))); + y += 25; + } + i--; + } + /* strs */ + b.init(0); + i = size; + while(i){ + b.set(itoa(i),i); + i--; + } + b.set("123","Okey"); + i = size; + while(i){ + if (b.get(itoa(i)) != i) + { + WriteText(15, y, 0x81, 0xFF0000, itoa(i)); + WriteText(95, y, 0x81, 0xFF0000, b.get(itoa(i))); + y += 25; + } + i--; + } +} diff --git a/programs/cmm/lib/array.h b/programs/cmm/lib/array.h index e55ae1809c..b3f621712f 100644 --- a/programs/cmm/lib/array.h +++ b/programs/cmm/lib/array.h @@ -3,6 +3,8 @@ #ifndef INCLUDE_ARRAY_H #define INCLUDE_ARRAY_H +#include "../lib/crc32.h" + // Array memory: [dword key][byte flags][dword left][dword right][dword value] -> 17 bytes = 1 position // If key don't exists then value == 0 :struct Array @@ -20,6 +22,7 @@ :void Array::reallocMemory(dword newSize) { + newSize *= 17; memory = realloc(memory, newSize); lenInitSize = newSize; } @@ -34,25 +37,27 @@ IF (flags & 001b) && (DSDWORD[address] > key) RETURN recursiveIndex(key, DSDWORD[address + 9]); // right tree RETURN address; } + :byte Array::init(dword size) { - IF(!size) RETURN 0; + dword pointer = 0; + if (!size) size = 8; IF(!memory) { lenInitSize = size * 17; memory = malloc(lenInitSize); - EBX = memory; - DSDWORD[EBX] = 0; - DSBYTE[EBX + 4] = 0; - DSDWORD[EBX + 5] = 0; - DSDWORD[EBX + 9] = 0; - DSDWORD[EBX + 13] = 0; + pointer = memory; + DSDWORD[pointer] = 0; pointer += 4; + DSBYTE[pointer] = 0; pointer += 1; + DSDWORD[pointer] = 0;pointer += 4; + DSDWORD[pointer] = 0;pointer += 4; + DSDWORD[pointer] = 0; offsetMemory = 17; RETURN 0xFF; } IF(size > lenInitSize) { - reallocMemory(size * 17); + reallocMemory(size); RETURN 0xFF; } RETURN 0; @@ -97,11 +102,11 @@ DSDWORD[address + 13] = data; RETURN 0xFF; } - DSDWORD[newOffset] = key; - DSBYTE[newOffset+4] = 0; - DSDWORD[newOffset+5] = 0; - DSDWORD[newOffset+9] = 0; - DSDWORD[newOffset+13] = data; + DSDWORD[newOffset] = key; newOffset+=4; + DSBYTE[newOffset] = 0; newOffset+=1; + DSDWORD[newOffset] = 0; newOffset+=4; + DSDWORD[newOffset] = 0; newOffset+=4; + DSDWORD[newOffset] = data; offsetMemory += 17; RETURN 0xFF; } @@ -130,8 +135,10 @@ byte init(dword size); }; -:dword Dictionary::hash(dword text) // max 255 bytes as strings => 4 byte or duble word hash +:dword Dictionary::hash(dword text) { + RETURN crc32(text, strlen(text)); +/* dword checkSum1 = 1; dword checkSum2 = 0; dword beginAddress = 0; @@ -148,6 +155,7 @@ EAX = text - beginAddress; EAX <<= 23; RETURN EAX | checkSum2; +*/ } :byte Dictionary::set(dword key, value) @@ -165,4 +173,4 @@ RETURN array.init(size); } -#endif \ No newline at end of file +#endif