DEADSOFTWARE

Добавлен тип REAL
[dsw-obn.git] / test.c
diff --git a/test.c b/test.c
index c3a4b1467f51256bbec89e210374cb69d90a44d8..1780bafa8ad900781c4af6e7f6b77868710a5119 100644 (file)
--- a/test.c
+++ b/test.c
@@ -8,22 +8,43 @@ static char source_test[] =
        "(* Main module *)"
        "MODULE Test;"
        "IMPORT Out;"
+       "CONST"
+       "  real = 0.1E3;"
+       ""
+       "VAR"
+       "  nx- : INTEGER;"
+       "  p : POINTER TO ARRAY 3 OF RECORD i, j, k : INTEGER END;"
+       "  q : POINTER TO RECORD x, y, z : INTEGER END;"
+       ""
+       "PROCEDURE ChParam(VAR i : INTEGER);"
+       "BEGIN"
+       "  i := 1234;"
+       "END ChParam;"
+       ""
        "BEGIN;"
+       "  NEW(p);"
+       "  p[2].k := 1;"
+       "  NEW(q);"
+       "  "
        "  Out.Open;"
-       "  Out.Int(666, 0);"
+       "  ChParam(nx);"
+       "  Out.Int(nx, 0);"
+       "  Out.Ln;"
+       "  Out.Real(real / 3.0, 0);"
        "  Out.Ln;"
        "END Test."
 ;
 
 static char source_out[] =
        "MODULE Out;"
+       "(* Interface to outer program ;) *)"
        "VAR"
        "  Open-     : PROCEDURE;"
 //     "  Char-     : PROCEDURE(ch : CHAR);"
 //     "  String-   : PROCEDURE(str : ARRAY OF CHAR)"
 //     "  Int-      : PROCEDURE(i, n : LONGINT);"
        "  Int-      : PROCEDURE(i, n : INTEGER);"
-//     "  Real-     : PROCEDURE(x : REAL; n : INTEGER);"
+       "  Real-     : PROCEDURE(x : REAL; n : INTEGER);"
 //     "  LongReal- : PROCEDURE(x : LONGREAL; n : INTEGER);"
        "  Ln-       : PROCEDURE;"
        "END Out."
@@ -59,14 +80,35 @@ typedef void (*TOutInt)(int, int);
 static TOutInt * OutIntPtr;
 void ImplOutInt(int i, int n)
 {
-       printf("%i", i);
+       char number[22];
+       snprintf(number, 22, "%d", i);
+       int len = strlen(number);
+       for(int i = 0; i < n - len; i++)
+       {
+               putchar(' ');
+       }
+       printf("%s", number);
+}
+
+typedef void (*TOutReal)(float, int);
+static TOutReal * OutRealPtr;
+void ImplOutReal(float i, int n)
+{
+       char number[32];
+       snprintf(number, 32, "%F", i);
+       int len = strlen(number);
+       for(int i = 0; i < n - len; i++)
+       {
+               putchar(' ');
+       }
+       printf("%s", number);
 }
 
 typedef void (*TOutLn)();
 static TOutLn * OutLnPtr;
 void ImplOutLn()
 {
-       printf("\n");
+       putchar('\n');
 }
 
 void init_system_modules()
@@ -75,6 +117,8 @@ void init_system_modules()
        *OutOpenPtr = ImplOutOpen;
        OutIntPtr = oberon_generator_get_var(ctx, "Out_Int");
        *OutIntPtr = ImplOutInt;
+       OutRealPtr = oberon_generator_get_var(ctx, "Out_Real");
+       *OutRealPtr = ImplOutReal;
        OutLnPtr = oberon_generator_get_var(ctx, "Out_Ln");
        *OutLnPtr = ImplOutLn;
 }