Fix brainf*ck interpreter memory issue
[bob_language.git] / best_practices.txt
blobb98a74c528ae0065432233685e3dcd1d8c94445c
1 Vnutorne funkcie
2   CMemCopy(cDestination, cSource: Pointer; cSize: Int); internal;
3     -> skopiruje cSize Intov z cSource do cDestination
5   CMemSet(cMemory: Pointer; cLength, cValue: Integer); internal;
6     -> nastavi pamat danu cMemory o dlzke cLength na cValue
8   ERangeCheckError; internal;
9     -> Vyvola vynimku RangeCheckError a skonci beh programu
11 Zname struktury:
12   Blob = record
13     RefCount, Size: Integer;
14     Data: array [1..Size] of Byte;
15   end;
17 Zname funkcie:
18   BCreate(cInt: Int): Blob; stdcall;
19   BCreateR(cInt: Int): Blob; register;
20   BCreateEmptyR(cInt: Int): Blob; register;
21   BBCreate(cInt: Int): Blob; special;
22     -> vytvori (prazdny) Blob o velkosti cInt
23        cInt by mal byt vzdy vacsi ako 0
25   BDestroy(cBlob: Blob); stdcall;
26   BDestroyR(cBlob: Blob); register;
27   BDestroyC(cBlob: Blob); cdecl;
28     -> odstrani dany cBlob
30   BLengthC(cBlob: Blob): Int; cdecl;
31   BBGetLength(cBlob: Blob): Blob; blobcall;
32     -> vrati velkost cBlob
33        tato velkost by mala byt vzdy vacsia ako 0
35   BBSetLength(cBlob, cNewLength: Blob): Blob; blobcall;
36   BResize(cBlob: Blob; cNewLength: Int): Blob; stdcall;
37     -> vrati Blob o velkosti cNewLength
38        skopiruje povodny obsah do noveho, ak sa zvacsil, napadduje nulami
40   BEnlarge(cBlob: Blob; cNewLength: Int): Blob; stdcall;
41     -> zvacsi cBlob na dlzku cNewLength, ak ta je viac ako aktualna dlzka
43   BCopy(cBlob: Blob): Blob; stdcall;
44   BBCopy(cBlob: Blob): Blob; special;
45     -> vrati Blob obsahujuci kopiu cBlob
47   BToIndex(cBlob: Blob): Int; stdcall;
48     -> vrati reprezentaciu cBlob ako index do ineho Blobu
49        pri chybe sposobi RangeCheckError
51   BBToBlob(cInt: Int): Blob; blobcall;
52     -> vrati optimalny Blob reprezentujuci dany Int
54   BToPtr(cBlob, cIndex: Blob): Pointer; stdcall;
55     -> vrati Pointer na prvok cBlob[cIndex]
56        pri chybe sposobi RangeCheckError
58   BGetElement(cBlob, cIndex: Blob): Blob; stdcall;
59   BBGetElement(cBlob, cIndex: Blob): Blob; blobcall;
60     -> vrati cBlob[cIndex] ako Blob
62   BBSetElement(cBlob, cIndex, cValue: Blob): Blob; blobcall;
63     -> vrati kopiu cBlob, pre ktoru plati cBlob[cIndex] := cValue;
65   BOptimize(cBlob: Blob): Blob; stdcall;
66     -> vrati dlzkovo optimalizovanu verziu cBlob
68   BNot(cBlob: Blob): Blob; stdcall;
69   BBNot(cBlob: Blob): Blob; blobcall;
70     -> vrati binarne negovanu verziu cBlob
72   BAnd(cBlob1, cBlob2: Blob): Blob; stdcall;
73   BBAnd(cBlob1, cBlob2: Blob): Blob; blobcall;
74     -> vrati (cBlob1 AND cBlob2)
76   BOr(cBlob1, cBlob2: Blob): Blob; stdcall;
77   BBOr(cBlob1, cBlob2: Blob): Blob; blobcall;
78     -> vrati (cBlob1 OR cBlob2)
80   BXor(cBlob1, cBlob2: Blob): Blob; stdcall;
81   BBXor(cBlob1, cBlob2: Blob): Blob; blobcall;
82     -> vrati (cBlob1 XOR cBlob2)
84   BToShiftLow(cShift: Blob): Int; stdcall;
85     -> vrati spodne 3 bity z cShift
87   BToShiftHigh(cShift: Blob): Int; stdcall;
88     -> vrati bity 4-35 z cShift
89        ak je cShift vacsi, vrati najvacsi vyjadritelny Int
91   BShiftLeft(cBlob, cShift: Blob): Blob; stdcall;
92   BBShiftLeft(cBlob, cShift: Blob): Blob; blobcall;
93     -> vrati (cBlob << cShift)
95   BShiftRight(cBlob, cShift: Blob): Blob; stdcall;
96   BBShiftRight(cBlob, cShift: Blob): Blob; blobcall;
97     -> vrati (cBlob >> cShift)
99   BNegate(cBlob: Blob): Blob; stdcall;
100   BBNegate(cBlob: Blob): Blob; blobcall;
101     -> vrati Blob reprezentujuci znamienkovo negovany cBlob
103   BSign(cBlob: Blob): Int; stdcall;
104     -> vrati 1 ak (cBlob < 0), inak 0
106   BSignExtend(cBlob: Blob; cNewLength: Int): Blob; stdcall;
107     -> rozsiri cBlob znamienkovo na cNewLength
108     -> cNewLength musi byt vacsi ako aktualna dlzka
110   BEquals(cBlob1, cBlob2): Blob; stdcall;
111   BBEquals(cBlob1, cBlob2): Blob; blobcall;
112     -> vrati Blob reprezentujuci -1 ak (cBlob1 == cBlob2), inak 0
114   BBGreater(cBlob1, cBlob2): Blob; blobcall;
115     -> vrati Blob reprezentujuci -1 ak (cBlob1 > cBlob2), inak 0
117   BBAdd(cBlob1, cBlob2: Blob): Blob; blobcall;
118     -> vrati novy Blob reprezentujuci (cBlob1 + cBlob2)
120   BBSubtract(cBlob1, cBlob2: Blob): Blob; blobcall;
121     -> vrati novy Blob reprezentujuci (cBlob1 - cBlob2)
123   BMultiply(cBlob1, cBlob2: Blob): Blob; stdcall;
124   BBMultiply(cBlob1, cBlob2: Blob): Blob; blobcall;
125     -> vrati novy Blob reprezentujuci (cBlob1 * cBlob2)
127   BBDivMod(CBlob1, cBlob2: Blob): (Blob, Blob, Int); blobcall;
128     -> vrati (cBlob1 / cBlob2), (cBlob1 % cBlob2) a znamienko na zasobniku
129     -> Vystupy su neoptimalizovane, nie je na ne aplikovane znamienko
131   BDivide(cBlob1, cBlob2: Blob): Blob; stdcall;
132   BBDivide(cBlob1, cBlob2: Blob): Blob; blobcall;
133     -> vrati novy Blob reprezentujuci (cBlob1 / cBlob2)
135   BModulo(cBlob1, cBlob2: Blob): Blob; stdcall;
136   BBModulo(cBlob1, cBlob2: Blob): Blob; blobcall;
137     -> vrati novy Blob reprezentujuci (cBlob1 % cBlob2)
139   BDecimalAdd16R(cBlob: Blob; cValue: Int): Blob; register;
140     -> vrati Blob reprezentujuci (cBlob + cValue) v desiatkovom zapise (BCD)
141        cBlob musi byt v desiatkovom zapise (BCD)
142        cBlob je na konci uvolneny, netreba ho teda uvolnovat
143        cValue je hodnota z intervalu 0 - 15
145   BDecimalMul16R(cBlob: Blob): Blob; register;
146     -> vrati Blob reprezentujuci (cBlob * 16) v desiatkovom zapise (BCD)
147        cBlob musi byt v desiatkovom zapise (BCD)
148        cBlob je na konci uvolneny, netreba ho teda uvolnovat
150   BIntToStr(cBlob: Blob): Blob; register;
151     -> vrati znamienkove cislo reprezentovane cBlom-om ako retazec
152        tento retazec je v ASCII zapise
154   BBPrintStr(cBlob: Blob); blobcall;
155     -> vypise cBlob ako retazec
157   BBPrintInt(cBlob: Blob); blobcall;
158     -> vypise cBlob ako znamienkove cislo
160   BBgetchr(): Blob; blobcall;
161     -> nacita Char a vrati Blob reprezentujuci tento Char
163   BBgetint(): Blob; blobcall;
164     -> nacita Int a vrati Blob reprezentujuci tento Int
166   BBoutstr(cFormatBlob, cParam1, cParam2, ... : Blob); blobcall;
167     -> formatovany vystup na obrazovku, podobny printf
168        podporovane prepinace:
169          %d -> Int
170          %s -> String
171          %% -> Percent
173   BFinalizeResult(cBlob: Int): Blob; special;
174     -> ak (cBlob == -1), tak na zasobniku vrati Blob reprezentujuci hodnotu 0
175        inak vrati na zasobniku cBlob
177   BBIsZero(cBlob: Blob): Int; blobcall;
178     -> vrati 0 ak (cBlob == 0), inak 1
180   BBTrue(): Blob; blobcall;
181     -> vrati Blob reprezentujuci TRUE (hodnota -1)
183   BBFalse(): Blob; blobcall;
184     -> vrati Blob reprezentujuci FALSE (hodnota 0)
186 Praktiky
187   Vyhradene premenne:
188     eax, ecx, edx -> Lokalne registre, mozu sa modifikovat v LUBOVOLNEJ funkcii
189     ebx, esi, edi, ebp, esp -> Funkcie musia zachovat obsah registrov
191 Calling syntax:
192   internal:
193     Pouziva sa na implementaciu vnutornych operacii
194     Pouziva registre InternalX
195     Zachovava vsetky bezne registre (eax, ecx, ...)
197   register:
198     Sluzi na male, rychle funkcie
199     Pokus o napodobnenie "register calling convention", teda:
200       Vysledok funkcie sa ulozi do registra eax
201       Prve tri parametre su v registroch eax, edx, ecx
202       Ostatne parametre su v spravnom poradi ulozene na zasobniku
203       Volana funkcia je zodpovedna za odstranenie parametrov zo zasobnika
205   stdcall:
206     Pokus o napodobenie "stdcall calling convention", teda:
207       Vysledok funkcie sa ulozi do registra eax
208       Parametre funkcie sa ukladaju na zasobnik v opacnom poradi
209       Volana funkcia je zodpovedna za odstranenie parametrov zo zasobnika
211   cdecl:
212     Pokus o napodobenie "cdecl calling convention", teda:
213       Vysledok funkcie sa ulozi do registra eax
214       Parametre funkcie sa ukladaju na zasobnik v opacnom poradi
215       Volajuci je zodpovedny za odstranenie parametrov zo zasobnika
217   blobcall:
218     Specialna volacia syntax, vhodna pre jazyk BoB
219       Vysledok funkcie sa ulozi na vrch zasobnika, ak je to Blob
220         Inak sa ulozi do registra eax
221       Parametre funkcie sa ukladaju na zasobnik v opacnom poradi
222       Na kazdy blob zadany ako parameter sa zavola BDestroy
223       Volana funkcia je zodpovedna za odstranenie parametrov zo zasobnika