DEADSOFTWARE

Добавлена загрузка исходника из файла
[dsw-obn.git] / src / test.c
index ad95a34cf1f36fc78a7ed440cff0f1cbfccdd7ea..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;"
-       ""
-       "VAR i : INTEGER;"
-       ""
-       "PROCEDURE X(VAR x : INTEGER; y : INTEGER);"
-       "  VAR"
-       "    q, w, r : INTEGER;"
-       "  PROCEDURE Y;"
-       "    VAR levY : INTEGER;"
-       "  BEGIN"
-       "    x := 3345;"
-       "    q := 666;"
-       "  END Y;"
-       "BEGIN"
-       "  x := 54646;"
-       "  q := 1;"
-       "  Y;"
-       "  Out.String('Pos Y: q = '); Out.Int(q, 0); Out.Ln;"
-       "END X;"
-       ""
-       "BEGIN;"
-       "  i := 1;"
-       "  X(i, i);"
-       "  Out.Int(i, 0); Out.Ln;"
-       "END Test."
-;
-
-static char source_out[] =
-       "MODULE Out;"
-       "  PROCEDURE Open*;"
-       "  END Open;"
-       ""
-       "  PROCEDURE Char* (ch : CHAR);"
-       "  END Char;"
-       ""
-       "  PROCEDURE String* (str : ARRAY OF CHAR);"
-       "  END String;"
-       ""
-       "  PROCEDURE Int*(i, n : LONGINT);"
-       "  END Int;"
-       ""
-       "  PROCEDURE Real*(x : REAL; n : INTEGER);"
-       "  END Real;"
-       ""
-       "  PROCEDURE LongReal*(x : LONGREAL; n : INTEGER);"
-       "  END LongReal;"
-       ""
-       "  PROCEDURE Ln*;"
-       "  END Ln;"
-       ""
-       "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;
 }