nabaztag_hack_kit 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +4 -0
- data/README.md +119 -0
- data/Rakefile +21 -0
- data/bin/mtl_comp +41 -0
- data/bin/mtl_merge +22 -0
- data/bin/mtl_simu +40 -0
- data/bytecode/lib/buffer.mtl +109 -0
- data/bytecode/lib/button.mtl +27 -0
- data/bytecode/lib/data_helper.mtl +88 -0
- data/bytecode/lib/ear.mtl +90 -0
- data/bytecode/lib/led.mtl +33 -0
- data/bytecode/lib/rfid.mtl +50 -0
- data/bytecode/main.mtl +129 -0
- data/config.ru +6 -0
- data/ext/bytecode/Commands.md +172 -0
- data/ext/bytecode/Docs.md +488 -0
- data/ext/bytecode/README.md +5 -0
- data/ext/bytecode/lib/arp.mtl +159 -0
- data/ext/bytecode/lib/cfg.mtl +74 -0
- data/ext/bytecode/lib/choreos.mtl +1487 -0
- data/ext/bytecode/lib/dhcp.mtl +152 -0
- data/ext/bytecode/lib/dns.mtl +89 -0
- data/ext/bytecode/lib/http.mtl +84 -0
- data/ext/bytecode/lib/tcp.mtl +340 -0
- data/ext/bytecode/lib/udp.mtl +49 -0
- data/ext/bytecode/lib/util.mtl +74 -0
- data/ext/bytecode/lib/var.mtl +15 -0
- data/ext/bytecode/lib/wifi.mtl +243 -0
- data/ext/bytecode/nominal-ping.mtl +5828 -0
- data/ext/mtl/Makefile +42 -0
- data/ext/mtl/README.md +13 -0
- data/ext/mtl/bc.cpp +1891 -0
- data/ext/mtl/conf.bin.sans_password +0 -0
- data/ext/mtl/config.txt +5 -0
- data/ext/mtl/dumpbc.c +2566 -0
- data/ext/mtl/extconf.rb +1 -0
- data/ext/mtl/linux_simu.c +271 -0
- data/ext/mtl/linux_simuaudio.c +16 -0
- data/ext/mtl/linux_simuaudio.h +18 -0
- data/ext/mtl/linux_simunet.c +620 -0
- data/ext/mtl/linux_simunet.h +7 -0
- data/ext/mtl/log.c +297 -0
- data/ext/mtl/log.h +20 -0
- data/ext/mtl/main_compiler.cpp +104 -0
- data/ext/mtl/main_simu.cpp +221 -0
- data/ext/mtl/mp3/GTKANAL.H +97 -0
- data/ext/mtl/mp3/LAYER3.C +2090 -0
- data/ext/mtl/mp3/TABINIT.C +82 -0
- data/ext/mtl/mp3/common.c +265 -0
- data/ext/mtl/mp3/dct64_i386.c +316 -0
- data/ext/mtl/mp3/decode_i386.c +155 -0
- data/ext/mtl/mp3/huffman.h +332 -0
- data/ext/mtl/mp3/interface.c +258 -0
- data/ext/mtl/mp3/mpg123.h +182 -0
- data/ext/mtl/mp3/mpglib.h +44 -0
- data/ext/mtl/properties.c +293 -0
- data/ext/mtl/properties.h +10 -0
- data/ext/mtl/simu.c +750 -0
- data/ext/mtl/simuaudio.c +662 -0
- data/ext/mtl/simuaudio.h +74 -0
- data/ext/mtl/simunet.c +400 -0
- data/ext/mtl/simunet.h +30 -0
- data/ext/mtl/utils/correct_const.sh +34 -0
- data/ext/mtl/vaudio.c +677 -0
- data/ext/mtl/vaudio.h +46 -0
- data/ext/mtl/vbc.h +160 -0
- data/ext/mtl/vbc_str.h +166 -0
- data/ext/mtl/vcomp/Makefile +29 -0
- data/ext/mtl/vcomp/bootstrap.cpp +89 -0
- data/ext/mtl/vcomp/compiler.cpp +470 -0
- data/ext/mtl/vcomp/compiler.h +200 -0
- data/ext/mtl/vcomp/compiler_file.cpp +929 -0
- data/ext/mtl/vcomp/compiler_prog.cpp +250 -0
- data/ext/mtl/vcomp/compiler_term.cpp +1053 -0
- data/ext/mtl/vcomp/compiler_type.cpp +872 -0
- data/ext/mtl/vcomp/compiler_var.cpp +289 -0
- data/ext/mtl/vcomp/file.cpp +79 -0
- data/ext/mtl/vcomp/file.h +39 -0
- data/ext/mtl/vcomp/filesystem.h +14 -0
- data/ext/mtl/vcomp/interpreter.cpp +85 -0
- data/ext/mtl/vcomp/interpreter.h +121 -0
- data/ext/mtl/vcomp/memory.cpp +241 -0
- data/ext/mtl/vcomp/memory.h +326 -0
- data/ext/mtl/vcomp/param.h +95 -0
- data/ext/mtl/vcomp/parser.cpp +427 -0
- data/ext/mtl/vcomp/parser.h +97 -0
- data/ext/mtl/vcomp/parser_xml.cpp +124 -0
- data/ext/mtl/vcomp/prodbuffer.cpp +125 -0
- data/ext/mtl/vcomp/prodbuffer.h +42 -0
- data/ext/mtl/vcomp/resource.h +17 -0
- data/ext/mtl/vcomp/stdlib_core.cpp +122 -0
- data/ext/mtl/vcomp/terminal.cpp +73 -0
- data/ext/mtl/vcomp/terminal.h +30 -0
- data/ext/mtl/vcomp/util.cpp +48 -0
- data/ext/mtl/vcomp/util.h +31 -0
- data/ext/mtl/vinterp.c +1349 -0
- data/ext/mtl/vinterp.h +11 -0
- data/ext/mtl/vloader.c +127 -0
- data/ext/mtl/vloader.h +31 -0
- data/ext/mtl/vlog.c +589 -0
- data/ext/mtl/vlog.h +69 -0
- data/ext/mtl/vmem.c +424 -0
- data/ext/mtl/vmem.h +107 -0
- data/ext/mtl/vnet.c +255 -0
- data/ext/mtl/vnet.h +19 -0
- data/lib/nabaztag_hack_kit/message/api.rb +39 -0
- data/lib/nabaztag_hack_kit/message/helper.rb +39 -0
- data/lib/nabaztag_hack_kit/message.rb +36 -0
- data/lib/nabaztag_hack_kit/server.rb +50 -0
- data/lib/nabaztag_hack_kit/version.rb +3 -0
- data/lib/nabaztag_hack_kit.rb +4 -0
- data/nabaztag_hack_kit.gemspec +29 -0
- data/public/bytecode.bin +0 -0
- data/test/bytecode/helper.mtl +60 -0
- data/test/bytecode/native.mtl +28 -0
- data/test/bytecode/test.mtl +221 -0
- data/test/spec_helper.rb +5 -0
- data/test/unit/message_spec.rb +56 -0
- metadata +209 -0
@@ -0,0 +1,241 @@
|
|
1
|
+
//-------------------
|
2
|
+
// MV
|
3
|
+
// version WIN32 et POCKETPC
|
4
|
+
// Sylvain Huet
|
5
|
+
// Premiere version : 07/01/2003
|
6
|
+
// Derniere mise a jour : 07/01/2003
|
7
|
+
//
|
8
|
+
|
9
|
+
#include <stdio.h>
|
10
|
+
#include <string.h>
|
11
|
+
|
12
|
+
#include "param.h"
|
13
|
+
#include "terminal.h"
|
14
|
+
#include "memory.h"
|
15
|
+
#include "util.h"
|
16
|
+
#include "interpreter.h"
|
17
|
+
|
18
|
+
#define GCincPeriod 20
|
19
|
+
|
20
|
+
|
21
|
+
// Gestion de la pile
|
22
|
+
Stack::Stack()
|
23
|
+
{
|
24
|
+
base=NULL;
|
25
|
+
}
|
26
|
+
Stack::~Stack()
|
27
|
+
{
|
28
|
+
if (base) delete base;
|
29
|
+
}
|
30
|
+
|
31
|
+
void Stack::dump(FILE *f)
|
32
|
+
{
|
33
|
+
const char* buf="stck";
|
34
|
+
fwrite((void*)buf,1,4,f);
|
35
|
+
fwrite((void*)&size,1,4,f);
|
36
|
+
fwrite((void*)&pp,1,4,f);
|
37
|
+
fwrite((void*)&base,1,4,f);
|
38
|
+
fwrite((void*)base,1,4*size,f);
|
39
|
+
}
|
40
|
+
|
41
|
+
void Stack::initialize(int s)
|
42
|
+
{
|
43
|
+
size=s;
|
44
|
+
base=new int[size];
|
45
|
+
pp=base;
|
46
|
+
}
|
47
|
+
|
48
|
+
int Stack::bigger(Memory* m)
|
49
|
+
{
|
50
|
+
int currentpp=pp-base;
|
51
|
+
|
52
|
+
size*=2;
|
53
|
+
|
54
|
+
int* newbase=new int[size];
|
55
|
+
if (!newbase)
|
56
|
+
{
|
57
|
+
PRINTF(m)(LOG_RUNTIME,"Stack : out of Stack Memory\n");
|
58
|
+
AbortMetal(m,1);
|
59
|
+
return MTLERR_OM; // impossible d'augmenter la taille de la pile
|
60
|
+
}
|
61
|
+
int i; for(i=0;i<=currentpp;i++) newbase[i]=base[i];
|
62
|
+
delete base;
|
63
|
+
base=newbase;
|
64
|
+
pp=&base[currentpp];
|
65
|
+
return 0;
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
// ajout d'une racine
|
72
|
+
int Memory::addroot(int *p)
|
73
|
+
{
|
74
|
+
int k;
|
75
|
+
|
76
|
+
if (k=push(PNTTOVAL(p))) return k;
|
77
|
+
int* r=malloc(LIST_LENGTH,TYPE_TAB);
|
78
|
+
TABSET(this,r,LIST_VAL,PNTTOVAL(p));
|
79
|
+
TABSET(this,r,LIST_NEXT,root);
|
80
|
+
root=PNTTOVAL(r);
|
81
|
+
STACKDROP(this);
|
82
|
+
return 0;
|
83
|
+
}
|
84
|
+
|
85
|
+
// suppression d'une racine
|
86
|
+
void Memory::removeroot(int *p)
|
87
|
+
{
|
88
|
+
int* last=NULL; // pointeur vers le précédent maillon de la liste
|
89
|
+
int vq=root;
|
90
|
+
while(vq!=NIL)
|
91
|
+
{
|
92
|
+
int* q=VALTOPNT(vq);
|
93
|
+
if (TABGET(q,LIST_VAL)==PNTTOVAL(p))
|
94
|
+
{
|
95
|
+
if (last) TABSET(this,last,LIST_NEXT,TABGET(q,LIST_NEXT));
|
96
|
+
else root=TABGET(q,LIST_NEXT);
|
97
|
+
return;
|
98
|
+
}
|
99
|
+
last=q;
|
100
|
+
vq=TABGET(q,LIST_NEXT);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
Memory::Memory(int size,Terminal *t,FileSystem *fs)
|
105
|
+
{
|
106
|
+
term=t;
|
107
|
+
filesystem=fs;
|
108
|
+
size0=size; // on retient la taille initiale, elle sert d'ordre de grandeur
|
109
|
+
gcincperiod=GCincPeriod;
|
110
|
+
abort=0;
|
111
|
+
|
112
|
+
util=new Util(this);
|
113
|
+
winutil=NULL;
|
114
|
+
// listing();
|
115
|
+
}
|
116
|
+
|
117
|
+
Memory::~Memory()
|
118
|
+
{
|
119
|
+
// if (winutil) delete winutil;
|
120
|
+
delete util;
|
121
|
+
}
|
122
|
+
|
123
|
+
void Memory::stop()
|
124
|
+
{
|
125
|
+
abort=1;
|
126
|
+
util->stop();
|
127
|
+
root=NIL;
|
128
|
+
stack.pp=0;
|
129
|
+
}
|
130
|
+
|
131
|
+
int Memory::start()
|
132
|
+
{
|
133
|
+
root=NIL;
|
134
|
+
|
135
|
+
stack.initialize(STACK_FIRST_SIZE);
|
136
|
+
|
137
|
+
PRINTF(this)(LOG_RUNTIME,"Metal Virtual Machine\n");
|
138
|
+
PRINTF(this)(LOG_RUNTIME,"V0.2 - Sylvain Huet - 2005\n");
|
139
|
+
PRINTF(this)(LOG_RUNTIME,"--------------------------\n");
|
140
|
+
return util->start();
|
141
|
+
}
|
142
|
+
|
143
|
+
void Memory::dump()
|
144
|
+
{
|
145
|
+
}
|
146
|
+
|
147
|
+
|
148
|
+
int* Memory::malloc(int size,int type)
|
149
|
+
{
|
150
|
+
int *p=NULL;
|
151
|
+
|
152
|
+
int blocsize=size+HEADER_LENGTH;
|
153
|
+
p=new int[blocsize];
|
154
|
+
if (!p) return p;
|
155
|
+
|
156
|
+
HEADERSETSIZETYPE(p,blocsize,type);
|
157
|
+
|
158
|
+
return p;
|
159
|
+
}
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
int* Memory::mallocClear(int size)
|
164
|
+
{
|
165
|
+
int* p=malloc(size,TYPE_TAB);
|
166
|
+
if (!p) return p;
|
167
|
+
int i;
|
168
|
+
for(i=0;i<size;i++) TABSET(this,p,i,NIL);
|
169
|
+
return p;
|
170
|
+
}
|
171
|
+
|
172
|
+
// allocation de type TYPE_EXT (la fonction fun(pnt) sera appelée lors de l'oubli du bloc)
|
173
|
+
int* Memory::mallocExternal(void* pnt,FORGET fun)
|
174
|
+
{
|
175
|
+
int* p=malloc(2,TYPE_EXT);
|
176
|
+
if (!p) return p;
|
177
|
+
TABSET(this,p,0,(int)pnt);
|
178
|
+
TABSET(this,p,1,(int)fun);
|
179
|
+
return p;
|
180
|
+
}
|
181
|
+
|
182
|
+
// allocation de type TYPE_EXT (la fonction fun(pnt) sera appelée lors de l'oubli du bloc)
|
183
|
+
int Memory::pushExternal(void* pnt,FORGET fun)
|
184
|
+
{
|
185
|
+
int* p=mallocExternal(pnt,fun);
|
186
|
+
if (!p) return MTLERR_OM;
|
187
|
+
return push(PNTTOVAL(p));
|
188
|
+
}
|
189
|
+
|
190
|
+
int* Memory::storenosrc(int size)
|
191
|
+
{
|
192
|
+
// calcul de la taille d'un bloc pouvant contenir une certain nombre de caractères
|
193
|
+
// il faut 1 mot pour la taille et un octet nul final
|
194
|
+
int l=2+(size>>2);
|
195
|
+
|
196
|
+
int* p=malloc(l,TYPE_BINARY);
|
197
|
+
if (!p) return p;
|
198
|
+
STRSETLEN(p,size);
|
199
|
+
STRSTART(p)[size]=0;
|
200
|
+
return p;
|
201
|
+
}
|
202
|
+
|
203
|
+
int* Memory::storebinary(const char *src,int size)
|
204
|
+
{
|
205
|
+
// calcul de la taille d'un bloc pouvant contenir une certain nombre de caractères
|
206
|
+
// il faut 1 mot pour la taille et un octet nul final
|
207
|
+
int l=2+(size>>2);
|
208
|
+
|
209
|
+
int* p=malloc(l,TYPE_BINARY);
|
210
|
+
if (!p) return p;
|
211
|
+
STRSETLEN(p,size);
|
212
|
+
memcpy(STRSTART(p),src,size);
|
213
|
+
STRSTART(p)[size]=0;
|
214
|
+
return p;
|
215
|
+
}
|
216
|
+
|
217
|
+
int* Memory::storestring(const char *src)
|
218
|
+
{
|
219
|
+
return storebinary(src,strlen(src));
|
220
|
+
}
|
221
|
+
|
222
|
+
int Memory::deftab(int size)
|
223
|
+
{
|
224
|
+
int* p=malloc(size,TYPE_TAB);
|
225
|
+
if (!p) return MTLERR_OM;
|
226
|
+
int i; for(i=size-1;i>=0;i--) TABSET(this,p,i,STACKPULL(this));
|
227
|
+
return push(PNTTOVAL(p));
|
228
|
+
}
|
229
|
+
|
230
|
+
const char* Memory::errorname(int err)
|
231
|
+
{
|
232
|
+
if (err==MTLERR_OM) return "Out of memory";
|
233
|
+
else if (err==MTLERR_OP) return "Unknown Operand";
|
234
|
+
else if (err==MTLERR_DIV) return "Division by zero";
|
235
|
+
else if (err==MTLERR_RET) return "Bad implementation on 'return'";
|
236
|
+
else if (err==MTLERR_NOFUN) return "No function defined";
|
237
|
+
else if (err==MTLERR_SN) return "Syntax error";
|
238
|
+
else if (err==MTLERR_TYPE) return "Typechecking error";
|
239
|
+
else if (err==MTLERR_ABORT) return "Application aborted";
|
240
|
+
else return "Unknown error";
|
241
|
+
}
|
@@ -0,0 +1,326 @@
|
|
1
|
+
//-------------------
|
2
|
+
// MV
|
3
|
+
// version WIN32 et POCKETPC
|
4
|
+
// Sylvain Huet
|
5
|
+
// Premiere version : 07/01/2003
|
6
|
+
// Derniere mise a jour : 07/01/2003
|
7
|
+
//
|
8
|
+
|
9
|
+
#ifndef _MEMORY_
|
10
|
+
#define _MEMORY_
|
11
|
+
|
12
|
+
// commenter pour utiliser les fonctions d'allocatio m�moire du C++
|
13
|
+
//#define _MY_MALLOC_
|
14
|
+
|
15
|
+
class Terminal;
|
16
|
+
class Memory;
|
17
|
+
class FileSystem;
|
18
|
+
class Prodbuffer;
|
19
|
+
|
20
|
+
#define HEADER_LENGTH 3
|
21
|
+
#define HEADER_SIZETYPE 0 // la taille contient le header
|
22
|
+
|
23
|
+
|
24
|
+
#define HEADER_TYPE(p) ((p)[HEADER_SIZETYPE]&3)
|
25
|
+
#define HEADER_SIZE(p) ((p)[HEADER_SIZETYPE]>>2)
|
26
|
+
#define HEADERSETSIZETYPE(p,size,type) ((p)[HEADER_SIZETYPE]=(size<<2)+(type&3))
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
#define STACK_FIRST_SIZE 128
|
31
|
+
class Memory;
|
32
|
+
class FileSystem;
|
33
|
+
class Util;
|
34
|
+
class Winutil;
|
35
|
+
|
36
|
+
class Stack
|
37
|
+
{
|
38
|
+
private:
|
39
|
+
public:
|
40
|
+
Stack();
|
41
|
+
~Stack();
|
42
|
+
int size; // taille du bloc allou�
|
43
|
+
int* base; // d�but de la pile
|
44
|
+
int* pp; // pointeur de pile
|
45
|
+
|
46
|
+
void initialize(int s);
|
47
|
+
int bigger(Memory* m);
|
48
|
+
void dump(FILE* f);
|
49
|
+
};
|
50
|
+
|
51
|
+
typedef void (*FORGET)(Memory*, void*);
|
52
|
+
|
53
|
+
|
54
|
+
class Memory
|
55
|
+
{
|
56
|
+
private:
|
57
|
+
|
58
|
+
// gestion du GC
|
59
|
+
int root; // bloc racine (initialis� avec le premier bloc allou�)
|
60
|
+
|
61
|
+
int size0;
|
62
|
+
|
63
|
+
public:
|
64
|
+
int gcincperiod;
|
65
|
+
int abort;
|
66
|
+
// stack courante
|
67
|
+
Stack stack;
|
68
|
+
Terminal* term;
|
69
|
+
FileSystem* filesystem;
|
70
|
+
Util *util;
|
71
|
+
Winutil *winutil;
|
72
|
+
Memory(int size,Terminal *t,FileSystem *fs);
|
73
|
+
~Memory();
|
74
|
+
|
75
|
+
int start();
|
76
|
+
void stop();
|
77
|
+
|
78
|
+
int addroot(int* p);
|
79
|
+
void removeroot(int *p);
|
80
|
+
|
81
|
+
int* malloc(int size,int type); // allocation (type vaut TYPE_BINARY ou TYPE_TAB)
|
82
|
+
int* mallocClear(int size); // allocation de type TYPE_TAB avec initialisation � NIL
|
83
|
+
int* mallocExternal(void* pnt,FORGET fun); // allocation de type TYPE_EXT (la fonction fun(pnt) sera appel�e lors de l'oubli du bloc)
|
84
|
+
int pushmalloc(int size,int type); // allocation (type vaut TYPE_BINARY ou TYPE_TAB)
|
85
|
+
int pushmallocClear(int size); // allocation de type TYPE_TAB avec initialisation � NIL
|
86
|
+
int pushExternal(void* pnt,FORGET fun);
|
87
|
+
|
88
|
+
int push(int val);
|
89
|
+
void tabset(int* p,int i,int val);
|
90
|
+
void stackset(int* p,int val);
|
91
|
+
|
92
|
+
|
93
|
+
int* storestring(const char* src);
|
94
|
+
int* storebinary(const char* src,int size);
|
95
|
+
int* storenosrc(int size);
|
96
|
+
int pushstring(const char* src);
|
97
|
+
int pushbinary(const char* src,int size);
|
98
|
+
int pushnosrc(int size);
|
99
|
+
int pushpnt(void* pnt);
|
100
|
+
|
101
|
+
int deftab(int size);
|
102
|
+
|
103
|
+
void listing();
|
104
|
+
const char* errorname(int err);
|
105
|
+
void dump();
|
106
|
+
};
|
107
|
+
|
108
|
+
// structures en m�moire
|
109
|
+
|
110
|
+
// structure d'une r�f�rence
|
111
|
+
#define REF_LENGTH 10
|
112
|
+
#define REF_NAME 0 // nom de la r�f�rence
|
113
|
+
#define REF_VAL 1 // valeur de la r�f�rence
|
114
|
+
#define REF_CODE 2 // >=0 nb d'arguments de la fonction, sinon voir CODE_*
|
115
|
+
#define REF_TYPE 3 // graphe de type de la r�f�rence
|
116
|
+
#define REF_NEXT 4 // suivant dans la table de hachage
|
117
|
+
#define REF_NEXTALL 5 // suivant dans la liste globale du package
|
118
|
+
#define REF_PACKAGE 6
|
119
|
+
|
120
|
+
//// les champs suivants ne sont - pour l'instant - remplis que pour
|
121
|
+
//// les CODE_VAR et les CODE_CONST
|
122
|
+
#define REF_USED 7 // 0 au debut, 1 de plus � chaque fois que la
|
123
|
+
// r�f�rence est utilis�e
|
124
|
+
#define REF_SET 8 // pour les var. 0 si la var ne re�oit jamais de
|
125
|
+
// valeur, 1 si elle a seulement une valeur
|
126
|
+
// donn�e � la d�claration, et 2 si elle est
|
127
|
+
// 'set'-�e dans le programme
|
128
|
+
#define REF_USED_IN_IFDEF 9 // 0 au d�but, 1 de plus � chaque fois que
|
129
|
+
// la ref est utlis�e comme condition dans
|
130
|
+
// un ifdef
|
131
|
+
|
132
|
+
#define CODE_TYPE -1 // type
|
133
|
+
#define CODE_VAR -2 // variable
|
134
|
+
#define CODE_SUM -3 // type somme
|
135
|
+
#define CODE_STRUCT -4 // type struct
|
136
|
+
#define CODE_EMPTYTYPE -5 // type pr�-d�fini
|
137
|
+
#define CODE_FIELD -6 // champ de structure
|
138
|
+
#define CODE_CONS -7 // constructeur de type somme
|
139
|
+
#define CODE_CONS0 -8 // constructeur de type somme sans valeur
|
140
|
+
#define CODE_CONST -9 // valeur constante
|
141
|
+
|
142
|
+
|
143
|
+
// structure de lien d'un champ vers le type
|
144
|
+
#define FIELD_LENGTH 2
|
145
|
+
#define FIELD_NUM 0 // num�ro du champ
|
146
|
+
#define FIELD_TYPE 1 // pointeur vers la r�f�rence du type (contient le nombre de champs de la structure)
|
147
|
+
|
148
|
+
// structure d'une fonction
|
149
|
+
#define FUN_LENGTH 6
|
150
|
+
#define FUN_NBARGS 0 // nb arguments de la fonction
|
151
|
+
#define FUN_NBLOCALS 1 // nb locals+args de la fonction
|
152
|
+
#define FUN_BC 2 // bytecode
|
153
|
+
#define FUN_REF 3 // table des r�f�rences globales
|
154
|
+
#define FUN_SUPPARGS 4 // liste des arguments attach�s
|
155
|
+
#define FUN_REFERENCE 5 // pointeur vers la r�f�rence de la fonction
|
156
|
+
|
157
|
+
// structure d'une liste
|
158
|
+
#define LIST_LENGTH 2
|
159
|
+
#define LIST_VAL 0
|
160
|
+
#define LIST_NEXT 1
|
161
|
+
|
162
|
+
// structure de type
|
163
|
+
#define TYPEHEADER_LENGTH 3
|
164
|
+
#define TYPEHEADER_CODE 0 // entier TYPENAME_*
|
165
|
+
#define TYPEHEADER_ACTUAL 1
|
166
|
+
#define TYPEHEADER_COPY 2
|
167
|
+
|
168
|
+
|
169
|
+
#define TYPENAME_UNDEF 0
|
170
|
+
#define TYPENAME_FUN 1
|
171
|
+
#define TYPENAME_LIST 2
|
172
|
+
#define TYPENAME_TUPLE 3
|
173
|
+
#define TYPENAME_TAB 4
|
174
|
+
#define TYPENAME_WEAK 5
|
175
|
+
#define TYPENAME_CORE 6
|
176
|
+
#define TYPENAME_REC 7
|
177
|
+
|
178
|
+
// structure d'un package
|
179
|
+
#define PACK_LENGTH 3
|
180
|
+
#define PACK_NAME 0
|
181
|
+
#define PACK_HACH 1
|
182
|
+
#define PACK_NEXT 2
|
183
|
+
|
184
|
+
|
185
|
+
void AbortMetal(Memory* m,int donotstop);
|
186
|
+
|
187
|
+
// defines publics
|
188
|
+
|
189
|
+
#define PRINTF(m) ((m)->term->printf)
|
190
|
+
|
191
|
+
#define TYPE_BINARY 0 // type binaire pour allocation
|
192
|
+
#define TYPE_TAB 1 // type table pour allocation
|
193
|
+
#define TYPE_EXT 2 // type externe pour allocation
|
194
|
+
|
195
|
+
#define PNTTOVAL(p) (1+((int)(p))) // conversion pointeur vers mot metal
|
196
|
+
#define INTTOVAL(i) ((i)<<1) // conversion entier vers mot metal
|
197
|
+
#define FLOATTOVAL(v) ((~1)&(*(int*)(&(v)))) // conversion flottant vers mot metal
|
198
|
+
|
199
|
+
#define VALTOPNT(v) ((int*)((v)-1)) // conversion mot metal vers pointeur
|
200
|
+
#define VALTOINT(v) ((v)>>1) // conversion mot metal vers entier
|
201
|
+
#define VALTOFLOAT(v) (*((mtl_float*)(&(v)))) // conversion mot metal vers flottant
|
202
|
+
|
203
|
+
#define NIL (1) // nil
|
204
|
+
#define ISVALPNT(v) ((v)&1) // teste si un mot metal est un pointeur
|
205
|
+
|
206
|
+
#define MALLOC(m,size,type) (m->malloc(size,type)) // allocation d'un bloc
|
207
|
+
#define MALLOCCLEAR(m,size) (m->mallocClear(size)) // allocation d'un bloc de type table, initialis� � nil
|
208
|
+
#define MALLOCEXT(m,pnt,fun) (m->mallocExternal(pnt,fun)) // allocation de type TYPE_EXT (la fonction fun(pnt) sera appel�e lors de l'oubli du bloc)
|
209
|
+
#define MALLOCBIN(m,size) (m->malloc(((size)+3)>>2,TYPE_BINARY)) // allocation de type TYPE_BINARY en sp�cifiant la taille en octets
|
210
|
+
|
211
|
+
#define PUSHMALLOC(m,size,type) (m->pushmalloc(size,type)) // allocation d'un bloc
|
212
|
+
#define PUSHMALLOCCLEAR(m,size) (m->pushmallocClear(size)) // allocation d'un bloc de type table, initialis� � nil
|
213
|
+
#define PUSHMALLOCBIN(m,size) (m->pushmalloc(((size)+3)>>2,TYPE_BINARY)) // allocation de type TYPE_BINARY en sp�cifiant la taille en octets
|
214
|
+
#define PUSHPNT(m,pnt) (m->pushpnt(pnt)) // allocation de type TYPE_BINARY pour stocker un pointeur
|
215
|
+
|
216
|
+
#define EXTPUSH(m,pnt,fun) (m->pushExternal(pnt,fun)) // allocation de type TYPE_EXT (la fonction fun(pnt) sera appel�e lors de l'oubli du bloc)
|
217
|
+
#define EXTFORGET(p) (p[HEADER_LENGTH]=p[HEADER_LENGTH+1]=0) // supprime les r�f�rences d'un type externe
|
218
|
+
#define EXTVAL(p) ((void*)(p)[HEADER_LENGTH]) // retourne l'objet externe
|
219
|
+
#define TABSET(m,p,i,val) (m->tabset(p,i,val)) // r�gle une valeur d'une table
|
220
|
+
#define TABGET(p,i) (p[HEADER_LENGTH+(i)]) // lit une valeur d'une table
|
221
|
+
#define TABSTART(p) (&p[HEADER_LENGTH]) // pointeur vers la premi�re case d'une table
|
222
|
+
#define TABLEN(p) (HEADER_SIZE(p)-HEADER_LENGTH) // taille de la table
|
223
|
+
#define BINSTART(p) (&p[HEADER_LENGTH]) // pointeur vers le d�but d'un bloc binaire
|
224
|
+
|
225
|
+
#define STACKGET(m,i) ((m)->stack.pp[-(i)]) // retourne le n-ieme �l�ment de la pile
|
226
|
+
#define STACKSET(m,i,val) ((m)->stackset(&(m)->stack.pp[-(i)],val)) // r�gle le n-ieme �l�ment de la pile
|
227
|
+
#define STACKPULL(m) (*(m)->stack.pp--) // d�pile un �l�ment de la pile
|
228
|
+
#define STACKDROP(m) ((m)->stack.pp--) // supprime 1 �l�ment de la pile
|
229
|
+
#define STACKDROPN(m,n) ((m)->stack.pp-=(n)) // supprime n �l�ments de la pile
|
230
|
+
#define STACKPUSH(m,val) ((m)->push(val)) // empile un nouvel �l�ment (retourne non nul si out of memory)
|
231
|
+
|
232
|
+
#define STACKREF(m) ((m)->stack.pp-(m)->stack.base) // retourne une r�f�rence correspondant � la taille actuelle de la pile
|
233
|
+
#define STACKRESTOREREF(m,size) ((m)->stack.pp=(m)->stack.base+size) // red�finit la taille de la pile en fonction de la r�f�rence
|
234
|
+
#define STACKGETFROMREF(m,size,i) ((m)->stack.base[(size)-(i)]) // lit le n-ieme �l�ment � partir d'une r�f�rence
|
235
|
+
#define STACKSETFROMREF(m,size,i,val) ((m)->stackset(&(m)->stack.base[(size)-(i)],val)) // r�gle le l-ieme �l�ment � partir d'une r�f�rence
|
236
|
+
|
237
|
+
#define STRSTART(p) ((char*)&p[HEADER_LENGTH+1]) // retourne le d�but d'une cha�ne
|
238
|
+
#define STRLEN(p) (p[HEADER_LENGTH]) // retourne la longueur d'une cha�ne
|
239
|
+
#define STRSETLEN(p,size) (p[HEADER_LENGTH]=(size)) // d�finit la longueur de la cha�ne
|
240
|
+
#define STRSTORE(m,src) (m->storestring(src)) // stocke une cha�ne
|
241
|
+
#define STRSTOREBINARY(m,src,size) (m->storebinary(src,size)) // stocke un buffer binaire
|
242
|
+
#define STRSTORENOSRC(m,size) (m->storenosrc(size)) // stocke un buffer binaire
|
243
|
+
|
244
|
+
#define STRPUSH(m,src) (m->pushstring(src)) // stocke une cha�ne
|
245
|
+
#define STRPUSHBINARY(m,src,size) (m->pushbinary(src,size)) // stocke un buffer binaire
|
246
|
+
#define STRPUSHNOSRC(m,size) (m->pushnosrc(size)) // stocke un buffer binaire
|
247
|
+
|
248
|
+
#define DEFTAB(m,size) (m->deftab(size)) // cr�e un tuple avec les �l�ments dans la pile et empile le tuple
|
249
|
+
|
250
|
+
|
251
|
+
#define MTLERR_ENDINTERPRETER 1
|
252
|
+
#define MTLERR_OM -1
|
253
|
+
#define MTLERR_OP -2
|
254
|
+
#define MTLERR_DIV -3
|
255
|
+
#define MTLERR_RET -4
|
256
|
+
#define MTLERR_NOFUN -5
|
257
|
+
#define MTLERR_SN -6
|
258
|
+
#define MTLERR_TYPE -7
|
259
|
+
#define MTLERR_ABORT -8
|
260
|
+
|
261
|
+
#define LOG_RUNTIME 1
|
262
|
+
#define LOG_WARNING 2
|
263
|
+
#define LOG_DEVCORE 4
|
264
|
+
#define LOG_COMPILER 8
|
265
|
+
#define LOG_USER 16
|
266
|
+
|
267
|
+
inline int Memory::push(int val)
|
268
|
+
{
|
269
|
+
*(++stack.pp)=val;
|
270
|
+
if ((stack.pp-stack.base)>=stack.size-1)
|
271
|
+
{
|
272
|
+
int k; if ((k=stack.bigger(this))) return k;
|
273
|
+
// term->printf(LOG_DEVCORE,"## bigger stack %d\n",stack.size);
|
274
|
+
// stackprint(0);
|
275
|
+
}
|
276
|
+
return 0;
|
277
|
+
}
|
278
|
+
|
279
|
+
inline void Memory::tabset(int* p,int i,int val)
|
280
|
+
{
|
281
|
+
p[HEADER_LENGTH+i]=val; // r�gle une valeur d'une table
|
282
|
+
}
|
283
|
+
|
284
|
+
inline void Memory::stackset(int* p,int val)
|
285
|
+
{
|
286
|
+
*p=val;
|
287
|
+
}
|
288
|
+
|
289
|
+
inline int Memory::pushmalloc(int size,int type)
|
290
|
+
{
|
291
|
+
int* p=malloc(size,type); if (!p) return MTLERR_OM;
|
292
|
+
return push(PNTTOVAL(p));
|
293
|
+
}
|
294
|
+
|
295
|
+
inline int Memory::pushmallocClear(int size)
|
296
|
+
{
|
297
|
+
int* p=mallocClear(size); if (!p) return MTLERR_OM;
|
298
|
+
return push(PNTTOVAL(p));
|
299
|
+
}
|
300
|
+
|
301
|
+
inline int Memory::pushstring(const char* src)
|
302
|
+
{
|
303
|
+
int* p=storestring(src); if (!p) return MTLERR_OM;
|
304
|
+
return push(PNTTOVAL(p));
|
305
|
+
}
|
306
|
+
|
307
|
+
inline int Memory::pushbinary(const char* src,int size)
|
308
|
+
{
|
309
|
+
int* p=storebinary(src,size); if (!p) return MTLERR_OM;
|
310
|
+
return push(PNTTOVAL(p));
|
311
|
+
}
|
312
|
+
|
313
|
+
inline int Memory::pushnosrc(int size)
|
314
|
+
{
|
315
|
+
int* p=storenosrc(size); if (!p) return MTLERR_OM;
|
316
|
+
return push(PNTTOVAL(p));
|
317
|
+
}
|
318
|
+
|
319
|
+
inline int Memory::pushpnt(void* pnt)
|
320
|
+
{
|
321
|
+
int* p=malloc(1,TYPE_BINARY); if (!p) return MTLERR_OM;
|
322
|
+
*(BINSTART(p))=(int)pnt;
|
323
|
+
return push(PNTTOVAL(p));
|
324
|
+
}
|
325
|
+
|
326
|
+
#endif
|
@@ -0,0 +1,95 @@
|
|
1
|
+
//-------------------
|
2
|
+
// MV
|
3
|
+
// version WIN32 et POCKETPC
|
4
|
+
// Sylvain Huet
|
5
|
+
// Premiere version : 07/01/2003
|
6
|
+
// Derniere mise a jour : 07/01/2003
|
7
|
+
//
|
8
|
+
#ifndef _PARAM_
|
9
|
+
#define _PARAM_
|
10
|
+
|
11
|
+
|
12
|
+
#define VLSB
|
13
|
+
|
14
|
+
//-------------------
|
15
|
+
// Parametres du benchmark
|
16
|
+
|
17
|
+
//++++++++
|
18
|
+
//Plateforme : commenter pour la version win32, decommenter pour la version pocketpc
|
19
|
+
//#define POCKETPC
|
20
|
+
|
21
|
+
//++++++++
|
22
|
+
//Precision des flottant : decommenter une des deux lignes
|
23
|
+
|
24
|
+
//#define myfloat double
|
25
|
+
#define mtl_float float
|
26
|
+
|
27
|
+
//++++++++
|
28
|
+
//Resolution de l'image : commenter pour utiliser des bmp 24 bits,
|
29
|
+
// decommenter pour avoir des bmp 32 bits (impossible sur pocketpc ipaq 3630
|
30
|
+
|
31
|
+
#define MODEBMP32
|
32
|
+
|
33
|
+
|
34
|
+
// Fin des parametres du benchmark
|
35
|
+
//-------------------
|
36
|
+
|
37
|
+
#ifdef POCKETPC
|
38
|
+
|
39
|
+
#define FlagMainWindow (WS_VISIBLE)
|
40
|
+
#define UNICODEDISPLAY
|
41
|
+
#define UNICODEFILENAME
|
42
|
+
|
43
|
+
#else
|
44
|
+
|
45
|
+
#define FlagMainWindow (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX)
|
46
|
+
|
47
|
+
#endif
|
48
|
+
|
49
|
+
#ifdef MODEBMP32
|
50
|
+
#define BMPINC 4
|
51
|
+
#else
|
52
|
+
#define BMPINC 3
|
53
|
+
#endif
|
54
|
+
|
55
|
+
typedef unsigned char uchar;
|
56
|
+
|
57
|
+
#ifdef UNICODEDISPLAY
|
58
|
+
#define display_type unsigned short
|
59
|
+
#define display_strlen wcslen
|
60
|
+
#define display_copyfromchar(dst,src) wsprintf(dst,TEXT("%S"),src)
|
61
|
+
#define display_copy(dst,src) wcscpy(dst,src)
|
62
|
+
#else
|
63
|
+
#define display_type char
|
64
|
+
#define display_strlen strlen
|
65
|
+
#define display_copyfromchar(dst,src) strcpy(dst,src)
|
66
|
+
#define display_copy(dst,src) strcpy(dst,src)
|
67
|
+
#endif
|
68
|
+
|
69
|
+
#ifdef UNICODEFILENAME
|
70
|
+
#define filename_type unsigned short
|
71
|
+
#define filename_strlen wcslen
|
72
|
+
#define filename_copyfromchar(dst,src) wsprintf(dst,TEXT("%S"),src)
|
73
|
+
#define filename_copy(dst,src) wcscpy(dst,src)
|
74
|
+
#define filename_copyn(dst,src,n) {wcsncpy(dst,src,n);(dst)[n]=0;}
|
75
|
+
#define filename_strcmp(s1,s2) wcscmp(s1,s2)
|
76
|
+
#define filename_strncmp(s1,s2,n) wcsncmp(s1,s2,n)
|
77
|
+
#define filename_mkdir(d) _wmkdir(d)
|
78
|
+
#else
|
79
|
+
#define filename_type char
|
80
|
+
#define filename_strlen strlen
|
81
|
+
#define filename_copyfromchar(dst,src) strcpy(dst,src)
|
82
|
+
#define filename_copy(dst,src) strcpy(dst,src)
|
83
|
+
#define filename_copyn(dst,src,n) {strncpy(dst,src,n);(dst)[n]=0;}
|
84
|
+
#define filename_strcmp(s1,s2) strcmp(s1,s2)
|
85
|
+
#define filename_strncmp(s1,s2,n) strncmp(s1,s2,n)
|
86
|
+
#define filename_mkdir(d) _mkdir(d)
|
87
|
+
|
88
|
+
#endif
|
89
|
+
|
90
|
+
//#define API_PUB __declspec(dllexport)
|
91
|
+
#define API_PUB
|
92
|
+
|
93
|
+
|
94
|
+
#endif
|
95
|
+
|