nabaztag_hack_kit 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +11 -0
  4. data/Gemfile +4 -0
  5. data/README.md +119 -0
  6. data/Rakefile +21 -0
  7. data/bin/mtl_comp +41 -0
  8. data/bin/mtl_merge +22 -0
  9. data/bin/mtl_simu +40 -0
  10. data/bytecode/lib/buffer.mtl +109 -0
  11. data/bytecode/lib/button.mtl +27 -0
  12. data/bytecode/lib/data_helper.mtl +88 -0
  13. data/bytecode/lib/ear.mtl +90 -0
  14. data/bytecode/lib/led.mtl +33 -0
  15. data/bytecode/lib/rfid.mtl +50 -0
  16. data/bytecode/main.mtl +129 -0
  17. data/config.ru +6 -0
  18. data/ext/bytecode/Commands.md +172 -0
  19. data/ext/bytecode/Docs.md +488 -0
  20. data/ext/bytecode/README.md +5 -0
  21. data/ext/bytecode/lib/arp.mtl +159 -0
  22. data/ext/bytecode/lib/cfg.mtl +74 -0
  23. data/ext/bytecode/lib/choreos.mtl +1487 -0
  24. data/ext/bytecode/lib/dhcp.mtl +152 -0
  25. data/ext/bytecode/lib/dns.mtl +89 -0
  26. data/ext/bytecode/lib/http.mtl +84 -0
  27. data/ext/bytecode/lib/tcp.mtl +340 -0
  28. data/ext/bytecode/lib/udp.mtl +49 -0
  29. data/ext/bytecode/lib/util.mtl +74 -0
  30. data/ext/bytecode/lib/var.mtl +15 -0
  31. data/ext/bytecode/lib/wifi.mtl +243 -0
  32. data/ext/bytecode/nominal-ping.mtl +5828 -0
  33. data/ext/mtl/Makefile +42 -0
  34. data/ext/mtl/README.md +13 -0
  35. data/ext/mtl/bc.cpp +1891 -0
  36. data/ext/mtl/conf.bin.sans_password +0 -0
  37. data/ext/mtl/config.txt +5 -0
  38. data/ext/mtl/dumpbc.c +2566 -0
  39. data/ext/mtl/extconf.rb +1 -0
  40. data/ext/mtl/linux_simu.c +271 -0
  41. data/ext/mtl/linux_simuaudio.c +16 -0
  42. data/ext/mtl/linux_simuaudio.h +18 -0
  43. data/ext/mtl/linux_simunet.c +620 -0
  44. data/ext/mtl/linux_simunet.h +7 -0
  45. data/ext/mtl/log.c +297 -0
  46. data/ext/mtl/log.h +20 -0
  47. data/ext/mtl/main_compiler.cpp +104 -0
  48. data/ext/mtl/main_simu.cpp +221 -0
  49. data/ext/mtl/mp3/GTKANAL.H +97 -0
  50. data/ext/mtl/mp3/LAYER3.C +2090 -0
  51. data/ext/mtl/mp3/TABINIT.C +82 -0
  52. data/ext/mtl/mp3/common.c +265 -0
  53. data/ext/mtl/mp3/dct64_i386.c +316 -0
  54. data/ext/mtl/mp3/decode_i386.c +155 -0
  55. data/ext/mtl/mp3/huffman.h +332 -0
  56. data/ext/mtl/mp3/interface.c +258 -0
  57. data/ext/mtl/mp3/mpg123.h +182 -0
  58. data/ext/mtl/mp3/mpglib.h +44 -0
  59. data/ext/mtl/properties.c +293 -0
  60. data/ext/mtl/properties.h +10 -0
  61. data/ext/mtl/simu.c +750 -0
  62. data/ext/mtl/simuaudio.c +662 -0
  63. data/ext/mtl/simuaudio.h +74 -0
  64. data/ext/mtl/simunet.c +400 -0
  65. data/ext/mtl/simunet.h +30 -0
  66. data/ext/mtl/utils/correct_const.sh +34 -0
  67. data/ext/mtl/vaudio.c +677 -0
  68. data/ext/mtl/vaudio.h +46 -0
  69. data/ext/mtl/vbc.h +160 -0
  70. data/ext/mtl/vbc_str.h +166 -0
  71. data/ext/mtl/vcomp/Makefile +29 -0
  72. data/ext/mtl/vcomp/bootstrap.cpp +89 -0
  73. data/ext/mtl/vcomp/compiler.cpp +470 -0
  74. data/ext/mtl/vcomp/compiler.h +200 -0
  75. data/ext/mtl/vcomp/compiler_file.cpp +929 -0
  76. data/ext/mtl/vcomp/compiler_prog.cpp +250 -0
  77. data/ext/mtl/vcomp/compiler_term.cpp +1053 -0
  78. data/ext/mtl/vcomp/compiler_type.cpp +872 -0
  79. data/ext/mtl/vcomp/compiler_var.cpp +289 -0
  80. data/ext/mtl/vcomp/file.cpp +79 -0
  81. data/ext/mtl/vcomp/file.h +39 -0
  82. data/ext/mtl/vcomp/filesystem.h +14 -0
  83. data/ext/mtl/vcomp/interpreter.cpp +85 -0
  84. data/ext/mtl/vcomp/interpreter.h +121 -0
  85. data/ext/mtl/vcomp/memory.cpp +241 -0
  86. data/ext/mtl/vcomp/memory.h +326 -0
  87. data/ext/mtl/vcomp/param.h +95 -0
  88. data/ext/mtl/vcomp/parser.cpp +427 -0
  89. data/ext/mtl/vcomp/parser.h +97 -0
  90. data/ext/mtl/vcomp/parser_xml.cpp +124 -0
  91. data/ext/mtl/vcomp/prodbuffer.cpp +125 -0
  92. data/ext/mtl/vcomp/prodbuffer.h +42 -0
  93. data/ext/mtl/vcomp/resource.h +17 -0
  94. data/ext/mtl/vcomp/stdlib_core.cpp +122 -0
  95. data/ext/mtl/vcomp/terminal.cpp +73 -0
  96. data/ext/mtl/vcomp/terminal.h +30 -0
  97. data/ext/mtl/vcomp/util.cpp +48 -0
  98. data/ext/mtl/vcomp/util.h +31 -0
  99. data/ext/mtl/vinterp.c +1349 -0
  100. data/ext/mtl/vinterp.h +11 -0
  101. data/ext/mtl/vloader.c +127 -0
  102. data/ext/mtl/vloader.h +31 -0
  103. data/ext/mtl/vlog.c +589 -0
  104. data/ext/mtl/vlog.h +69 -0
  105. data/ext/mtl/vmem.c +424 -0
  106. data/ext/mtl/vmem.h +107 -0
  107. data/ext/mtl/vnet.c +255 -0
  108. data/ext/mtl/vnet.h +19 -0
  109. data/lib/nabaztag_hack_kit/message/api.rb +39 -0
  110. data/lib/nabaztag_hack_kit/message/helper.rb +39 -0
  111. data/lib/nabaztag_hack_kit/message.rb +36 -0
  112. data/lib/nabaztag_hack_kit/server.rb +50 -0
  113. data/lib/nabaztag_hack_kit/version.rb +3 -0
  114. data/lib/nabaztag_hack_kit.rb +4 -0
  115. data/nabaztag_hack_kit.gemspec +29 -0
  116. data/public/bytecode.bin +0 -0
  117. data/test/bytecode/helper.mtl +60 -0
  118. data/test/bytecode/native.mtl +28 -0
  119. data/test/bytecode/test.mtl +221 -0
  120. data/test/spec_helper.rb +5 -0
  121. data/test/unit/message_spec.rb +56 -0
  122. metadata +209 -0
