DEADSOFTWARE

Добавлена загрузка исходника из файла
[dsw-obn.git] / src / test.c
index 1c3c8e39347533eb9db1d0b2e289f0348f77b693..8029be718d08bc4823e6723657a66441b68fe651 100644 (file)
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 
 #include "../include/oberon.h"
 
-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(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);"
-//     "  LongReal- : PROCEDURE(x : LONGREAL; n : INTEGER);"
-       "  Ln-       : PROCEDURE;"
-       "END Out."
-;
-
 static oberon_context_t * ctx;
 static oberon_module_t * mod;
 
 static const char *
 import_module(const char * name)
 {
-       if(strcmp(name, "Test") == 0)
-       {
-               return source_test;
-       }
-       else if(strcmp(name, "Out") == 0)
-       {
-               return source_out;
-       }
-       else
-       {
-               return NULL;
-       }
-}
-
-typedef void (*TOutOpen)();
-static TOutOpen * OutOpenPtr;
-void ImplOutOpen()
-{
-}
+       assert(name);
 
-typedef void (*TOutInt)(int, int);
-static TOutInt * OutIntPtr;
-void ImplOutInt(int i, int n)
-{
-       char number[22];
-       snprintf(number, 22, "%d", i);
-       int len = strlen(number);
-       for(int i = 0; i < n - len; i++)
+       FILE * fp;
+       char fname[256];
+       snprintf(fname, 256, "%s.obn", name);
+       fp = fopen(fname, "r");
+       if(fp == NULL)
        {
-               putchar(' ');
+               printf("can't open file %s\n", fname);
+               exit(1);
+               return NULL;
        }
-       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);
-}
+       char * source;
+       size_t len;
 
-typedef void (*TOutLn)();
-static TOutLn * OutLnPtr;
-void ImplOutLn()
-{
-       putchar('\n');
-}
+       fseek(fp, 0, SEEK_END);
+       len = ftell(fp);
+       fseek(fp, 0, SEEK_SET);
 
-void init_system_modules()
-{
-       OutOpenPtr = oberon_generator_get_var(ctx, "Out_Open");
-       *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;
-}
+       source = calloc(1, len + 1);
+       fread(source, len, 1, fp);
 
-void start_module()
-{
-       void (*begin)() = oberon_generator_get_procedure(ctx, "Test_BEGIN");
-       begin();
+       return source;
 }
 
 int
 main(int argc, char ** argv)
 {
-       ctx = oberon_create_context(import_module);
-       mod = oberon_compile_module(ctx, source_test);
-
-       oberon_generate_code(ctx);
+       const char * code;
 
-       init_system_modules();
+       if(argc != 2)
+       {
+               printf("use: %s <source>\n", argv[0]);
+               return 1;
+       }
 
-       oberon_generator_dump(ctx, "dump.txt");
+       code = import_module(argv[1]);
 
-       start_module();
+       ctx = oberon_create_context(import_module);
+       mod = oberon_compile_module(ctx, code);
 
+       oberon_generate_code(ctx);
        oberon_destroy_context(ctx);
        return 0;
 }