DEADSOFTWARE

Добавлено вычисление размеров типа для аллокации
[dsw-obn.git] / test.c
1 #include "oberon.h"
2 #include "generator.h"
4 #include <string.h>
5 #include <assert.h>
7 static char source_test[] =
8 "(* Main module *)"
9 "MODULE Test;"
10 "IMPORT Out;"
11 ""
12 "VAR"
13 " nx- : INTEGER;"
14 " p : POINTER TO ARRAY 3 OF RECORD i, j, k : INTEGER END;"
15 " q : POINTER TO RECORD x, y, z : INTEGER END;"
16 ""
17 "PROCEDURE ChParam(VAR i : INTEGER);"
18 "BEGIN"
19 " i := 1234;"
20 "END ChParam;"
21 ""
22 "BEGIN;"
23 " NEW(p);"
24 " p[2].k := 1;"
25 " NEW(q);"
26 " "
27 " Out.Open;"
28 " ChParam(nx);"
29 " Out.Int(nx, 0);"
30 " Out.Ln;"
31 "END Test."
32 ;
34 static char source_out[] =
35 "MODULE Out;"
36 "(* Interface to outer program ;) *)"
37 "VAR"
38 " Open- : PROCEDURE;"
39 // " Char- : PROCEDURE(ch : CHAR);"
40 // " String- : PROCEDURE(str : ARRAY OF CHAR)"
41 // " Int- : PROCEDURE(i, n : LONGINT);"
42 " Int- : PROCEDURE(i, n : INTEGER);"
43 // " Real- : PROCEDURE(x : REAL; n : INTEGER);"
44 // " LongReal- : PROCEDURE(x : LONGREAL; n : INTEGER);"
45 " Ln- : PROCEDURE;"
46 "END Out."
47 ;
49 static oberon_context_t * ctx;
50 static oberon_module_t * mod;
52 static const char *
53 import_module(const char * name)
54 {
55 if(strcmp(name, "Test") == 0)
56 {
57 return source_test;
58 }
59 else if(strcmp(name, "Out") == 0)
60 {
61 return source_out;
62 }
63 else
64 {
65 return NULL;
66 }
67 }
69 typedef void (*TOutOpen)();
70 static TOutOpen * OutOpenPtr;
71 void ImplOutOpen()
72 {
73 }
75 typedef void (*TOutInt)(int, int);
76 static TOutInt * OutIntPtr;
77 void ImplOutInt(int i, int n)
78 {
79 char number[22];
80 snprintf(number, 22, "%i", i);
81 int len = strlen(number);
82 for(int i = 0; i < n - len; i++)
83 {
84 putchar(' ');
85 }
86 printf("%s", number);
87 }
89 typedef void (*TOutLn)();
90 static TOutLn * OutLnPtr;
91 void ImplOutLn()
92 {
93 putchar('\n');
94 }
96 void init_system_modules()
97 {
98 OutOpenPtr = oberon_generator_get_var(ctx, "Out_Open");
99 *OutOpenPtr = ImplOutOpen;
100 OutIntPtr = oberon_generator_get_var(ctx, "Out_Int");
101 *OutIntPtr = ImplOutInt;
102 OutLnPtr = oberon_generator_get_var(ctx, "Out_Ln");
103 *OutLnPtr = ImplOutLn;
106 void start_module()
108 void (*begin)() = oberon_generator_get_procedure(ctx, "Test_BEGIN");
109 begin();
112 int
113 main(int argc, char ** argv)
115 ctx = oberon_create_context(import_module);
116 mod = oberon_compile_module(ctx, source_test);
118 oberon_generate_code(ctx);
120 init_system_modules();
122 oberon_generator_dump(ctx, "dump.txt");
124 start_module();
126 oberon_destroy_context(ctx);
127 return 0;