@@ -0,0 +1,872 @@
1
+ //-------------------
2
+ // MV
3
+ // version WIN32 et POCKETPC
4
+ // Sylvain Huet
5
+ // Derniere mise a jour : 07/01/2003
6
+ //
7
+
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+
11
+ #include "param.h"
12
+ #include "terminal.h"
13
+ #include "memory.h"
14
+ #include "parser.h"
15
+ #include "prodbuffer.h"
16
+ #include "compiler.h"
17
+
18
+ // types
19
+
20
+ // cr�ation d'un noeud de type basique (�ventuellement param�trique)
21
+ int Compiler::createnodetypecore(const char* name)
22
+ {
23
+ int k;
24
+
25
+ int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+2);
26
+ if (!p) return MTLERR_OM;
27
+ if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
28
+
29
+ if (k=STRPUSH(m,name)) return k;
30
+
31
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_CORE));
32
+ TABSET(m,p,TYPEHEADER_LENGTH+1,STACKPULL(m));
33
+ return 0;
34
+ }
35
+
36
+ // cr�ation d'un noeud de type basique (�ventuellement param�trique)
37
+ int Compiler::createnodetypecore(int name)
38
+ {
39
+ int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+2);
40
+ if (!p) return MTLERR_OM;
41
+ if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
42
+
43
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_CORE));
44
+ TABSET(m,p,TYPEHEADER_LENGTH+1,name);
45
+ return 0;
46
+ }
47
+
48
+ // cr�ation d'un noeud de type non basique
49
+ int Compiler::createnodetype(int type)
50
+ {
51
+ int size=0;
52
+ if ((type==TYPENAME_UNDEF)||(type==TYPENAME_WEAK)) size=0;
53
+ if ((type==TYPENAME_LIST)||(type==TYPENAME_TAB)||(type==TYPENAME_REC)) size=1;
54
+ if (type==TYPENAME_FUN) size=2;
55
+
56
+ int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
57
+ if (!p) return MTLERR_OM;
58
+ if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
59
+
60
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(type));
61
+ return 0;
62
+ }
63
+
64
+ // cr�ation d'un noeud de type tuple (n �l�ments empil�s)
65
+ // empile le r�sultat
66
+ int Compiler::createnodetuple(int size)
67
+ {
68
+ int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
69
+ if (!p) return MTLERR_OM;
70
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_TUPLE));
71
+ int i; for(i=size-1;i>=0;i--) TABSET(m,p,TYPEHEADER_LENGTH+i,STACKPULL(m));
72
+ if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
73
+ return 0;
74
+ }
75
+
76
+ // cr�ation d'un noeud de type tuple dans la compilation de valeurs (n �l�ments empil�s au rangs 0, 2, 4, 2n-2)
77
+ // empile le r�sultat, sans d�piler les valeurs du tuple
78
+ int Compiler::createnodetupleval(int size)
79
+ {
80
+ int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
81
+ if (!p) return MTLERR_OM;
82
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_TUPLE));
83
+ int i; for(i=size-1;i>=0;i--) TABSET(m,p,TYPEHEADER_LENGTH+i,STACKGET(m,2*(size-1-i)));
84
+ if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
85
+ return 0;
86
+ }
87
+
88
+ // trouve le type �quivalent
89
+ int* Compiler::actualtype(int* p)
90
+ {
91
+ int vp=TABGET(p,TYPEHEADER_ACTUAL);
92
+ if (vp!=NIL) return actualtype(VALTOPNT(vp));
93
+ return p;
94
+ }
95
+
96
+ // production d'un type
97
+ int Compiler::parsegraph(Parser* p,int env,int mono,int rec,int labels,int newvars,int* rnode)
98
+ {
99
+ int k,n;
100
+
101
+ if (!p->next(0))
102
+ {
103
+ PRINTF(m)(LOG_RUNTIME,"Compiler : uncomplete type reaches EOF\n");
104
+ return MTLERR_SN;
105
+ }
106
+
107
+ int val;
108
+ if (!searchlabel_byname(labels,p->token,&val,NULL)) return STACKPUSH(m,val);
109
+ if ((p->token[0]=='w')&&(isdecimal(p->token+1)))
110
+ {
111
+ if (k=createnodetype(TYPENAME_WEAK)) return k;
112
+ return addlabel(labels,p->token,STACKGET(m,0),NIL);
113
+ }
114
+ if (!strcmp(p->token,"_"))
115
+ {
116
+ return createnodetype(TYPENAME_WEAK);
117
+ }
118
+ if ((p->token[0]=='u')&&(isdecimal(p->token+1)))
119
+ {
120
+ if (mono)
121
+ {
122
+ PRINTF(m)(LOG_RUNTIME,"Compiler : polymorphism (%s) not accepted here\n",p->token);
123
+ return MTLERR_SN;
124
+ }
125
+ if (!newvars)
126
+ {
127
+ PRINTF(m)(LOG_RUNTIME,"Compiler : cannot accept linked variable %s here\n",p->token);
128
+ return MTLERR_SN;
129
+ }
130
+ if (k=createnodetype(TYPENAME_UNDEF)) return k;
131
+ return addlabel(labels,p->token,STACKGET(m,0),NIL);
132
+ }
133
+ else if ((p->token[0]=='r')&&(isdecimal(p->token+1)))
134
+ {
135
+ int i=mtl_atoi(p->token+1);
136
+ if ((i<0)||(i>=rec))
137
+ {
138
+ PRINTF(m)(LOG_RUNTIME,"Compiler : recursivity out of range %d [0 %d[\n",i,rec);
139
+ return MTLERR_SN;
140
+ }
141
+ if (k=createnodetype(TYPENAME_REC)) return k;
142
+ TABSET(m,VALTOPNT(STACKGET(m,0)),TYPEHEADER_LENGTH,INTTOVAL(i));
143
+ *rnode=1;
144
+ return 0;
145
+ }
146
+ else if (!strcmp(p->token,"tab"))
147
+ {
148
+ if (k=createnodetype(TYPENAME_TAB)) return k;
149
+ if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
150
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
151
+ STACKDROP(m);
152
+ return 0;
153
+ }
154
+ else if (!strcmp(p->token,"list"))
155
+ {
156
+ if (k=createnodetype(TYPENAME_LIST)) return k;
157
+ if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
158
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
159
+ STACKDROP(m);
160
+ return 0;
161
+ }
162
+ else if (!strcmp(p->token,"fun"))
163
+ {
164
+ if (k=createnodetype(TYPENAME_FUN)) return k;
165
+ int nblab;
166
+ if (newvars)
167
+ {
168
+ if (k=parsegraph(p,env,mono,rec+1,labels,1,rnode)) return k;
169
+ nblab=0;
170
+ }
171
+ else
172
+ {
173
+ nblab=nblabels(labels);
174
+ if (k=parsegraph(p,env,mono,rec+1,labels,1,rnode)) return k;
175
+ nblab=nblabels(labels)-nblab;
176
+ }
177
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
178
+ STACKDROP(m);
179
+ if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
180
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0));
181
+ STACKDROP(m);
182
+ removenlabels(labels,nblab);
183
+ return 0;
184
+ }
185
+ else if (!strcmp(p->token,"["))
186
+ {
187
+ n=0;
188
+ while(1)
189
+ {
190
+ if (!p->next(0))
191
+ {
192
+ PRINTF(m)(LOG_RUNTIME,"Compiler : uncomplete type reaches EOF\n");
193
+ return MTLERR_SN;
194
+ }
195
+ if (!strcmp(p->token,"]"))
196
+ {
197
+ return createnodetuple(n);
198
+ }
199
+ else
200
+ {
201
+ p->giveback();
202
+ if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
203
+ n++;
204
+ }
205
+ }
206
+ }
207
+ else if (islabel(p->token))
208
+ {
209
+ int* t=searchtype(env,p->token);
210
+ if (!t)
211
+ {
212
+ PRINTF(m)(LOG_RUNTIME,"Compiler : unknown type %s\n",p->token);
213
+ return MTLERR_SN;
214
+ }
215
+ int* q=VALTOPNT(TABGET(t,REF_TYPE));
216
+ int vargs=TABGET(q,TYPEHEADER_LENGTH);
217
+ if (vargs==NIL) return STACKPUSH(m,TABGET(t,REF_TYPE));
218
+ else
219
+ {
220
+ if (k=createnodetypecore(TABGET(q,TYPEHEADER_LENGTH+1))) return k;
221
+ int n=TABLEN(VALTOPNT(vargs));
222
+ int* t0=MALLOCCLEAR(m,TABLEN(VALTOPNT(vargs)));
223
+ if (!t0) return MTLERR_OM;
224
+ if (k=STACKPUSH(m,PNTTOVAL(t0))) return k;
225
+ if (!p->next(0))
226
+ {
227
+ PRINTF(m)(LOG_RUNTIME,"Compiler : '(' expected (found EOF)\n");
228
+ return MTLERR_SN;
229
+ }
230
+ if (strcmp(p->token,"("))
231
+ {
232
+ PRINTF(m)(LOG_RUNTIME,"Compiler : '(' expected (found '%s')\n",parser->token);
233
+ return MTLERR_SN;
234
+ }
235
+ int i;for(i=0;i<n;i++)
236
+ {
237
+ if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
238
+ TABSET(m,t0,i,STACKPULL(m));
239
+ }
240
+ if (!p->next(0))
241
+ {
242
+ PRINTF(m)(LOG_RUNTIME,"Compiler : ')' expected (found EOF)\n");
243
+ return MTLERR_SN;
244
+ }
245
+ if (strcmp(p->token,")"))
246
+ {
247
+ PRINTF(m)(LOG_RUNTIME,"Compiler : ')' expected (found '%s')\n",parser->token);
248
+ return MTLERR_SN;
249
+ }
250
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
251
+ STACKDROP(m);
252
+ }
253
+ }
254
+ else
255
+ {
256
+ PRINTF(m)(LOG_RUNTIME,"Compiler : unknown token %s\n",p->token);
257
+ return MTLERR_SN;
258
+ }
259
+ return 0;
260
+ }
261
+
262
+ // gestion des noeuds rec : on les lie avec le champ ACTUAL
263
+ int Compiler::parse_rnode(int *p)
264
+ {
265
+ int k,i;
266
+
267
+ int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
268
+ if ((c==TYPENAME_WEAK)||(c==TYPENAME_UNDEF)) return 0; // type faible ou non d�fini, pas de r�cursion
269
+ if ((c==TYPENAME_CORE)&&(TABGET(p,TYPEHEADER_LENGTH)==NIL)) return 0; // type de base, non param�trique
270
+
271
+ if (c==TYPENAME_REC)
272
+ {
273
+ TABSET(m,p,TYPEHEADER_ACTUAL,STACKGET(m,VALTOINT(TABGET(p,TYPEHEADER_LENGTH))));
274
+ return 0;
275
+ }
276
+ if (k=STACKPUSH(m,PNTTOVAL(p))) return k;
277
+
278
+ if (c==TYPENAME_CORE)
279
+ {
280
+ int* tup=VALTOPNT(TABGET(p,TYPEHEADER_LENGTH));
281
+ for(i=0;i<TABLEN(tup);i++) if (k=parse_rnode(VALTOPNT(TABGET(tup,i)))) return k;
282
+ }
283
+ else if (c==TYPENAME_FUN)
284
+ {
285
+ if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
286
+ if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
287
+ }
288
+ else if (c==TYPENAME_LIST)
289
+ {
290
+ if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
291
+ }
292
+ else if (c==TYPENAME_TAB)
293
+ {
294
+ if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
295
+ }
296
+ else if (c==TYPENAME_TUPLE)
297
+ {
298
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=parse_rnode(VALTOPNT(TABGET(p,i)))) return k;
299
+ }
300
+ STACKDROP(m);
301
+ return 0;
302
+ }
303
+
304
+ // cr�ation d'un graphe de type directement � partir d'un parser (utile pour les types �crits dans le code source)
305
+ int Compiler::creategraph(Parser* p,int env,int mono)
306
+ {
307
+ int k,labels;
308
+ int rnode=0;
309
+ if (k=STACKPUSH(m,NIL)) return k;
310
+ labels=STACKREF(m);
311
+ //k=parsegraph(p,env,mono,0,labels,0,&rnode);
312
+ if (k=parsegraph(p,env,mono,0,labels,0,&rnode)) return k;
313
+ STACKSET(m,1,STACKGET(m,0));
314
+ STACKDROP(m);
315
+ if (rnode) return parse_rnode(VALTOPNT(STACKGET(m,0)));
316
+ return 0;
317
+ }
318
+
319
+ // cr�ation d'un graphe de type directement � partir d'un parser (utile pour les types �crits dans le code source)
320
+ // avec une liste de labels pr�-existante
321
+ int Compiler::creategraph(Parser* p,int env,int mono,int labels)
322
+ {
323
+ int k;
324
+ int rnode=0;
325
+ if (k=parsegraph(p,env,mono,0,labels,0,&rnode)) return k;
326
+ if (rnode) return parse_rnode(VALTOPNT(STACKGET(m,0)));
327
+ return 0;
328
+ }
329
+
330
+
331
+ // cr�ation d'un graphe de type � partir d'une cha�ne
332
+ int Compiler::creategraph(const char* src,int env,int mono)
333
+ {
334
+ // PRINTF(m)(LOG_DEVCORE,"Compiler : creategraph : %s\n",src);
335
+
336
+ Parser* p=new Parser(m->term,src);
337
+ int k=creategraph(p,env,mono);
338
+ delete p;
339
+ return k;
340
+ }
341
+
342
+
343
+
344
+
345
+ int Compiler::recechograph(Prodbuffer *output,int* p,int rec,int labels)
346
+ {
347
+ int i,k;
348
+ p=actualtype(p);
349
+ if (k=STACKPUSH(m,PNTTOVAL(p))) return k;
350
+
351
+ for(i=0;i<rec;i++) if (STACKGET(m,0)==STACKGET(m,i+1))
352
+ {
353
+ STACKDROP(m);
354
+ output->printf("r%d",i);
355
+ return 0;
356
+ }
357
+ int v=VALTOINT(TABGET(p,TYPEHEADER_CODE));
358
+ if (v==TYPENAME_CORE)
359
+ {
360
+ output->printf("%s",STRSTART(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1))));
361
+ int vargs=TABGET(p,TYPEHEADER_LENGTH);
362
+ if (vargs!=NIL)
363
+ {
364
+ output->printf("(");
365
+ int* tup=VALTOPNT(vargs);
366
+ for(i=0;i<TABLEN(tup);i++)
367
+ {
368
+ if (i) output->printf(" ");
369
+ recechograph(output,VALTOPNT(TABGET(tup,i)),rec+1,labels);
370
+ }
371
+ output->printf(")");
372
+ }
373
+ }
374
+ else if (v==TYPENAME_FUN)
375
+ {
376
+ output->printf("fun ");
377
+ recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
378
+ output->printf(" ");
379
+ recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)),rec+1,labels);
380
+ }
381
+ else if (v==TYPENAME_LIST)
382
+ {
383
+ output->printf("list ");
384
+ recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
385
+ }
386
+ else if (v==TYPENAME_TAB)
387
+ {
388
+ output->printf("tab ");
389
+ recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
390
+ }
391
+ else if (v==TYPENAME_TUPLE)
392
+ {
393
+ output->printf("[");
394
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++)
395
+ {
396
+ if (i>TYPEHEADER_LENGTH) output->printf(" ");
397
+ recechograph(output,VALTOPNT(TABGET(p,i)),rec+1,labels);
398
+ }
399
+ output->printf("]");
400
+ }
401
+ else if (v==TYPENAME_UNDEF)
402
+ {
403
+ char* name;
404
+ if (!searchlabel_byval(labels,PNTTOVAL(p),&name))
405
+ output->printf("%s",name);
406
+ else
407
+ {
408
+ char buf[16];
409
+ sprintf(buf,"u%d",nblabels(labels));
410
+ addlabel(labels,buf,PNTTOVAL(p),NIL);
411
+ output->printf("%s",buf);
412
+ }
413
+ }
414
+ else if (v==TYPENAME_WEAK)
415
+ {
416
+ char* name;
417
+ if (!searchlabel_byval(labels,PNTTOVAL(p),&name))
418
+ output->printf("%s",name);
419
+ else
420
+ {
421
+ char buf[16];
422
+ sprintf(buf,"w%d",nblabels(labels));
423
+ addlabel(labels,buf,PNTTOVAL(p),NIL);
424
+ output->printf("%s",buf);
425
+ }
426
+ }
427
+ STACKDROP(m);
428
+ return 0;
429
+ }
430
+
431
+
432
+ int Compiler::echograph(Prodbuffer *output,int* p)
433
+ {
434
+ int k,labels;
435
+ if (k=STACKPUSH(m,NIL)) return k;
436
+ labels=STACKREF(m);
437
+ recechograph(output,p,0,labels);
438
+ STACKDROP(m);
439
+ return 0;
440
+ }
441
+
442
+
443
+ // copie de graphe
444
+ int Compiler::reccopytype(int *p)
445
+ {
446
+ int k,i;
447
+
448
+ p=actualtype(p);
449
+ int vq=TABGET(p,TYPEHEADER_COPY);
450
+ if (vq!=NIL) return STACKPUSH(m,vq); // �l�ment d�j� copi�
451
+ int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
452
+ if ((c==TYPENAME_CORE)&&(TABGET(p,TYPEHEADER_LENGTH)==NIL))
453
+ return STACKPUSH(m,PNTTOVAL(p)); // type basique, ne pas copier
454
+
455
+ if (c==TYPENAME_TUPLE)
456
+ {
457
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=STACKPUSH(m,NIL)) return k;
458
+ if (k=createnodetuple(TABLEN(p)-TYPEHEADER_LENGTH)) return k;
459
+ TABSET(m,p,TYPEHEADER_COPY,STACKGET(m,0)); // positionne le champ 'copy' de l'original
460
+ int* q=VALTOPNT(STACKGET(m,0));
461
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++)
462
+ {
463
+ if (k=reccopytype(VALTOPNT(TABGET(p,i)))) return k;
464
+ TABSET(m,q,i,STACKPULL(m));
465
+ }
466
+ return 0;
467
+ }
468
+
469
+ if (c==TYPENAME_WEAK) return STACKPUSH(m,PNTTOVAL(p)); // type faible, ne pas copier
470
+
471
+ if (c==TYPENAME_CORE) k=createnodetypecore(TABGET(p,TYPEHEADER_LENGTH+1));
472
+ else k=createnodetype(c);
473
+ if (k) return k; // copie le noeud
474
+ TABSET(m,p,TYPEHEADER_COPY,STACKGET(m,0)); // positionne le champ 'copy' de l'original
475
+
476
+ int* q=VALTOPNT(STACKGET(m,0));
477
+ if (c==TYPENAME_FUN)
478
+ {
479
+ if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
480
+ TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
481
+ if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
482
+ TABSET(m,q,TYPEHEADER_LENGTH+1,STACKPULL(m));
483
+ }
484
+ else if (c==TYPENAME_LIST)
485
+ {
486
+ if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
487
+ TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
488
+ }
489
+ else if (c==TYPENAME_TAB)
490
+ {
491
+ if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
492
+ TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
493
+ }
494
+ else if (c==TYPENAME_CORE)
495
+ {
496
+ int vargs=TABGET(p,TYPEHEADER_LENGTH);
497
+ if (vargs==NIL) return 0;
498
+ else
499
+ {
500
+ int* tup=VALTOPNT(vargs);
501
+ for(i=0;i<TABLEN(tup);i++) if (k=reccopytype(VALTOPNT(TABGET(tup,i)))) return k;
502
+ if (k=DEFTAB(m,TABLEN(tup))) return k;
503
+ TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
504
+ }
505
+ }
506
+ else if (c==TYPENAME_UNDEF)
507
+ {
508
+ }
509
+ return 0;
510
+ }
511
+
512
+ // remise � nil du champ 'copy' d'un graphe
513
+ int Compiler::recresetcopy(int *p)
514
+ {
515
+ int k,i;
516
+
517
+ p=actualtype(p);
518
+ int vq=TABGET(p,TYPEHEADER_COPY);
519
+ if (vq==NIL) return 0; // �l�ment d�j� reset�
520
+
521
+ TABSET(m,p,TYPEHEADER_COPY,NIL); // reset le champ 'copy'
522
+
523
+ int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
524
+ if (c==TYPENAME_WEAK) return 0; // type faible, pas de r�cursion
525
+ else if (c==TYPENAME_CORE)
526
+ {
527
+ int vargs=TABGET(p,TYPEHEADER_LENGTH);
528
+ if (vargs==NIL) return 0;
529
+ else
530
+ {
531
+ int* tup=VALTOPNT(vargs);
532
+ for(i=0;i<TABLEN(tup);i++) if (k=recresetcopy(VALTOPNT(TABGET(tup,i)))) return k;
533
+ }
534
+ }
535
+ else if (c==TYPENAME_FUN)
536
+ {
537
+ if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
538
+ if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
539
+ }
540
+ else if (c==TYPENAME_LIST)
541
+ {
542
+ if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
543
+ }
544
+ else if (c==TYPENAME_TAB)
545
+ {
546
+ if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
547
+ }
548
+ else if (c==TYPENAME_TUPLE)
549
+ {
550
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=recresetcopy(VALTOPNT(TABGET(p,i)))) return k;
551
+ }
552
+ else if (c==TYPENAME_UNDEF)
553
+ {
554
+ }
555
+ return 0;
556
+ }
557
+
558
+ int Compiler::copytype(int *p)
559
+ {
560
+ int k;
561
+ if (k=reccopytype(p)) return k;
562
+ if (k=recresetcopy(p)) return k;
563
+ return 0;
564
+ }
565
+
566
+
567
+ // passage des UNDEF en WEAK
568
+ int Compiler::recgoweak(int *p)
569
+ {
570
+ int k,i;
571
+
572
+ p=actualtype(p);
573
+ int vq=TABGET(p,TYPEHEADER_COPY);
574
+ if (vq!=NIL) return 0; // �l�ment d�j� trait�
575
+ int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
576
+ if (c==TYPENAME_WEAK) return 0; // type faible, ne pas traiter
577
+
578
+ TABSET(m,p,TYPEHEADER_COPY,INTTOVAL(1)); // positionne le champ 'copy' de l'original
579
+ if (c==TYPENAME_CORE)
580
+ {
581
+ int vargs=TABGET(p,TYPEHEADER_LENGTH);
582
+ if (vargs==NIL) return 0;
583
+ else
584
+ {
585
+ int* tup=VALTOPNT(vargs);
586
+ for(i=0;i<TABLEN(tup);i++) if (k=recgoweak(VALTOPNT(TABGET(tup,i)))) return k;
587
+ }
588
+ }
589
+ else if (c==TYPENAME_FUN)
590
+ {
591
+ if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
592
+ if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
593
+ }
594
+ else if (c==TYPENAME_LIST)
595
+ {
596
+ if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
597
+ }
598
+ else if (c==TYPENAME_TAB)
599
+ {
600
+ if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
601
+ }
602
+ else if (c==TYPENAME_TUPLE)
603
+ {
604
+ for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=recgoweak(VALTOPNT(TABGET(p,i)))) return k;
605
+ }
606
+ else if (c==TYPENAME_UNDEF)
607
+ {
608
+ TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_WEAK));
609
+ }
610
+ return 0;
611
+ }
612
+
613
+
614
+ // unification de graphe
615
+ int Compiler::restoreactual(int* t,int* s,int vt,int vs,int k)
616
+ {
617
+ TABSET(m,t,TYPEHEADER_ACTUAL,vt);
618
+ TABSET(m,s,TYPEHEADER_ACTUAL,vs);
619
+ return k;
620
+ }
621
+
622
+ int Compiler::recunif(int* s,int* t)
623
+ {
624
+ s=actualtype(s);
625
+ t=actualtype(t);
626
+ if (s==t) return 0; // ceci g�re le cas des types basiques
627
+
628
+ int ns=VALTOINT(TABGET(s,TYPEHEADER_CODE));
629
+ int nt=VALTOINT(TABGET(t,TYPEHEADER_CODE));
630
+ int ok=1;
631
+ if ((ns!=TYPENAME_UNDEF)&&(ns!=TYPENAME_WEAK)
632
+ &&(nt!=TYPENAME_UNDEF)&&(nt!=TYPENAME_WEAK) // si les deux noeuds bien d�finis ...
633
+ &&(ns!=nt) ) ok=0;
634
+ else if ((ns==nt)&&(ns==TYPENAME_CORE)&&(TABGET(s,TYPEHEADER_LENGTH+1)!=TABGET(t,TYPEHEADER_LENGTH+1))) ok=0;
635
+ if (!ok)
636
+ {
637
+ PRINTF(m)(LOG_COMPILER,"Compiler : ");
638
+ echonode(ns,s);
639
+ PRINTF(m)(LOG_COMPILER," cannot be unified with ");
640
+ echonode(nt,t);
641
+ PRINTF(m)(LOG_COMPILER,"\n");
642
+ return MTLERR_TYPE; // ... il doivent �tre du m�me type
643
+ }
644
+
645
+ int vt=TABGET(t,TYPEHEADER_ACTUAL); // on sauvegarde avant unification
646
+ int vs=TABGET(s,TYPEHEADER_ACTUAL);
647
+
648
+ if ((ns==TYPENAME_UNDEF) /* union des noeuds */
649
+ || ((ns==TYPENAME_WEAK)&&(nt!=TYPENAME_UNDEF)) )
650
+ {
651
+ TABSET(m,s,TYPEHEADER_ACTUAL,PNTTOVAL(t));
652
+ if (ns==TYPENAME_WEAK)
653
+ {
654
+ recgoweak(t);
655
+ recresetcopy(t);
656
+ }
657
+ }
658
+ else
659
+ {
660
+ TABSET(m,t,TYPEHEADER_ACTUAL,PNTTOVAL(s));
661
+ if (nt==TYPENAME_WEAK)
662
+ {
663
+ recgoweak(s);
664
+ recresetcopy(s);
665
+ }
666
+ }
667
+
668
+ if (ns==nt)
669
+ {
670
+ int k;
671
+ if ((ns==TYPENAME_TAB)||(ns==TYPENAME_LIST)||(ns==TYPENAME_FUN))
672
+ {
673
+ if (k=recunif(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH))))
674
+ return restoreactual(t,s,vt,vs,k);
675
+ if ((ns==TYPENAME_FUN)
676
+ &&(k=recunif(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH+1)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH+1)))) )
677
+ return restoreactual(t,s,vt,vs,k);
678
+ }
679
+ else if (ns==TYPENAME_TUPLE)
680
+ {
681
+ int len=TABLEN(s);
682
+ if (len!=TABLEN(t)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
683
+ int i; for(i=TYPEHEADER_LENGTH;i<len;i++)
684
+ if (k=recunif(VALTOPNT(TABGET(s,i)),VALTOPNT(TABGET(t,i))))
685
+ return restoreactual(t,s,vt,vs,k);
686
+ }
687
+ else if (ns==TYPENAME_CORE)
688
+ {
689
+ int vtups=TABGET(s,TYPEHEADER_LENGTH);
690
+ int vtupt=TABGET(t,TYPEHEADER_LENGTH);
691
+ if ((vtups==NIL)&&(vtupt==NIL)) return 0;
692
+ if ((vtups==NIL)||(vtupt==NIL)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
693
+ int* tups=VALTOPNT(vtups);
694
+ int* tupt=VALTOPNT(vtupt);
695
+ int len=TABLEN(tups);
696
+ if (len!=TABLEN(tupt)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
697
+ int i; for(i=0;i<len;i++)
698
+ if (k=recunif(VALTOPNT(TABGET(tups,i)),VALTOPNT(TABGET(tupt,i))))
699
+ return restoreactual(t,s,vt,vs,k);
700
+ }
701
+ }
702
+ return 0;
703
+ }
704
+
705
+ int Compiler::unif(int* x,int* y)
706
+ {
707
+ int l;
708
+
709
+ if (!(l=recunif(x,y))) return 0;
710
+
711
+ Prodbuffer* output=new Prodbuffer();
712
+
713
+ output->printf("Compiler :\n ");
714
+ echograph(output,x);
715
+ output->printf("\ndoes not match with\n ");
716
+ echograph(output,y);
717
+ output->printf("\n");
718
+
719
+ PRINTF(m)(LOG_COMPILER,"%s",output->getstart());
720
+ delete output;
721
+
722
+ return l;
723
+ }
724
+
725
+ // [fun [arg]]
726
+ int Compiler::unif_argfun()
727
+ {
728
+ int k;
729
+ int* fun=VALTOPNT(STACKPULL(m));
730
+ int* arg=VALTOPNT(STACKGET(m,0));
731
+
732
+ if (k=unif(VALTOPNT(TABGET(fun,TYPEHEADER_LENGTH)),arg)) return k;
733
+ STACKSET(m,0,TABGET(fun,TYPEHEADER_LENGTH+1));
734
+ return 0;
735
+ }
736
+
737
+ int* Compiler::argsfromfun(int *f)
738
+ {
739
+ return VALTOPNT(TABGET(f,TYPEHEADER_LENGTH));
740
+ }
741
+
742
+ void Compiler::echonode(int code,int* p)
743
+ {
744
+ if (code==TYPENAME_CORE) PRINTF(m)(LOG_COMPILER,"%s",STRSTART(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1))));
745
+ else if (code==TYPENAME_UNDEF) PRINTF(m)(LOG_COMPILER,"u*");
746
+ else if (code==TYPENAME_WEAK) PRINTF(m)(LOG_COMPILER,"w*");
747
+ else if (code==TYPENAME_TAB) PRINTF(m)(LOG_COMPILER,"tab");
748
+ else if (code==TYPENAME_LIST) PRINTF(m)(LOG_COMPILER,"list");
749
+ else if (code==TYPENAME_TUPLE) PRINTF(m)(LOG_COMPILER,"tuple");
750
+ else if (code==TYPENAME_FUN) PRINTF(m)(LOG_COMPILER,"fun");
751
+ }
752
+
753
+ // unification d'un plus grand vers un plus petit
754
+ // attention, OPsearch suppose que seul MTLERR_TYPE peut arriver
755
+ int Compiler::recunifbigger(int* s,int* t)
756
+ {
757
+ int* s0=s; // on retient le s initial
758
+ s=actualtype(s);
759
+ t=actualtype(t);
760
+ if (s==t) return 0; // ceci g�re le cas des types basiques
761
+
762
+ int ns=VALTOINT(TABGET(s,TYPEHEADER_CODE));
763
+ int nt=VALTOINT(TABGET(t,TYPEHEADER_CODE));
764
+ int ok=1;
765
+ if ((ns!=TYPENAME_UNDEF)&&(ns!=TYPENAME_WEAK)
766
+ &&(nt!=TYPENAME_UNDEF)&&(nt!=TYPENAME_WEAK) // si les deux noeuds bien d�finis ...
767
+ &&(ns!=nt) ) ok=0;
768
+ else if ((ns==nt)&&(ns==TYPENAME_CORE)&&(TABGET(s,TYPEHEADER_LENGTH+1)!=TABGET(t,TYPEHEADER_LENGTH+1))) ok=0;
769
+ if (!ok)
770
+ {
771
+ PRINTF(m)(LOG_COMPILER,"Compiler : ");
772
+ echonode(ns,s);
773
+ PRINTF(m)(LOG_COMPILER," cannot be unified with ");
774
+ echonode(nt,t);
775
+ PRINTF(m)(LOG_COMPILER,"\n");
776
+ return MTLERR_TYPE; // ... il doivent �tre du m�me type
777
+ }
778
+
779
+ int vt=TABGET(t,TYPEHEADER_ACTUAL); // on sauvegarde avant unification
780
+ int vs=TABGET(s,TYPEHEADER_ACTUAL);
781
+
782
+ if ((nt==TYPENAME_UNDEF)&&(ns!=TYPENAME_UNDEF))
783
+ {
784
+ PRINTF(m)(LOG_COMPILER,"Compiler : ");
785
+ echonode(ns,s);
786
+ PRINTF(m)(LOG_COMPILER," is smaller than ");
787
+ echonode(nt,t);
788
+ PRINTF(m)(LOG_COMPILER,"\n");
789
+ return MTLERR_TYPE;
790
+ }
791
+ if ((ns==TYPENAME_UNDEF)&&(s0!=s))
792
+ {
793
+ PRINTF(m)(LOG_COMPILER,"Compiler : u* already unified\n");
794
+ return MTLERR_TYPE;
795
+ }
796
+
797
+ if ((ns==TYPENAME_UNDEF) /* union des noeuds */
798
+ || ((ns==TYPENAME_WEAK)&&(nt!=TYPENAME_UNDEF)) )
799
+ {
800
+ TABSET(m,s,TYPEHEADER_ACTUAL,PNTTOVAL(t));
801
+ if (ns==TYPENAME_WEAK)
802
+ {
803
+ recgoweak(t);
804
+ recresetcopy(t);
805
+ }
806
+ }
807
+ else
808
+ {
809
+ TABSET(m,t,TYPEHEADER_ACTUAL,PNTTOVAL(s));
810
+ if (nt==TYPENAME_WEAK)
811
+ {
812
+ recgoweak(s);
813
+ recresetcopy(s);
814
+ }
815
+ }
816
+
817
+ if (ns==nt)
818
+ {
819
+ int k;
820
+ if ((ns==TYPENAME_TAB)||(ns==TYPENAME_LIST)||(ns==TYPENAME_FUN))
821
+ {
822
+ if (k=recunifbigger(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH))))
823
+ return restoreactual(t,s,vt,vs,k);
824
+ if ((ns==TYPENAME_FUN)
825
+ &&(k=recunifbigger(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH+1)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH+1)))) )
826
+ return restoreactual(t,s,vt,vs,k);
827
+ }
828
+ else if (ns==TYPENAME_TUPLE)
829
+ {
830
+ int len=TABLEN(s);
831
+ if (len!=TABLEN(t)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
832
+ int i; for(i=TYPEHEADER_LENGTH;i<len;i++)
833
+ if (k=recunifbigger(VALTOPNT(TABGET(s,i)),VALTOPNT(TABGET(t,i))))
834
+ return restoreactual(t,s,vt,vs,k);
835
+ }
836
+ else if (ns==TYPENAME_CORE)
837
+ {
838
+ int vtups=TABGET(s,TYPEHEADER_LENGTH);
839
+ int vtupt=TABGET(t,TYPEHEADER_LENGTH);
840
+ if ((vtups==NIL)&&(vtupt==NIL)) return 0;
841
+ if ((vtups==NIL)||(vtupt==NIL)) restoreactual(t,s,vt,vs,MTLERR_TYPE);
842
+ int* tups=VALTOPNT(vtups);
843
+ int* tupt=VALTOPNT(vtupt);
844
+ int len=TABLEN(tups);
845
+ if (len!=TABLEN(tupt)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
846
+ int i; for(i=0;i<len;i++)
847
+ if (k=recunifbigger(VALTOPNT(TABGET(tups,i)),VALTOPNT(TABGET(tupt,i))))
848
+ return restoreactual(t,s,vt,vs,k);
849
+ }
850
+ }
851
+ return 0;
852
+ }
853
+
854
+ int Compiler::unifbigger(int* x,int* y)
855
+ {
856
+ int l;
857
+
858
+ if (!(l=recunifbigger(x,y))) return 0;
859
+
860
+ Prodbuffer* output=new Prodbuffer();
861
+
862
+ output->printf("Compiler :\n ");
863
+ echograph(output,x);
864
+ output->printf("\ndoes not match with or is smaller than\n ");
865
+ echograph(output,y);
866
+ output->printf("\n");
867
+
868
+ PRINTF(m)(LOG_COMPILER,"%s",output->getstart());
869
+ delete output;
870
+
871
+ return l;
872
+ }