DEADSOFTWARE

03ac7fc3ab12979d8fcaadac8c5ccd244769f4bc
[dsw-obn.git] / src / test.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <assert.h>
5 #include "../include/oberon.h"
7 static char source_test[] =
8 "(* Main module *)"
9 "MODULE Test;"
10 "IMPORT Out;"
11 "CONST"
12 " null = 0X;"
13 " space = 020X;"
14 " bang = 021X;"
15 " h = 048X;"
16 " e = 045X;"
17 " l = 04CX;"
18 " o = 04FX;"
19 " w = 057X;"
20 " r = 052X;"
21 " d = 044X;"
22 ""
23 "TYPE"
24 " Ident = ARRAY 20 OF CHAR;"
25 ""
26 "VAR"
27 " hello : Ident;"
28 " cc : CHAR;"
29 ""
30 "BEGIN"
31 " hello[0] := h;"
32 " hello[1] := e;"
33 " hello[2] := l;"
34 " hello[3] := l;"
35 " hello[4] := o;"
36 " hello[5] := space;"
37 " hello[6] := w;"
38 " hello[7] := o;"
39 " hello[8] := r;"
40 " hello[9] := l;"
41 " hello[10] := d;"
42 " hello[11] := bang;"
43 " hello[12] := null;"
44 " Out.Open;"
45 " Out.String(hello);"
46 " Out.Ln;"
47 "END Test."
48 ;
50 // PROCEDURE Char* (ch : CHAR);
51 // PROCEDURE String* (str : ARRAY OF CHAR);
53 static char source_out[] =
54 "MODULE Out;"
55 " PROCEDURE Open*;"
56 " END Open;"
57 ""
58 " PROCEDURE Char* (ch : CHAR);"
59 " END Char;"
60 ""
61 " PROCEDURE String* (str : ARRAY OF CHAR);"
62 " END String;"
63 ""
64 " PROCEDURE Int*(i, n : LONGINT);"
65 " END Int;"
66 ""
67 " PROCEDURE Real*(x : REAL; n : INTEGER);"
68 " END Real;"
69 ""
70 " PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);"
71 " END LongReal;"
72 ""
73 " PROCEDURE Ln*;"
74 " END Ln;"
75 ""
76 "END Out."
77 ;
79 static oberon_context_t * ctx;
80 static oberon_module_t * mod;
82 static const char *
83 import_module(const char * name)
84 {
85 if(strcmp(name, "Test") == 0)
86 {
87 return source_test;
88 }
89 else if(strcmp(name, "Out") == 0)
90 {
91 return source_out;
92 }
93 else
94 {
95 return NULL;
96 }
97 }
99 typedef void (*TOutOpen)();
100 static TOutOpen * OutOpenPtr;
101 void ImplOutOpen()
105 typedef void (*TOutInt)(int, int);
106 static TOutInt * OutIntPtr;
107 void ImplOutInt(int i, int n)
109 char number[22];
110 snprintf(number, 22, "%d", i);
111 int len = strlen(number);
112 for(int i = 0; i < n - len; i++)
114 putchar(' ');
116 printf("%s", number);
119 typedef void (*TOutReal)(float, int);
120 static TOutReal * OutRealPtr;
121 void ImplOutReal(float i, int n)
123 char number[32];
124 snprintf(number, 32, "%F", i);
125 int len = strlen(number);
126 for(int i = 0; i < n - len; i++)
128 putchar(' ');
130 printf("%s", number);
133 typedef void (*TOutLn)();
134 static TOutLn * OutLnPtr;
135 void ImplOutLn()
137 putchar('\n');
140 void init_system_modules()
142 OutOpenPtr = oberon_generator_get_var(ctx, "Out_Open");
143 *OutOpenPtr = ImplOutOpen;
144 OutIntPtr = oberon_generator_get_var(ctx, "Out_Int");
145 *OutIntPtr = ImplOutInt;
146 OutRealPtr = oberon_generator_get_var(ctx, "Out_Real");
147 *OutRealPtr = ImplOutReal;
148 OutLnPtr = oberon_generator_get_var(ctx, "Out_Ln");
149 *OutLnPtr = ImplOutLn;
152 void start_module()
154 void (*begin)() = oberon_generator_get_procedure(ctx, "Test_BEGIN");
155 begin();
158 int
159 main(int argc, char ** argv)
161 ctx = oberon_create_context(import_module);
162 mod = oberon_compile_module(ctx, source_test);
164 oberon_generate_code(ctx);
166 // init_system_modules();
168 // oberon_generator_dump(ctx, "dump.txt");
170 // start_module();
172 oberon_destroy_context(ctx);
173 return 0;