DEADSOFTWARE

Добавлены открытые массивы
[dsw-obn.git] / test.c
diff --git a/test.c b/test.c
index c3a4b1467f51256bbec89e210374cb69d90a44d8..6175148f461c4c0db1ff690997928e56f560544f 100644 (file)
--- a/test.c
+++ b/test.c
@@ -8,22 +8,37 @@ static char source_test[] =
        "(* Main module *)"
        "MODULE Test;"
        "IMPORT Out;"
+       "TYPE Ar = ARRAY OF ARRAY OF INTEGER;"
+       "VAR a : POINTER TO Ar;"
+       ""
+       "PROCEDURE Ax(VAR x : POINTER TO Ar);"
+       "BEGIN"
+       "  x[0, 0] := 777;"
+       "END Ax;"
+       ""
        "BEGIN;"
+       "  NEW(a, 2, 2);"
+       "  a[0, 0] := 666;"
        "  Out.Open;"
-       "  Out.Int(666, 0);"
+       "  Out.Int(a[0, 0], 0);"
        "  Out.Ln;"
+       ""
+       "  Ax(a);"
+//     "  Out.Int(a[0, 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 +74,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 +111,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;
 }