Rev 7430 | Rev 7741 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7420 | pavelyakov | 1 | // Author: Pavel Iakovlev by. pavelyakov |
2 | |||
7521 | leency | 3 | #ifndef INCLUDE_ARRAY_H |
4 | #define INCLUDE_ARRAY_H |
||
7420 | pavelyakov | 5 | |
6 | // Array memory: [dword key][byte flags][dword left][dword right][dword value] -> 17 bytes = 1 position |
||
7 | // If key don't exists then value == 0 |
||
8 | :struct Array |
||
9 | { |
||
10 | dword memory; |
||
11 | dword offsetMemory; |
||
7430 | pavelyakov | 12 | dword lenInitSize; |
7420 | pavelyakov | 13 | dword recursiveIndex(dword i, address); |
14 | byte set(dword key, data); |
||
15 | dword get(dword key); |
||
7430 | pavelyakov | 16 | void reallocMemory(dword newSize); |
7420 | pavelyakov | 17 | //dword del(dword key); |
18 | byte init(dword size); |
||
19 | }; |
||
20 | |||
7430 | pavelyakov | 21 | :void Array::reallocMemory(dword newSize) |
22 | { |
||
23 | memory = realloc(memory, newSize); |
||
24 | lenInitSize = newSize; |
||
25 | } |
||
26 | |||
7420 | pavelyakov | 27 | :dword Array::recursiveIndex(dword key, address) |
28 | { |
||
29 | dword flags = 0; |
||
7430 | pavelyakov | 30 | IF (DSDWORD[address] == key) RETURN address; |
7420 | pavelyakov | 31 | flags = DSBYTE[address + 4]; |
32 | //IF (flags & 100b) RETURN address; // if delete |
||
33 | IF (flags & 010b) && (DSDWORD[address] < key) RETURN recursiveIndex(key, DSDWORD[address + 5]); // left tree |
||
34 | IF (flags & 001b) && (DSDWORD[address] > key) RETURN recursiveIndex(key, DSDWORD[address + 9]); // right tree |
||
35 | RETURN address; |
||
36 | } |
||
37 | :byte Array::init(dword size) |
||
38 | { |
||
39 | IF(!size) RETURN 0; |
||
40 | IF(!memory) |
||
41 | { |
||
7430 | pavelyakov | 42 | lenInitSize = size * 17; |
43 | memory = malloc(lenInitSize); |
||
7420 | pavelyakov | 44 | EBX = memory; |
45 | DSDWORD[EBX] = 0; |
||
46 | DSBYTE[EBX + 4] = 0; |
||
47 | DSDWORD[EBX + 5] = 0; |
||
48 | DSDWORD[EBX + 9] = 0; |
||
49 | DSDWORD[EBX + 13] = 0; |
||
50 | offsetMemory = 17; |
||
51 | RETURN 0xFF; |
||
52 | } |
||
7430 | pavelyakov | 53 | IF(size > lenInitSize) |
54 | { |
||
55 | reallocMemory(size * 17); |
||
56 | RETURN 0xFF; |
||
57 | } |
||
58 | RETURN 0; |
||
7420 | pavelyakov | 59 | } |
60 | :byte Array::set(dword key, data) |
||
61 | { |
||
62 | dword address = 0; |
||
63 | dword newOffset = 0; |
||
7430 | pavelyakov | 64 | IF(offsetMemory > lenInitSize) reallocMemory(offsetMemory << 1); |
7420 | pavelyakov | 65 | address = recursiveIndex(key, memory); |
66 | /*IF(DSBYTE[address + 4] & 100b) |
||
67 | { |
||
68 | IF(DSDWORD[address] < key) |
||
69 | { |
||
70 | DSBYTE[address + 4] |= 10b; |
||
71 | DSDWORD[address + 5] = newOffset; |
||
72 | } |
||
73 | ELSE IF(DSDWORD[address] > key) |
||
74 | { |
||
75 | DSBYTE[address + 4] |= 01b; |
||
76 | DSDWORD[address + 9] = newOffset; |
||
77 | } |
||
78 | ELSE |
||
79 | { |
||
80 | DSDWORD[address + 13] = data; |
||
81 | RETURN 0xFF; |
||
82 | } |
||
83 | }*/ |
||
84 | newOffset = memory + offsetMemory; |
||
85 | IF(DSDWORD[address] < key) |
||
86 | { |
||
7430 | pavelyakov | 87 | DSBYTE[address + 4] |= 010b; // set flag left address |
7420 | pavelyakov | 88 | DSDWORD[address + 5] = newOffset; |
89 | } |
||
90 | ELSE IF(DSDWORD[address] > key) |
||
91 | { |
||
7430 | pavelyakov | 92 | DSBYTE[address + 4] |= 001b; // set flag right address |
7420 | pavelyakov | 93 | DSDWORD[address + 9] = newOffset; |
94 | } |
||
95 | ELSE |
||
96 | { |
||
97 | DSDWORD[address + 13] = data; |
||
98 | RETURN 0xFF; |
||
99 | } |
||
100 | DSDWORD[newOffset] = key; |
||
101 | DSBYTE[newOffset+4] = 0; |
||
102 | DSDWORD[newOffset+5] = 0; |
||
103 | DSDWORD[newOffset+9] = 0; |
||
104 | DSDWORD[newOffset+13] = data; |
||
105 | offsetMemory += 17; |
||
106 | RETURN 0xFF; |
||
107 | } |
||
108 | :dword Array::get(dword key) |
||
109 | { |
||
110 | EBX = recursiveIndex(key, memory); |
||
111 | IF(DSDWORD[EBX] != key) RETURN 0; |
||
112 | IF(DSBYTE[EBX + 4] & 100b) RETURN 0; |
||
113 | RETURN DSDWORD[EBX + 13]; |
||
114 | } |
||
115 | /*:dword Array::del(dword key) |
||
116 | { |
||
117 | dword address = 0; |
||
118 | address = recursiveIndex(key, memory); |
||
119 | IF(DSDWORD[address] != key) RETURN 0; |
||
120 | DSBYTE[address + 4] |= 100b; |
||
121 | RETURN 0xFF; |
||
122 | }*/ |
||
123 | |||
124 | :struct Dictionary |
||
125 | { |
||
126 | Array array; |
||
127 | dword hash(dword text); |
||
128 | byte set(dword key, value); |
||
129 | dword get(dword key); |
||
130 | byte init(dword size); |
||
131 | }; |
||
132 | |||
7430 | pavelyakov | 133 | :dword Dictionary::hash(dword text) // max 255 bytes as strings => 4 byte or duble word hash |
7420 | pavelyakov | 134 | { |
7430 | pavelyakov | 135 | dword checkSum1 = 1; |
136 | dword checkSum2 = 0; |
||
137 | dword beginAddress = 0; |
||
7420 | pavelyakov | 138 | |
7430 | pavelyakov | 139 | beginAddress = text; |
7420 | pavelyakov | 140 | WHILE(DSBYTE[text]) |
141 | { |
||
7430 | pavelyakov | 142 | checkSum1 += DSBYTE[text]; |
143 | checkSum2 += checkSum1; |
||
7420 | pavelyakov | 144 | text++; |
145 | } |
||
7430 | pavelyakov | 146 | //IF(h1 > 0x03FFF) RETURN h1 << 8 ^ h2; |
147 | //IF(h2 > 0x3FFFF) RETURN h1 << 8 ^ h2; |
||
148 | EAX = text - beginAddress; |
||
149 | EAX <<= 23; |
||
150 | RETURN EAX | checkSum2; |
||
7420 | pavelyakov | 151 | } |
152 | |||
153 | :byte Dictionary::set(dword key, value) |
||
154 | { |
||
155 | RETURN array.set(hash(key),value); |
||
156 | } |
||
157 | |||
158 | :dword Dictionary::get(dword key) |
||
159 | { |
||
160 | RETURN array.get(hash(key)); |
||
161 | } |
||
162 | |||
163 | :byte Dictionary::init(dword size) |
||
164 | { |
||
165 | RETURN array.init(size); |
||
7521 | leency | 166 | } |
167 | |||
168 | #endif=><=>><>><>>>><>> |