diff --git a/src/test.c b/src/test.c
index bcc8e86c8fe1c3a607d1d235ef29bd3d92c62820..8029be718d08bc4823e6723657a66441b68fe651 100644 (file)
--- a/src/test.c
+++ b/src/test.c
#include <stdio.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "../include/oberon.h"
#include <string.h>
#include <assert.h>
#include "../include/oberon.h"
-static char source_test[] =
- "(* Main module *)"
- "MODULE Test;"
- "IMPORT Out;"
- ""
- "VAR"
- " i : INTEGER;"
- ""
- "BEGIN"
- " i := 4;"
- " Out.Open();"
- " IF i = 0 THEN"
- " Out.String('Branch 0'); Out.Ln;"
- " ELSIF i = 1 THEN"
- " Out.String('Branch 1'); Out.Ln;"
- " ELSIF i = 2 THEN"
- " Out.String('Branch 2'); Out.Ln;"
- " ELSE"
- " Out.String('Branch else'); Out.Ln;"
- " END;"
- " Out.String('end'); 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)
{
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)
{
}
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;
}
oberon_destroy_context(ctx);
return 0;
}